Jak jsem sliboval minule, nejprve dodělejme převod souborů. Aby to nebylo zas tak jednoduché, aby program vypadal lépe, aby toho uživatel více viděl a také abychom si zas trochu procvičili získané znalosti, zobrazme uživateli prováděné akce v novém informačním okně spolu s pruhem znázorňujícím postup aplikace při převodu souborů.
Následující text zapisujte do metody prováděné po kliknutí na tlačítko Převést!. Tzn. do minule připraveného volání:
button.signal_connect("clicked") { if check_before then # požadované akce po kliknutí na tlačítko end }
Hotový finální soubor si můžete opět stáhnout. 3.rb
Nejprve vytvořme zobrazované okno
status_window = Gtk::Window.new # pruh znázorňující průběh převodu progress_bar = Gtk::ProgressBar.new vbox = Gtk::VBox.new(false,5) status_button = Gtk::Button.new("Pokračovat") # tlačítko Pokračovat není před dokončením operací aktivní status_button.sensitive = false vbox.pack_start_defaults(progress_bar) vbox.pack_start_defaults(status_button) status_button.signal_connect("clicked") { status_window.destroy } status_window.add(vbox) status_window.set_title "Převádím" status_window.set_default_size(400,40) status_window.show_all # aktualizace okna window_refresh
V podstatě standardní sada příkazů, která se postará o zobrazení nového okna. Navíc použijeme komponentu Gtk::ProgressBar pro pěkný přehled o aktuálním stavu převodu souborů. Kromě toho se odvolávám na metodu window_refresh, kterou je třeba ještě definovat.
def window_refresh while (Gtk.events_pending?) Gtk.main_iteration end end
Metoda se stará o překreslení zobrazeného okna. Pokud byste toto překreslování v průběhu následující smyčky neprováděli, může se požitá komponenta zachovat poněkud líně a změnu informačního textu jednoduše nezobrazí. Podívejme se nyní na druhou a zároveň poslední část volané metody:
# vytvoření seznamu grafických souborů *.jpg files = `cd \"#{@sdirectory.text}\";ls *.jpg` # spočítání převáděných souborů pro potřeby pruhu s pokrokem number_of_files = `cd \"#{@sdirectory.text}\";ls *.jpg | wc -l` i=1 files.each do |file| progress_bar.text = "Převádím soubor: #{file.chomp}" # posun pokroku progress_bar.fraction=(i/number_of_files.to_f) i+=1 # nucené překreslení okna window_refresh file = file.chomp # jádro programu, volání příkazu convert system("cd \"#{@sdirectory.text}\"; convert -scale #{@width.text}x#{@height.text} \"#{@sdirectory.text}/#{file}\" \"#{@ddirectory.text}/#{file}\"") end # změna informačního textu progress_bar.text = "Hotovo!" # aktivace tlačítka Pokračovat pro zavření okna status_button.sensitive = true
To je vše, tím byla záhada programu odtajněna. Všimněte si, že na proměnné se můžete odkazovat v textovém řetězci pomocí symbolu #{jméno_proměnné}, což se jistě hodí v případě volání metody system pro provedení příkazu systému a v dalších situacích.
Okno zobrazované při převodu souborů
Na závěr našeho miniseriálu se ještě podívejme na lokalizaci programu. K tomu se používá knihovna GetText. Abychom si to rovnou vyzkoušeli, přidejte na začátek programu řádek:
include GetText
A v místě, kde chcete uživateli vypsat nějaký text (ať už na nějaký widget nebo do terminálu), použijte místo běžného:
sbutton = Gtk::Button.new("Zdrojový adresář")
sbutton = Gtk::Button.new(_("Zdrojový adresář"))
Tím se sice na první pohled nic nestane, ale nyní budete moci použít nástroj rgettext, který za vás vytvoří soubor .pot, s kterým si už každý překladatel bude vědět rady.
Zadáním příkazu rgettext 3.rb -o program.pot
dojde k vytvoření souboru program.pot, který mimo standardní hlavičky obsahuje i řádky jako:
#: 3.rb:113 msgid "Zdrojový adresář" msgstr ""
Tedy původní text (msgid) a místo pro napsání lokalizované verze (msgstr). Samozřejmě pokud budete chtít svoji aplikaci tímto způsobem lokalizovat i do jiných jazyků, pak je nepsaným pravidlem, že se šablona (soubor .pot) dodává v anglické verzi a je na ostatních překladatelích, aby tuto šablonu lokalizovali do svého jazyka.
Lokalizovaný soubor pak je nutno ještě přeložit a nakopírovat na to správné místo v systému. To je možno provést pomocí tohoto příkazu:
rmsgfmt cs.po -o /usr/local/share/locale/cs/LC_MESSAGES/program.mo
Do češtiny přeložený soubor se standardně pojmenovává jako cs.po (cs je přitom označení češtiny) a jméno souboru program.mo v LC_MESSAGES musí odpovídat názvu spustitelného souboru programu v systému. Pokud vás lokalizace programu zaujala, určitě se podívejte na Ruby GetText HOWTO odkazované na konci tohoto článku.
V tom nejlepším přestat. To je přesně to, co nyní provedu. Zbytek je na vás. Pokud vás programování v Ruby zaujalo a programování pro grafické prostředí se vám líbí, pak není co řešit a nezbývá než popřát spoustu dobrých nápadů i programů, které pomocí těchto nástrojů můžete vytvořit. Možností, jak se uplatnit, je mnoho a stále chybí ty dobré aplikace, o kterých si lidé povídají a které v systému prostě musíte mít. Pokud vám tedy něco chybí, zkuste situaci napravit a vytvořte si program sami. Přeji mnoho příjemných zážitků při hledání správného postupu a vylepšování toho jinak mrtvého stroje, jakým počítač bez programů je.