Internaciigo de komputilaj programoj/Ekzemploj en la program-lingvo Java (Ĝavo)

From Wikiversity
Jump to navigation Jump to search

[1]

Enhavo:


Ekzemploj en la program-lingvo Java (Ĝavo)[edit]

La 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"[edit]

La ĉ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

  1. lingvon;
  2. lingvon kaj landon;
  3. 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"[edit]

Instancoj (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"[edit]

Ekzempleroj 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"[edit]

Same 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"[edit]

La 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[edit]

HSQuiz2.svgTestu vin!

1

Laŭ kiuj kriterioj diferencas lokaĵaroj?

Lando
Lingvo
Persono
Politika partio
Vilaĝo

2

Kiu Java-klaso administras lingvo-dependajn teksto-listojn?

DateFormat
Kalendaro
NumberFormat
ResourceBundle

3

Kiu Java-klaso analizas kaj produktas datojn en lingvo-dependaj formo?

DateFormat
Kalendaro
NumberFormat
ResourceBundle

4

Kiu Java-klaso analizas kaj produktas nombrojn en lingvo-dependa formo?

DateFormat
Kalendaro
NumberFormat
ResourceBundle


⯇ Pli alt-nivelaj problemoj Prilaborado de tekstoj ⯈


Referencoj[edit]

  1. Parto aŭ ĉiu enhavo de tiu paĝo reprenas tiun originan verkon.