<<< [=] >>>

6 Ekzemploj en la program-lingvo Java (Ĝavo)

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.

6.1 La klaso "Locale"

La ĉefajn preferojn de uzuloj, kiuj varias ne individue, sed nur laŭ loko kaj lingvo, oni kunigas sub la nomo "lok-medio" (angle: locale). La Java-klaso Locale servas por distingi diversajn lok-mediojn. Ĝi mem preskaŭ ne provizas metodojn por internaciigo, sed povas esti uzata de aliaj klasoj por adaptiĝi al iu certa lok-medio.

Ekzistas tri konstruiloj por objektoj de la klaso Locale, kiuj permesas diversajn gradojn de distingo. Ili akceptas kiel parametrojn

  • lingvon,
  • lingvon kaj landon, aŭ
  • 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 lok-mediojn por la lingvoj germana, rumana, Esperanto, aŭstria germana kaj svislanda germana.

6 Beispiele in der Programmiersprache Java

Die Programmiersprache Java bietet nützliche Klassen an, um die meisten Probleme der Internationalisierung zu behandeln. (Für Interessierte: Sie liegen vorwiegend in den Paketen java.util und java.text.)

Diese Klassen bilden einen ganz guten Internationalisierungs-Rahmen. Er hat allerdings keinen besonderen Namen.

6.1 Die Klasse "Locale"

Die wichtigsten Benutzerpräferenzen, die sich nicht individuell, sondern nach Sprache und Ort unterscheiden, fasst man unter der englischen Bezeichnung locale zusammen. Die Java-Klasse Locale dient dazu, verschiedene locales zu unterscheiden. Sie bietet selbst fast keine Methoden zur Internationalisierung, kann jedoch von anderen Klassen benutzt werden, um sich an ein bestimmtes locale anzupassen.

Es gibt drei Konstruktoren für Objekte der Klasse Locale, die verschiedene Grade der Unterscheidung erlauben. Sie erwarten als Parameter

  • eine Sprache,
  • eine Sprache und ein Land, oder
  • eine Sprache, ein Land und eine Variante.

Sprachen werden nach ISO 639, Länder nach ISO 3166 angegeben. Die Varianten sind nicht genormt und werden von Programm-Herstellern festgelegt. Die folgenden Beispiele erzeugen locales für Deutsch, Rumänisch, Esperanto, österreichisches Deutsch und schweizerisches Deutsch (nicht "Schwyzerdütsch").

        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");

/* jen la oficiala priskribo de java.util.Locale (angla) */

6.2 La klaso "ResourceBundle"

