Internaciigo de komputilaj programoj/Pli alt-nivelaj problemoj
Pli alt-nivelaj problemoj
editPor la prezentado de unu sola lingvo la ekzisto de taŭga signaro estas la plej grava afero. Sed nia temo ja estas la internaciigo, la eblo, ke programo funkciu en pluraj lingvoj. Por tio necesas pli ol signaroj por la unuopaj lingvoj: ni vidis, ke oni bezonas eblon ŝalti inter diversaj signaroj, aŭ signaron, kiu taŭgas por pluraj, multaj aŭ ĉiuj lingvoj. Ni vidis, ke Unikodo solvis tiun problemon.
Sed ankaŭ super la nivelo de signoj ekzistas strukturaj ecoj, kiuj malsamas en diversaj lingvoj. Se tiaj ecoj estas fiksitaj en programo, ili malhelpas la internaciigon de la programo. Tial programistoj devas scii pri tiuj ecoj por eviti ilian fiksadon en programoj.
Estas neadekvate postuli, ke programistoj havu profundan lingvistan scion. Prefere ili sciu, kion necesas eviti en programado, por havi internaciigitan aŭ facile internaciigeblan programon.
Vort-ordo en frazo
editLa ordo de la vortoj en frazo aŭ sintagmo gravas en ĉiuj lingvoj, en kelkaj pli, en aliaj malpli. Krome la ebla(j) vortordo(j) estas malsamaj en malsamaj lingvoj.
Kiam oni internaciigas kompletajn frazojn, ekzemple mesaĝojn al uzanto, la problemon de la vortordo devas solvi la tradukanto de la teksto, dum la lokecigo. Sed okazas, ke tiaj mesaĝoj havas variajn partojn, tiel nomatajn parametrojn. Por tiaj parametroj ekzistas du tradiciaj teknikoj: La uzo de anstataŭaĵo (lokotenaĵo) kaj la disdivido de la frazo.
Unuavide la divido ŝajnas pli simpla: Kiam meze de iu eligota frazo aperis varia elemento, oni eligis unue la unuan parton, poste la varian parton, poste la duan. La du partoj estas aparte tradukeblaj (kompreneble la tradukanto devas koni ambaŭ partojn kaj scii, ke ili apartenas al unu sama frazo):
Sur la disko restas | 17 | GB da libera spaco. |
Oni vidas, ke tiu tekniko kondukas al iom strangaj "tradukoj"; tute ne eblas traduki la partojn aparte, sed nur kadre de la tuta frazo. Pli moderna tekniko uzas unu frazo-skemon kun anstataŭaĵo (%s) en la mezo:
Sur la disko restas %s GB da libera spaco. | 17 |
La tekniko principe funkcias ankaŭ kun pluraj parametroj, se la vortordo restas la sama en la uzataj lingvoj:
Sur disko %s restas %s GB da libera spaco. | /dev/hd4 | 17 |
Sed se la vortordo varias, ambaŭ teknikoj fiaskas. Ni konsideru la okazon de la angla lingvo, kiu ofte metas epitetan substantivon antaŭ determinatan substantivon, kie multaj aliaj eŭropaj lingvoj faras inverse. Tion montras jena ekzempla frazo, kiu enhavas tri variajn elementojn:
- artikolo
- speco de komputila flank-aparato (printilo, ekrano, klavaro, muso, skanilo, kamerao, ...)
- nomo (tipo) de tiu flankaparato
eo: | Informoj pri | la | presilo | AGFA P 400 | 1 2 3 |
---|---|---|---|---|---|
de: | Information über | den | Drucker | AGFA P 400 | 1 2 3 |
en: | Information on | the | AGFA P 400 | printer | 1 3 2 |
ro: | informaţie despre | imprimanta | AGFA P 400 | (21) 3 | |
eo: | la | ekrano | Tektronix 4004 | ||
de: | den | Bildschirm | Tektronix 4004 | ||
en: | the | Tektronix 4004 | screen | ||
ro: | ecranul | Tektronix 4004 |
La ekzempla frazo montras, ke la tri variaj elementoj aperas en malsama ordo: La angla metas la tipon antaŭ la speco, la germana kaj la internacia inverse. Tial ne eblas la uzo de du egalaj anstataŭaĵoj.
La kutima solvo estas numeri la anstataŭaĵojn, kiel montras jena ekzemplo, en kiu la angla skemo uzas la vicordon 1-3-2:
Informoj pri %1$s %2$s %3$s | la | presilo | AGFA P 400 | |||
Informationen über %1$s %2$s %3$s | den | Drucker | ||||
Information on %1$s %3$s %2$s | the | printer | ||||
Informaţie despre %3$s%1$s %2$s | a | imprimant- |
Kvankam en la angla kaj esperanta tekstoj oni povus aldoni la artikolon ("la", "the") al la frazo-skemo, la germana ekzemplo montras, ke tio ne ĝenerale eblas, ĉar en la germana lingvo la artikolo dependas de la substantivo (de ties genro). Necesas do stori la artikolon kune kun la vorto, aŭ iel "kalkuli" ĝin el la genro.
La ekzemplo de la rumana lingvo montras, ke artikolo ne ĉiam estas antaŭ la substantivo, sed povas modifi ties finaĵon. Tiun problemon ne solvas la tekniko de anstataŭaĵoj.
Por la montritaj lingvoj la problemo estas solvebla per du-ŝtupa anstataŭado: La baza teksto enhavas nur unu anstataŭaĵon, por la "specoj de aparatoj". La tekstoj por tiu anstataŭaĵo enhavas siavice alian anstataŭaĵon, por la "nomo". Necesas do du-faza anstataŭigo.
eo | Informoj pri %s | la presilo %s | AGFA P 400 |
---|---|---|---|
de | Information über %s | den Drucker %s | AGFA P 400 |
en | Information on %s | the %s printer | AGFA P 400 |
ro | Informaţie despre %s | imprimanta %s | AGFA P 400 |
Unua anstataŭigo | Informoj pri la presilo %s | Information über den Drucker %s |
---|---|---|
Dua anstataŭigo | Informoj pri la presilo AGFA P 400 | Information über den Drucker AGFA P 400 |
Kiu estas la esenca diferenco al la antaŭa tekniko? Tie ĉi la fraz-parto (en la dua kolumno de la tabelo), kiu (en tiuj kvar lingvoj) havas malsaman vort-ordon, estas komplete, nedisigite en la teksto-listo, do bone tradukebla. La du-faza anstataŭigo solvas la problemon por la lingvoj angla, germana kaj rumana, sed ĉar la solvo troviĝas en la programo kaj ne en internaciiga kadraĵo, ne estas garantio, ke ĝi funkcias por aliaj lingvoj.
Singularo kaj pluralo
editKiam nombreblan substantivon kvalifikas varia nombro, ekestas la problemo, en kiu formo aperu la substantivo. Ekzemple en Esperanto ĝi povas esti singulara (-o) aŭ plurala (-oj). En tabeloj eklas enkrampigi la "j" ("peco(j)"), sed en kompleta frazo tio aspektas malbele. Pli bele estas distingi inter "unu" kaj "alia kvanto" kaj ĝuste meti singularon aŭ pluralon. Kompreneble necesas traduki ambaŭ formojn al aliaj lingvoj.
Tiu distingo inter singularo kaj pluralo estas subtenata de kelkaj program-pakaĵoj, ekzemple la klaso KLocale el la kadraĵo Qt de firmao "Trolltech", kiu enhavas jenan metodon:
QString KLocale::translate(singularo, pluralo, nombro);
Tiu metodo, kiu havas la iom bombastan nomon "traduku", prenas singularan esprimon (povas esti tuta frazo), ties pluralan version kaj nombron. La pluralo devas enhavi la anstataŭaĵon "%d", kies lokon prenas la nombro.
Ni nun pere de tiu metodo metu la esprimon "unu botelo pendas ĉe la mur'" en la nombrojn 1 ĝis 5:
singularo: | "unu botelo pendas ĉe la mur'" | "Ein großes Vorbild" |
---|---|---|
pluralo: | "%d boteloj pendas ĉe la mur'" | "%d große Vorbilder" |
1 | unu botelo pendas ĉe la mur' | Ein großes Vorbild |
2 | 2 boteloj pendas ĉe la mur' | 2 große Vorbilder |
3 | 3 boteloj pendas ĉe la mur' | 3 große Vorbilder |
4 | 4 boteloj pendas ĉe la mur' | 4 große Vorbilder |
5 | 5 boteloj pendas ĉe la mur' | 5 große Vorbilder |
Simile funkcias la funkcio I18N:NGETTEXT
de la program-lingvo CLISP, kaj la funkcio dcngettext
de la programo gawk.
Anoj de multaj lingvoj kontentiĝas per tiuj du ebloj kaj ne suspektas, ke aliaj lingvoj distingas pli delikate. Slavaj lingvoj uzas malsamajn formojn ek de nombro 5; ili do uzas tri formojn de substantivo post nombro (ekzemple en la rusa la singulara nominativo, la singulara genitivo, la plurala genitivo; en la slovaka la singulara nominativo, la plurala nominativo, la plurala genitivo). La araba lingvo havas dualon, apartan formon por du ekzempleroj.
Se la programinto de programo ne konsideris tiajn diferencojn dum la internaciigo, estas preskaŭ neeble poste konsideri ilin ĉe lokigo.
La akordo de nombroj kaj substantivoj estas kompleksa fenomeno. Principe estas eble, pli bone subteni la programanton sur tiu kampo, sed necesas varia nombro da formoj (ekzemple du en Esperanto, tri en la slovaka).
Nombroj
editMultaj lingvoj nun uzas la eŭropajn-arabajn dekumajn ciferojn, eĉ lingvoj, kiuj ne uzas latinan alfabeton. Sed tiuj lingvoj ne uzas tiujn ciferojn en la sama maniero. La precipaj diferencoj estas en la apartigo de la frakciaj pozicioj kaj la grupigo de ciferoj en grandaj nombroj.
En Esperanto oni uzas komon (,) por la unua kaj prefere mallarĝa spaceto (" ") aŭ alie la punkto (.)[2] por la dua celo. La nombro "dek milionoj kaj kvarono" estas do skribata 10,000,000,25. La grupigo povas manki, sed ĉiam grupigas po tri ciferojn.
Por la apartigo de la frakciaj pozicioj estas uzata ankaŭ la punkto, ekzemple en la angla kaj japana lingvoj. Evidente tiam necesas alia simbolo por la grupigo, kutime la komo; punkto kaj komo do interŝanĝas la rolojn. Sed ekzistas aliaj kombinoj; svisoj uzas la apostrofon por grupigi (kaj la komon por apartigi).
La reguloj pri apartigo kaj grupigo do estas simplaj: Necesas nur scii la du simbolojn uzatajn en la koncerna lingvo.
Iom grandaj nombroj skribitaj per vortoj preskaŭ ne aperas en programoj. Iam ili estis uzataj en maŝine presitaj ĉekoj, sed nun preskaŭ ne plu.
Datoj
editEkzistas multaj manieroj skribi daton: Por la sinsekvo de jaro, monato kaj tago ekzistas ses ebloj, la jaron eblas skribi per du aŭ kvar ciferoj, la tagon per du aŭ (parte) per unu, la monaton same aŭ eĉ per literoj (monata nomo) aŭ romiaj nombroj. Kaj eblas uzi diversajn disigilojn: punkton, ligo-strekon (-), stangon (/), ktp.
Por internaciigo gravas, ke la programo neniam mem transformu daton al legebla formo, sed uzu por tio iun bibliotekon (kadraĵon), kiu scias, en kiu maniero la uzulo deziras vidi datojn.
Aparta problemo estas la ekzisto de diversaj tempozonoj sur la Tero. Necesas distingi inter vera datoj (kiuj signifas precizan tagon) kaj tempoj (kiuj signifas precizan tempon ene de tago kaj do povas varii laŭ la tempo-zono). Ekzemploj:
- La novjara tago estas la unua de januaro. Tiu indiko ne dependas de la tempozono.
- Komence de majo 2004 okazis lun-eklipso, kies maksimumo laux mez-eŭropa somera tempo estis je 2004-05-04, 22:30. Laŭ la tempo de Moskvo ĝi okazis ke 2004-05-05. 0:30, do je alia tago.
En negoca organizado festotagoj estas ekzemplo por la unua kategorio (datoj), tempe interkonsentitaj aferoj (ekz. telefonaj konferencoj) estas ekzemplo por la dua (tempoj).
Tempoj (tagaj)
editTagaj tempoj kutime estas indikataj per horoj kaj minutoj, foje ankaŭ sekundoj. Kutime almenaŭ la minutojn oni skribas per du ciferoj. Disigilo ofte estas punkto aŭ dupunkto (:).
Sed ekzistas grava diferenco inter la 12-hora sistemo, uzata precipe en Usono, kaj la 24-hora sistemo uzata en aliaj landoj (kie la 12-hora sistemo estas ofte uzata en neformala konversacio): La 12-hora sistemo bezonas, por sendube difini tempon, distingi inter la du 12-horaj duonoj de tago. En Usono oni distingas inter la horoj 00:00:00 ĝis 11:59:59 (antaŭtagmeze, latine ante meridiem, mallonge am) kaj la horoj 12:00:00 ĝis 23:59:59 (posttagmeze, latine post meridiem, mallonge pm). Plia malfacilaĵo estas, ke la horo inter 00:00:00 kaj 00:59:59 estas skribata kiel "0", sed la horo inter 12:00:00 kaj 12:59:59 kiel "12".
Ankaŭ tie ĉi necesas, ke programoj lasu la aranĝon de tempoj al biblioteka programo.
Alfabeta ordigo
editLa kodo Askio aranĝis la literojn laŭ ilia alfabeta sinsekvo. Tial oni povis kompari du literojn subtrahante iliajn Aski-valorojn. Ekzemple "G=71", "K=75", 75−71 estas pozitiva, do "K" venas post "G".
Tiu simpla algoritmo eĉ ne funkcias por la angla lingvo, se aperas majuskloj (A–Z) kaj minuskloj (a–z), ĉar en Askio ĉiuj majuskloj staras antaŭ ĉiuj minuskloj. Necesas do speciala traktado de majuskloj. Iam estis kutime por ordigo minuskligi ĉiujn literojn, tio okazis per adicio de 32 (A=65, a=97 ktp.). Aŭ pli simple, oni metis la biton por "32" al "1".
Tiu metodo tute ne funkcias por lingvoj, kiuj havas ne-askiajn literojn. Ĝi eĉ ne funkcias, se lingvo havas specialajn regulojn por la alfabeta ordigo de askiaj literoj. Jen kelkaj ekzemploj:
- La hispana lingvo ordigas la liter-kombinon "ll" (duobla "l") post "l" kaj la kombinon "ch" post "c". Oni ordigas ekzemple jene: "cura" / "champán" / "luna" / "llave".
- La ĉeĥa lingvo ordigas la liter-kombinon "ch" post "h". Oni ordigas ekzemple jene: "hydrant" / "chirurg" / "ikona".
Jen kelkaj reguloj por ne-askiaj literoj:
- La sveda lingvo ordigas la literon "ä" post "z" (kaj "å"); la germana ordigas ĝin kvazaŭ "a" en leksikonoj kaj kvazaŭ "ae" en telefonlibroj.
- En la ĉeĥa lingvo hoketo (haĉeko) sur vokalo estas sensignifa por ordigo; "e" kaj "ĕ" estas ordigataj egale. Hoketo sur "c" aŭ "s" igas ĝin alia litero, ordigata post "c" resp. "s": "cylindr" / "čaj" / "dáma".
- En la rumana lingvo ankaŭ ĉe vokaloj estas ordiga diferenco inter "a" und "ă": "cazarmă" / "că" / "cădea".
- La germana lingvo ordigas la literon "ß" kiel la kombinon "ss": "muss" / "Muße" / "musste".
La diversajn diferencojn inter literoj kaj ilian efikon al la ordigo oni povas klasi jene:
- Diferencoj unuarangaj estas la plej gravaj. Se du vortoj havas diferencon unuarangan, la unua tia diferenco decidas pri la alfabeta ordo. Ekzemplo estas la diferenco inter malsamaj bazaj latinaj literoj: La diferenco inter "a" kaj "k" estas unuaranga. En kelkaj lingvoj ankaŭ aliaj diferencoj estas unuarangaj: Ekzemple en la rumana ankaŭ la diferenco inter "a" kaj "ă".
- Diferencoj duarangaj efikas, se du vortoj ne havas unuarangan diferencon. Tiam la unua duagrada diferenco decidas pri la ordo. Ekzemploj estas la diferenco inter "e" kaj "é" en la ĉeĥa kaj la diferenco inter "a" kaj "ä" en la germana.
- Diferencoj triarangaj efikas, se du vortoj ne havas unua- aŭ duarangan diferencon. Tia diferenco estas en multaj lingvoj la diferenco inter minusklo kaj majusklo.
Eblas aldoni pliajn rangojn por interpunkcioj, se ili aperas en aŭ ĉirkaŭ vortoj. La rangoj de la diferencoj dependas de la lingvo. Eĉ dependas de la lingvo, ĉu diferencoj maldekstraj estas pli gravaj ol dekstraj aŭ inverse.
Pri detaloj ekzistas artikolo (anglalingva) de la Unikoda konsorcio: Unicode Collation Algorithm.
Majuskligo kaj minuskligo
editLa latina alfabeto ekzistas en du variantoj: Majuskla (A-Z) kaj minuskla (a-z). Ekzistas situacioj, kie necesas konverti majusklojn al minuskloj aŭ inverse. La plej simpla estas, ke komence de frazo oni uzas majusklon. Por alfabete ordigi oni kutime ignoras la "usklecon" kaj, ekzemple, konvertas ĉion al majuskloj.
En Askio estis simple transformi inter majuskloj kaj minuskloj: necesis nur adicii resp. subtrahi 32 de la kod-valoroj. En Unikodo ne nur estas variaj diferencoj inter la kod-valoroj de majuskloj kaj minuskloj; eĉ ne ĉiam estas unika rilato inter majuskloj kaj minuskloj. Ekzemplo estas la germana lingvo, kie litero "ß" majuskliĝas kiel "SS". Tiu majuskligo ne estas facile inversigebla, ĉar "SS" povas minuskle esti ankaŭ "ss" (FUSS → Fuß, FLUSS → Fluss). En ne-latinaj alfabetoj eĉ mankas la distingo de uskleco.
Kiel elekti lingvon?
editUzuloj devas iel komuniki al programo, en kiu lingvo ili volas dialogi. Ekestas la demando, kiel elekti lingvon kaj kiel montri elektitan lingvon. Pluraj metodoj estas uzataj:
- En retpaĝoj oni ofte indikas lingvoj per la flago de lando, en kiu oni parolas la lingvon. Tio estas problema, ĉar estas landoj kun pluraj lingvoj kaj lingvoj kun pluraj landoj.
- Foje oni indikas la lingvojn en iu centra lingvo, ekzemple la angla, kies scion oni postulas. Tio kontraŭas la celon de internaciigo, nome dialogi kun uzulo en ties propra lingvo.
- Kelkaj programoj prezentas nomojn de lingvoj en la lingvo uzata de la lasta uzulo. Tio malfaciligas al nova uzulo la elekton de sia lingvo, kaj al uzulo, kiu erare ŝanĝis la lingvon, la reiron.
- Ofte oni prezentas lingvojn tiel, ke ĉiu lingvo estas nomata en tiu lingvo mem. La konsidero malantaŭ tio estas, ke ne utilas elekti lingvon, kiun oni ne komprenas. Aliflanke tiel oni ĉiam komprenas, kiel elekti sian propran aŭ deziratan lingvon. Tiun metodon uzas ekzemple la reta enciklopedio "Vikipedio".
- Eblas precize difini lingvojn per ilia kodo normigita laŭ ISO 639. Tiu normo difinas du-literajn kaj tri-literajn kodojn por lingvoj. Kvankam oni eble ne postulu ilian uzon de la uzulo, ene de komputilo tiuj kodoj estas tre taŭgaj. Eblas eĉ distingi landajn variaĵojn de lingvoj, per aldono de lando-kodo (laŭ ISO 3166): "fr_CH" indikas la svisan variaĵon de la franca lingvo.
Resume, oni prezentu al uzulo ĉiujn lingvonomojn en la lingvo mem, kaj en komputilo uzu kodojn laŭ ISO 639.
Malbona metodo elekti lingvojn | Bona metodo elekti lingvojn | ||||
---|---|---|---|---|---|
de | eo | it | ja | ktp | ĉiam/immer |
<select name="testo2" size="6" onchange="status=this.value;"> <option value="de">Deutsch</option> <option value="eo">Esperanto</option> <option value="it">Italienisch</option> <option value="ja">Japanisch</option> <option value="ro">Rumänisch</option> <option value="ru">Russisch</option> </select> |
<select name="testo2" size="6"> <option value="de">germana</option> <option value="eo">Esperanto</option> <option value="it">itala</option> <option value="ja">japana</option> <option value="ro">rumana</option> <option value="ru">rusa</option> </select> |
select name="testo2" size="6"> <option value="de">tedesco</option> <option value="eo">esperanto</option> <option value="it">italiano</option> <option value="ja">giapponese</option> <option value="ro">romeno</option> <option value="ru">russo</option> /select> |
<select name="testo1" size="6"> <option value="de">ドイツ語</option> <option value="eo">エスペラント</option> <option value="it">イタリア語</option> <option value="ja">日本語</option> <option value="ro">ルーマニア語</option> <option value="ru">ロシア語</option> </select> |
… |
<select name="testo1" size="6" onclick="montruLingvon(this);"> <option value="de">Deutsch</option> <option value="eo">Esperanto</option> <option value="it">italiano</option> <option value="ja">日本語</option> <option value="ro">română</option> <option value="ru">русский</option> </select> |
Fina rimarkigo
editLa diskutitaj problemoj montras, ke necesas konsideri multajn aferojn por bone internaciigi programon. Aliflanke en la praktiko aperas malpli da problemoj, ol oni eble kredus. La kialo estas, ke komputilaj programoj ne uzas poezion aŭ altnivelan prozon, sed sufiĉe simplan lingvaĵon, kaj ke multaj tekstoj estas fiksaj kaj ne enhavas variajn elementojn.
Specimenaj demandoj
editTestu vin!
Referencoj
edit- ↑ Parto aŭ ĉiu enhavo de tiu paĝo reprenas tiun originan verkon.
- ↑ PMEG : Helposignoj