Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: PO a MO soubory  (Přečteno 1867 krát)

Kedrigern

PO a MO soubory
« kdy: 11 Srpna 2011, 01:16:56 »
Snažím se psát přeložitelnou aplikaci v Monu (což je ale asi jedno), řídil jsem se návodem zde: http://www.mono-project.com/Internationalization

Shrnu to:
1) Ze zdrojáku vytahám stringy:
Kód: [Vybrat]
$ xgettext -a --from-code=UTF-8 <program>.cs -o <program>.po2) V POeditoru (či čemkoliv jiném) si je přeložím, doplním kodování etc.
3) Pomocí:
Kód: [Vybrat]
msgfmt <program>.po -o locale/cs/LC_MESSAGES/<program>.mo vytvořím MO soubor.

Pokud se shoduje cesta a to, co jsem v případě Mona inicializoval jako:
Kód: [Vybrat]
Mono.Unix.Catalog.Init("i18n","./locale");, tak se aplikace chová správně (dle prostředí).

Nějak z toho moc nechápu:
Jak aplikace pozná, který MO soubor chce - mohu jich vytvořit více? Více s duplujícím se obsahem?

Předpokládám, že v případě deb balíku bych měl českou lokalizaci ukládat do:
Kód: [Vybrat]
/usr/share/locale-langpack/cs/LC_MESSAGES/Když se koukám do tohoto adresáře, tak tam aplikace mají MO soubory dle názvu aplikace.

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: PO a MO soubory
« Odpověď #1 kdy: 11 Srpna 2011, 14:48:57 »
V tom shrnutí jsi nezmínil, jakým způsobem definuješ řetězce pro překladový katalog. Je jasné, že není potřeba překládat všechny řeťězce a ty které přeložené býti mají, se obalí "funkcí", která je pak za běhu nahrazuje překladem z katalogu:
Kód: [Vybrat]
Console.WriteLine("My name is" + " Enzo");->
Kód: [Vybrat]
Console.WriteLine(Catalog.GetString("My name is {0}"), "Enzo");Jméno a umístění katalogu, se určí předem:
Kód: [Vybrat]
Catalog.Init("i18n","./locale");xgettext pak umí vytahat tyto řetězce do vlastního katalogu, který je možné třeba v Poeditu přeložit. Poedit vlastně umí všechno, co je třeba se základním .po souborem udělat, včetně exportu do *.mo.
Katalog s překladem se v zadaném adresáři hledá podle systémové proměnné $LANGUAGE, resp. $LANG, tedy hledá se příslušný adresář pro daný jazyk, když se nenajde dostaneš chybu a překlad se nenačte, např.:
Kód: [Vybrat]
(process:26268): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.

Překlady aplikací se běžně dávají do /usr/share/locale/..., do locale-langpack se strkají lokalizace systému, tedy výchozích aplikací prostředí.

Nejsem na překlady expert, ještě mám co studovat, ale tohle jsem vypozoroval při používání v Pythonu :)
« Poslední změna: 11 Srpna 2011, 14:54:17 od GdH »

Kedrigern

Re: PO a MO soubory
« Odpověď #2 kdy: 11 Srpna 2011, 16:01:53 »
Používám samozřejmě
Kód: [Vybrat]
Catalog.GetString("")
Překlad mi i funguje korektně. Akorát nikde nevidím definici toho, který PO soubor, později MO je k čemu.

V jednoduchém příkladě totiž mám:
Kód: [Vybrat]
source.cs
binary.exe
preklad-cs.po
preklad-cs.mo

Jasně chápu, že nastavím nějakou složku - třeba: /usr/share/locale/, ale v té je n souborů.mo. Jak se (Mono.Unix.Catalog pozná) tam pozná ten správný? Porovnává se název běžící aplikace s názvem mo či co?

Empiricky zjišťuji, že ano. Jelikož:
1) spustím mc a je v cs
2) přejmenuji /usr/share/locale/cs/LC_MESSAGES/mc.mo
3) spustím mc a je v en
4) po opětovném přejmenování na spravné je v cs

Čili v případě klasických jazyků musí mít mo soubor název: argv[0].mo, v případě C# asi: System.AppDomain.CurrentDomain.FriendlyName

PS: Omlouvám se za zmatky. Včéra večer už jsem z toho byl zmatený. A teď bych se rád trochu podělil, aby mě někdo zastavil, kdybych psal blbosti. Navíc by se to někomu mohlo hodit.

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: PO a MO soubory
« Odpověď #3 kdy: 11 Srpna 2011, 16:54:00 »
Předpokládal bych, že jméno, které se bude hledat je dáno tímto:
Kód: [Vybrat]
Catalog.Init("i18n","./locale");Mono neznám vůbec, ale měl by hledat i18n.mo, jak vyplývá z odkazovaného příkladu.

V Pythonu to udělám takto:
Kód: [Vybrat]
gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)
Hledat se bude soubor daný proměnnou APP s příponou .mo v adresáři DIR, kde může, ale nemusí, být více jazykových mutací.

P.S. V příkladu Pythonu je jméno lokalizačního souboru definováno až v gettext.textdomain() a nemusí být stejné jako gettext.bindtextdomain(). To jen pro pořádek, víc už tomu nerozumím, zatím jsem u základního použití, které pokryje mé aktuální potřeby :)
« Poslední změna: 11 Srpna 2011, 17:02:11 od GdH »

Kedrigern

Re: PO a MO soubory
« Odpověď #4 kdy: 11 Srpna 2011, 17:00:44 »
Předpokládal bych, že jméno, které se bude hledat je dáno tímto:
Kód: [Vybrat]
Catalog.Init("i18n","./locale");Mono neznám vůbec, ale měl by hledat i18n.mo, jak vyplývá z odkazovaného příkladu.

V Pythonu to udělám takto:
Kód: [Vybrat]
gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)
Hledat se bude soubor daný proměnnou APP s příponou .mo v adresáři DIR, kde může, ale nemusí, být více jazykových mutací.
Ach jasně! Omlouvám se za svou úplnou nepozornost.

Zmátlo mě to. Měl jsem dojem, že to "i18n" je název metody překladů.

 

Provoz zaštiťuje spolek OpenAlt.