Instancoj (ekzempleroj) de la klaso ResourceBundle estas en Java tio, kion ni supre 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 lok-medion (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 lok-medio unu ekzemplero de tia teksto-listo. La nomoj de tiuj listoj enhavas la mallongigojn de la lingvo kaj la lando. Ekzemple:

6.2 Die Klasse "ResourceBundle"

Instanzen (Exemplare) der Klasse ResourceBundle sind in Java das, was wir oben "Textlisten" genannt haben. Man kann von einem solchen Objekt einen Text mit einem bestimmten Namen ("Schlüssel") verlangen, und es liefert den Text in seiner Sprache. Jedes ResourceBundle hat eine feste Sprache, genauer gesagt, ein festes Locale (Locale).

Nehmen wir an, wir haben ein Kalender-Programm, das ein Datum (mit den Namen des Monats und des Wochentages) in der Sprache des Benutzers ausgibt. Dazu braucht es eine Textliste mit diesen Namen. Nennen wir die Liste Kalendaro.

Für jedes Locale ist ein Exemplar einer solchen Textliste nötig. Die Namen der Listen enthalten die Abkürzungen der Sprache und des Landes. Beispiel:

Kalendaro_de germana deutsch
Kalendaro_eo Esperanto Esperanto
Kalendaro_ro rumänischrumana
Kalendaro_hu ungarisch hungara
Kalendaro_de_ATaŭstra germana österreichisches Deutsch
Kalendaro_de_CHsvisa 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.

Exemplare der Klasse ResourceBundle können Abhängigkeiten voneinander haben. Listen für landes-spezifische Varianten hängen von Listen ohne Landesangabe ab, zum Beispiel hängt Kalendaro_de_AT von Kalendaro_de ab. Das hat einen großen Vorteil: die abhängige Liste braucht nur diejenigen Texte zu enthalten, in denen sie von der übergeordneten Liste abweicht. Zum Beispiel ist die österreichische Liste in den Monaten von März bis Dezember mit der deutschen identisch, also braucht Kalendaro_de_AT nur einen eigenen Januar und Februar.

M1 M2 M3 M4 M5 M6 M7 M8 M9M10M11M12
Kalendaro_de Januar Februar März April Mai Juni Juli August SeptemberOktoberNovemberDezember
Kalendaro_de_AT Jänner Feber

Se iu teksto ne estas disponebla en certa lok-medio el (lingvo + lando), la klaso ResourceBundle provas, ĉu ĝi estas disponebla por la lok-medio de la nura lingvo. Tio signifas, ke la programo povas tamen funkcii, se ekzistas tekstoj ne por la tute precize dezirata lok-medio, sed ja por simila lok-medio. Eĉ eblas konstrui liston por sen-lingva lok-medio; tiu listo havas la bazan nomon, tie ĉi do "Kalendaro". Tia baza listo certigas, ke programo povas funkcii (eble en nedezirata lingvo) en ĉiu lok-medio. Ofte la baza ResourceBundle estas en tiu lingvo, en kiu la programo estis unue verkita.

Koncerne la ekzemplon pri Kalendaro ni konsideru jenan programeton:

Wenn ein Text in einem bestimmten Locale (Sprache + Land) nicht verfügbar ist, versucht die Klasse ResourceBundle, ob er im Locale verfügbar ist, das nur durch die Sprache bestimmt ist. Das bedeutet, dass das Programm auch dann funktioniert, wenn Texte nicht ganz genau für das gewünschte Locale vorhanden sind, wohl aber für ein ähnliches. Man kann auch eine Liste für ein sprach-unabhängiges Locale aufbauen; diese Liste hat als Namen das Grundwort, hier also Kalendaro. Eine solche Grundliste stellt sicher, dass das Programm in jedem Locale funktioniert, wenn auch vielleicht nicht in der gewünschten Sprache. Oft ist das Basis-ResourceBundle in der Sprache, in der das Programm zuerst entwickelt wurde.

Betrachten wir zum Kalenderbeispiel folgendes Programm-Fragment:

        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.

Der Text m1 wird in der Liste Kalendaro_de_AT gefunden ("Jänner"). Text m5 existiert dort nicht und wird in der Liste Kalendaro_de gefunden ("Mai"). Wenn die Liste Kalendaro_de_AT nicht existieren würde, würde das Programm alle Texte aus Kalendaro_de nehmen. Wenn auch diese Liste nicht existieren würde, würde es nach der Liste Kalendaro suchen.

6.3 La klaso "DateFormat"

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 lok-medio, funkcias ankaŭ pri DateFormat: La metodo getDateInstance produktas DateFormatobjekton por la dezirata lok-medio, kaj per la metodo format de tiu objekto eblas transformi ajnan dato-objekton al lingvo-dependa formo:

6.3 Die Klasse "DateFormat"

Instanzen (Exemplare) der Klasse DateFormat erlauben die Ausgabe und Eingabe (Analyse) von Datumsangaben in einer Anordnung, die den Gewohnheiten des Benutzers entspricht. Die Art, wie man ein Exemplar von ResourceBundle für ein bestimmtes Locale erhält, funktioniert auch für DateFormat: die Methode getDateInstance erzeugt ein Format-Objekt für ein Locale, und mit der Methode format dieses Format-Objektes lassen sich dann beliebige Datumsobjekte in eine sprachabhängige Darstellung umwandeln:

        Locale japana = new Locale("ja");
        DateFormat jadf = getDateInstance(DateFormat.LONG, japana);
        String d = jadf.format(new Date());

6.4 La klaso "NumberFormat"

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.

6.4 Die Klasse "NumberFormat"

So, wie die Klasse DateFormat Datums- und Zeitangaben verarbeitet, analysiert und erzeugt die Klasse NumberFormat Zahlen in Textform (in Ziffern), mit passendem Dezimaltrenner und Gruppierungszeichen.

6.5 La klaso "ChoiceFormat"

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):

6.5 Die Klasse "ChoiceFormat"

Die Klasse ChoiceFormat ist eine interessante Lösung des Problems, dass Hauptwörter auf verschiedene Weise abhängig von der Anzahl variieren. Diese Klasse legt den Algorithmus dieser Abhängigkeit in Texte, die sich in Text-Listen befinden können. Solche Texte bestehen aus Zahlen undTextteilen, die durch "#" und "|" getrennt werden; jeder Textteil wird für Zahlen in dem Intervall angewandt, das von den beiden Zahlen links und rechts von ihm begrenzt wird (einschließlich der linken dieser beiden Zahlen):

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

Die Klasse löst das Problem nicht vollständig, da zum Beispiel in der russische Sprache die richtige Form des Hauptwortes nur von den letzten beiden Ziffern der Zahl abhängt. Das lässt sich mit der obigen Intervall-Technik nicht beschreiben.


Specimenaj demandoj:

  • Laŭ kiuj kriterioj diferencas lok-medioj?
  • Kiu Java-klaso administras lingvo-dependajn teksto-listojn?
  • Kiu Java-klaso analizas kaj produktas datojn en lingvo-dependaj formo?
  • Kiu Java-klaso analizas kaj produktas nombrojn en lingvo-dependa formo?

Beispielfragen:

  • Nach welchen Kriterien unterscheiden sich locales?
  • Welche Java-Klasse verwaltet sprachabhängige Textlisten?
  • Welche Java-Klasse verarbeitet Datumsangaben in sprachabhängiger Form?
  • Welche Java-Klasse verarbeitet Zahlangaben in sprachabhängiger Form?

>>>