Linux E X P R E S

Facebook

Grafické komponenty v Ruby - Dokončení a lokalizace

GTK.jpg

Dnes dokončíme naše programování a také se podíváme, jak by se prováděla lokalizace programu do dalších jazyků. Co říct víc? Snad jen: Pusťme se do toho.


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ů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.

Diskuze (0) Nahoru