Internaciigo de komputilaj programoj/Ekzemploj en la program-lingvo Java (Ĝavo)
Enhavo:
Ekzemploj en la program-lingvo Java (Ĝavo)
editLa program-lingvo Java provizas utilajn klasojn por trakti la plej multajn problemojn de internaciigo. (Por interesuloj: Ili troviĝas precipe en la pakaĵoj java.util
kaj java.text
.)
Tiuj klasoj formas sufiĉe bonan internaciigan kadraĵon. Ĝi ne havas apartan nomon.
La klaso "Locale"
editLa ĉefajn preferojn de uzuloj, kiuj varias ne individue, sed nur laŭ loko kaj lingvo, oni kunigas sub la nomo "lokaĵaro" aŭ "lok-medio" (angle: locale). La Java-klaso Locale servas por distingi diversajn lokaĵarojn. Ĝi mem preskaŭ ne provizas metodojn por internaciigo, sed povas esti uzata de aliaj klasoj por adaptiĝi al iu certa lokaĵaro.
Ekzistas tri konstruiloj por objektoj de la klaso Locale, kiuj permesas diversajn gradojn de distingo. Ili akceptas kiel parametrojn
- lingvon;
- lingvon kaj landon;
- lingvon, landon kaj varianton.
Lingvoj estas indikataj laŭ ISO 639, landoj laŭ ISO 3166. Variantoj ne estas normigitaj, sed fiksataj de program-provizantoj. Jenaj ekzemploj konstruas lokaĵarojn por la lingvoj germana, rumana, Esperanto, aŭstria germana kaj svislanda germana.
Locale deutsch = new Locale("de");
Locale romana = new Locale("ro");
Locale esperanto = new Locale("eo");
Locale deutschAT = new Locale("de", "AT");
Locale deutschCH = new Locale("de", "CH");
Vidu ankaŭ la oficiala priskribo de java.util.Locale (angla).
La klaso "ResourceBundle"
editInstancoj (ekzempleroj) de la klaso ResourceBundle
, de la Angla ressource bundle (rimeda fasko), estas en Java tio, kion ni antaŭe nomis "teksto-listoj". Eblas peti tian objekton pri teksto kun certa nomo ("ŝlosilo"), kaj ĝi redonas la tekston en sia lingvo. Ĉiu ResourceBundle
havas fiksan lingvon, pli precize, fiksan lokaĵaron (Locale).
Ni supozu, ke ni havas kalendaran programon, kiu eligas la daton (kun la nomoj de la monato kaj la semajna tago) en la lingvo de la uzulo. Por tio ĝi bezonas teksto-liston kun tiuj nomoj. Ni nomu la liston Kalendaro.
Necesas por ĉiu lokaĵaro unu ekzemplero de tia teksto-listo. La nomoj de tiuj listoj enhavas la mallongigojn de la lingvo kaj la lando. Ekzemple:
Kalendaro_de | germana | deutsch |
Kalendaro_eo | Esperanto | Esperanto |
Kalendaro_ro | rumana | rumänisch |
Kalendaro_hu | hungara | ungarisch |
Kalendaro_de_AT | aŭstra germana | österreichisches Deutsch |
Kalendaro_de_CH | svisa germana | schweizerisches Deutsch |
La ekzempleroj de ResourceBundle
povas havi interrilatojn. Listoj por landaj variantoj estas dependaj de senlandaj listoj, ekzemple Kalendaro_de_AT
dependas de Kalendaro_de
. Tio havas grandan avantaĝon: La dependa listo devas enhavi nur la tekstojn, en kiuj ĝi diferencas de la "patra" listo. Ekzemple la aŭstraj monatoj de marto al decembro egalas kun la germanaj, do Kalendaro_de_AT
bezonas nur proprajn januaron kaj februaron.
M1 | M2 | M3 | M4 | M5 | M6 | M7 | M8 | M9 | M10 | M11 | M12 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Kalendaro_de | Januar | Februar | März | April | Mai | Juni | Juli | August | September | Oktober | November | Dezember |
Kalendaro_de_AT | Jänner | Feber |
Se iu teksto ne estas disponebla en certa lokaĵaro el (lingvo + lando), la klaso ResourceBundle
provas, ĉu ĝi estas disponebla por la lokaĵaro de la nura lingvo. Tio signifas, ke la programo povas tamen funkcii, se ekzistas tekstoj ne por la tute precize dezirata lokaĵaro, sed ja por simila lokaĵaro. Eĉ eblas konstrui liston por sen-lingva lokaĵaro; tiu listo havas la bazan nomon, tie ĉi do "Kalendaro
". Tia baza listo certigas, ke programo povas funkcii (eble en nedezirata lingvo) en ĉiu lokaĵaro. Ofte la baza ResourceBundle
estas en tiu lingvo, en kiu la programo estis unue verkita.
Koncerne la ekzemplon pri Kalendaro
ni konsideru jenan programeton:
Locale deutschAT = new Locale("de", "AT");
ResourceBundle rb = ResourceBundle.getBundle("Kalendaro", deutschAT);
String m1 = rb.getString("M1"); // trovu monaton "M1"
String m5 = rb.getString("M5"); // trovu monaton "M5"
Teksto m1 estas trovita en la listo Kalendaro_de_AT
("Jänner"). Teksto m5 ne ekzistas tie kaj estas trovita en la listo Kalendaro_de
("Mai"). Se Kalendaro_de_AT
tute ne ekzistus, la programo prenus ĉiujn tekstojn el Kalendaro_de
. Se eĉ tiu ne ekzistus, la programo provus trovi liston Kalendaro
.
La klaso "DateFormat"
editEkzempleroj de la klaso DateFormat permesas la skribadon kaj legadon (analizon) de datoj en aranĝo taŭga por la uzulo. Same kiel oni povas ricevi ekzempleron de ResourceBundle
taŭgan por iu certa lokaĵaro, funkcias ankaŭ pri DateFormat
: La metodo getDateInstance produktas DateFormatobjekton
por la dezirata lokaĵaro, kaj per la metodo format de tiu objekto eblas transformi ajnan dato-objekton al lingvo-dependa formo:
Locale japana = new Locale("ja");
DateFormat jadf = getDateInstance(DateFormat.LONG, japana);
String d = jadf.format(new Date());
La klaso "NumberFormat"
editSame kiel la klaso DateFormat
prilaboras datojn kaj tempojn, la klase NumberFormat
analizas kaj produktas nombrojn en teksta formo (el ciferoj), kun la taŭgaj frakcia disigilo kaj grupigilo.
La klaso "ChoiceFormat"
editLa klaso ChoiceFormat estas interesa solvo de la problemo, ke substantivoj varias en diversaj manieroj depende de la nombro. Tiu klaso ebligas meti la algoritmon de tiu variado en tekstojn, kiuj povas esti en teksto-listoj. Tiaj tekstoj konsistas el nombroj kaj tekst-partoj, disigitaj de la signoj "#" kaj "|"; ĉciu tekst-partoj estas aplikata en la intervalo limigata de la du nombroj, inter kiuj ĝi staras (inkluzive de la maldekstra):
"0#neniu aŭto|1#unu aŭto|2#{0} aŭtoj"
"0#kein Auto|1#ein Auto|2#{0} Autos"
"0#nici o maşina|1#o maşina|2#{0} maşine"
"0#žádný auto|1#jedno auto|2#{0} autá|2#{0} áut"
neniu aŭto; unu aŭto; 2 aŭtoj, 3 aŭtoj, … kein Auto; ein Auto; 2 Autos, 3 Autos, … nici o maşina; o maşina; 2 maşine, 3 maşine, … žádný auto; jedno auto; 2 autá, 3 autá, 4 autá; 5 áut, 6 áut, …
La klaso ne plene solvas la problemon, ĉar ekzemple la rusa lingvo konsideras nur la lastajn du ciferojn por determini la ĝustan formon de la substantivo. Tion ne eblas priskribi per la supre uzata interval-tekniko.
Specimenaj demandoj
editTestu vin!
Referencoj
edit- ↑ Parto aŭ ĉiu enhavo de tiu paĝo reprenas tiun originan verkon.