Externalization Strategies
This section describes the various ways to externalize textual
elements from the source code by introducing the concept of resource
bundles. Java and the IBM ICU package for Java, C and C++ offer
elegant localization support for externalizing text into locale-based
resource files.
Java
The following discussion of resource-bundle defaulting is based
on the Java design:
Resource Bundle Naming Conventions: Resource bundle names
have some base name such as ResBnd_ and a suffix indicating
the locale to which the resource bundle applies, e.g.:
ResBnd_en_US
ResBnd_en_CA
ResBnd_fr_FR
ResBnd_fr_CA
Design of the Resource-Bundle Directory
Structure: Typically there will be one directory in which all
resource bundles for an application reside. A program can locate
its resources by concatenating the path name of the resource-bundle
directory with the locale, e.g.:
<Resource Directory Path Name> + 'ResBnd_' + <locale>
There is a root resource bundle named simply ResBnd_
that normally is a duplicate of the en_US
resource bundle. If French is supported, the fr_FR
resource bundle is duplicated as the fr resource bundle,
while the en_US resource bundle is duplicated as the
en resource bundle. As a result the en_US
resource bundle will be present as the root, en , and
en_US resource bundles. The reason for this will become
clear shortly.
The root resource bundle constitutes the base localization kit that
is given to localizers for translation.
Resource-Bundle Lookup: With the preceding directory structure
and naming conventions the Java resource-bundle lookup services,
which ensures that users from supported and non-supported locales
receive screen presentations in the most appropriate language, can
be utilized.
Java supports a default lookup mechanism for resource files. The
Java rules are (from the Sun
Java documentation):
The resource bundle lookup searches for classes with various
suffixes on the basis of (1) the desired locale and (2) the current
default locale as returned by Locale.getDefault() ,
and (3) the root resource bundle (baseclass), in the following
order from lower-level (more specific) to parent-level (less specific):
baseclass + "_" + language1 + "_" +
country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1
baseclass + "_" + language2 + "_" + country2
+ "_" + variant2
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2
baseclass
For example, if the current default locale is en_US ,
the locale the caller is interested in is fr_CH ,
and the resource bundle name is MyResources , resource
bundle lookup will search for the following classes, in order:
MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources
Resource Keys: The internal structure of the resource bundle
is a list of <key, string> ordered pairs, where
the key is a mnemonic identifier for the associated Unicode string.
It is recommended that the mnemonic identifier be the module name
suffixed by string identifying the string, e.g. myModule_EnterName ,
which might identify the string EnterName used by myModule .
Resource Bundle Types: Java supports two types of Resource
Bundles. Java contains ListResourceBundles , which are
class files, and PropertyResourceBundles , which are
simple ASCII text files. There are pros and cons to these two different
approaches. ListResourceBundles are compiled which means there are
no text files sitting around that a user can edit & change GUI
displays. However, the system must be recompiled whenever a GUI
string is added.
Localization companies deal with PropertyResourceBundles
better than ListResourceBundles . Lingoport's experience
is that translators inadvertently modify ListResourceBundles
in such a way as to cause syntax errors, necessitating a developer.
ListResourceBundles can contain text, images, and other Java
classes. Consequently, if ListResourceBundles are used,
Java will employ the preceding resource-bundle lookup for both text
and images. If PropertyResourceBundles are used and
images stored as traditional image files, code must be added to
support a locale-sensitive file lookup for images and icons.
Additional Resources: More information about Java's resource
bundle implementation can be found
here.
ICU Resource Bundles in C/C++
The following describes the implementation of resource bundles
in ICU.
Resource Bundle Naming Conventions: Resource bundle names
have some base name such as ResBnd_ and a suffix indicating
the locale to which the resource bundle applies, e.g.:
ResBnd_en_US
ResBnd_en_CA
ResBnd_fr_FR
ResBnd_fr_CA
Design of the Resource-Bundle Directory Structure: Typically
there will be one directory in which all resource bundles for an
application reside. A program can locate its resources by concatenating
the path name of the resource-bundle directory with the locale,
e.g.
<Resource Directory Path Name> + 'ResBnd_' + <locale>
There is a root resource bundle named simply ResBnd_
that normally is a duplicate of the en_US resource
bundle. If French is supported, the fr_FR resource
bundle is duplicated as the fr resource bundle, while
the en_US resource bundle is duplicated as the en
resource bundle. As a result the en_US resource bundle
will be present as the root, en , and en_US
resource bundles. The reason for this will become clear shortly.
The root resource bundle constitutes the base localization kit
that is given to localizers for translation, if resource bundles
are chosen to maintain extracted text.
Resource-Bundle Lookup: With the preceding directory structure
and naming conventions the C resource-bundle lookup services, which
ensures that users from supported and non-supported locales receive
screen presentations in the most appropriate language, can be utilized.
ICU supports a default lookup mechanism for resource files. ICU
first looks for the most specific bundle. If this bundle is not
found (or the element is not contained within the bundle) then it
goes to a more general bundle. For example, if the de_AT_EURO
bundle is requested and not found, ICU searches for the de_AT
bundle and then searches by de . If de
is not found, ICU tries a bundle for the default locale. Hence,
the order of progression would be:
language1 + "_" + country1 + "_" + variant1
language1 + "_" + country1
language1
default
Language, country and variant are concatenated to define the bundle
name. Additionally, to use a resource bundle within C, it is necessary
to include the ures.h file. All of the resources are
handled using a UResourceBundle * . To initialize the
pointer, you must call the ures_open function. For
more treatment of C/C++ resource bundles using ICU, please see the
ICU
Website.
Resource Keys: The internal structure of the resource bundle
is a list of <key, string> ordered pairs, where
the key is a mnemonic identifier for the associated Unicode string.
It is recommended that the mnemonic identifier be the module name
suffixed by string identifying the string, e.g. Registration_EnterName ,
which might identify the string EnterName used by the
Registration module.
ICU cannot utilize resource bundle data in a text form. Instead,
ICU uses an efficient, binary form. The main tool for compiling
resource bundle data from text into a binary form is called genrb .
This tool reads a text resource file and outputs a .res
file - a binary form of a resource bundle.
|