This is an internal documentation. There is a good chance you’re looking for something else. See Disclaimer.
The i18n subsystem
Note
This is mostly a direct copy from an old package-info.java file from the ch.tocco.nice2.textresources.api.i18n package. Feel free to
rewrite or expand this documentation.
Contexts
The application always runs in a context. Some examples for contexts:
admin: The administration interface.www: The public web site.correspondence: Rendering of bills, letters etc.
In this example, the context admin might only be available in german, because the company is e.g. in Zürich. The web site, however, might
additionally be available in french. Letters might be translated into many other languages to ensure communication, e.g. also turkish.
Contexts may be marked with tags to provide some additional information. E.g. www and admin might both be tagged with web: The output is
HTML, the protocol HTTP(S). Or correspondence may be rendered as mail or pdf, and pdf is printable.
Locales
Mostly, the handling of Locales is implemented as specified in IETF BCP 47. This also means that you should use
Locale#forLanguageTag() to get a Locale object from a string and
Locale#toLanguageTag() to convert it back to a String. Java’s own syntax for locales non-standard and therefore
deprecated in Nice2.
The algorithm to match the best matching locale for a given requested locale, however, differs from BCP 47 in one important point: While BCP 47
prohibits matching a more specific locale, the algorithm of
Locales#lookup does exactly this. In contrast to
BCP 47, de-CH is a viable candidate for a requested locale de or even de-DE.
For all locale handling, only the four main elements will be considered: Language, script, region and variant. Any standard or private extensions will be stripped.
The Persistence Layer
There are two ways to access internationalised fields:
By specifying the language:
myField_derefers to the german version of the field.By the current locale:
myFieldrefers to the best matching field
Note: The region will not be considered. myField_de-CH will not match any locale. myField_ru-Cyrl, myField_ru-Latn or even
myField_en-scotland will be resolved as usual.
Write access is only allowed to a specific language. In the above example, setValue("myField_de") will set the german value of myField.
setValue("myField") will throw an exception.
Internationalised fields can be used transparently in queries and result ordering:
find MyEntity where label == "foo"Find MyEntity where the label in the best matching language equals “foo”.
find MyEntity where label_en == "foo"Find MyEntity where the english label equals “foo”.
find MyEntity order by labelFind MyEntity ordering the results by
labelin the best matching language.
find MyEntity order by label_enFind MyEntity ordering the results by the english value of
label.