Title: Going Global: Internationalization with Java
1Going GlobalInternationalization with Java
- Sue Davis
- Rochester Java Users Group
- November 15, 2000
2Agenda
- Introduction
- Definition of Internationalization
- Why internationalize?
- Highlight some aspects of internationalization
- Java internationalization classes
- Simple Demonstration
- Closing thoughts
- QA
3Introduction
- My background in internationalization
- Scope of internationalization
- Software
- Documentation/On-line Help
- Testing
- Training
- Legal considerations
- Marketing
4Introduction
- Internationalization is the process of designing
and developing products enabled for simultaneous
shipment (Sim Ship) to both domestic and world
markets.
5Terms and Abbreviations
- Localization
- Globalization
- Locale
- Diacritic
- Folding
- Decomposed character
- Pre-composed character
- MBCS
- DBCS
- Unicode
- UTF-8
- I18N
- G11N
- L10N
- NLS
- IME
- Glyph
6Why Internationalization Is Important
- North America represents only 1/3 of the world
economy - Europe, Latin America, Japan and Asia Pacific
represent more than 1/2 - Subtle differences even in other English speaking
counties - Localization is expensive
- Maintain one set of source, ship one binary for
multiple locales
7Motivated self interest
- Try Internationalization or i18n on major job
search engine - Internationalization positions at other major
corporations - Sun Internationalization Architect
- Apple Internationalization Technology Evangelist
- Compaq I18N/L10N Development Manager
- Kodak Product Internationalization Manager
- The Web has made it easier than ever to reach the
global market. Expect this to be skill that is
in demand.
8What does it mean to Internationalize
- Externalize text, icons, sound.
- Design for expansion of translated text
- Use of culturally neutral graphics whenever
possible - Automatically format of dates and numbers as
appropriate to the locale - Consistent use of terminology, correct grammar,
avoid slang - Managing various character encoding schemes
- And more...
9Design for expansion of translated text
- English is very compact language
- If target markets include Asian countries, allow
additional vertical spacing. - Negatives if the UI has to be redesigned to be
usable after translation - Longer time to market
- Higher localization costs
- Higher maintenance costs
- Localization of Training, Help, User
documentation becomes more complicated
10English length (in characters) Additional growth
for localized strings
- 1 to 4 100
- 5 to 10 80
- 11 to 20 60
- 21 to 30 40
- 31 to 50 20
- 51 10
From MSDN, VB Concepts, Designing an
International Aware User Interface
11Use culturally/linguistically neutral graphics
- Dont use a Christmas Tree and Champagne glass as
a holiday icon - Keep text off graphics
- Dont use homonyms as a basis for icons
12Use culturally/linguistically neutral
graphicsContinued...
Are any of these neutral?
13Lets talk about Java!
- What are some of the important Java classes for
internationalization? - Locale
- ResourceBundle, specifically ListResourceBundle
- NumberFormat
- DateFormat
- Collator
- CollationKey
- RuleBasedCollator
- BreakIterator
14The Locale class
- A Locale is defined as a combination of language,
country and variant - Two character ISO codes for both language and
country. - Language codes are all lower case (ISO 639)
- Country codes are upper case (ISO 3166)
- Variants are ad hoc - most frequently used to
specify Euro currency
15Externalize text, icons, sound
- Resources reside in a resource file that is
separate from the application. - Java - Resource Bundle
- Dont combine phrases to make sentences
- Makes the executable language independent
- Isolates resources for translation and
localization - Can enable a new locale by just installing the
appropriate Resource Bundle. (in theory)
16What is a ResourceBundle?
- A ResourceBundle (java.util.ResourceBundle) is an
abstract class with two concrete subclasses - PropertyResourceBundle (limited use, not
recommended) - ListResourceBundle
- Consists of minimally a base class extending
PropertyResourceBundle - Locale specific resources are added by creating
additional classes with language and country
extentions
17Using PropertyResourceBundle
- Create the baseline ResourceBundle
- class DemoResource extends PropertyResouceBundle
- public Object getContents() return
contents - static final Object contents //
Localize right hand object - "SampleKey", "translatable text", //
helpful hint - "HelloWorldKey", "Hello World",
- "MenuFileKey", "File",
- "MenuFileExitKey", "Exit",
- "MenuHelpKey", "Help",
- "MenuHelpAboutKey", "About",
-
-
18Begin Localizing your ResourceBundles
- Create a language specific ResourceBundle
- class DemoResource_fr extends PropertyResouceBund
le - public Object getContents() return
contents - static final Object contents //
Localize right hand object - "HelloWorldKey", "Bonjour Monde",
- "MenuFileKey", "Fichier",
- "MenuFileExitKey", "Quittent",
- "MenuHelpKey", "Aide",
- "MenuHelpAboutKey", "Au sujet de",
-
-
19Localize ResourceBundles for language country
- Create a locale specific ResourceBundle
- class DemoResource_fr_FR extends
PropertyResouceBundle - public Object getContents() return
contents - static final Object contents //
Localize right hand object - "HelloWorldKey", "Bonjour Monde for
France", -
-
20Cascading Resource Bundles
- Why you dont need to redefine every key in
DemoResource_fr_FR - ResourceBundles cascade from most specific locale
information down to the base, in this case,
DemoResource - So if your Locale is Locale.FRANCE (or
Locale(fr, FR) ) the code will search the
ResourceBundle classes for the key in the
following order - DemoResource_fr_FR
- DemoResource_FR
- DemoResource
- An exception is thrown if the key is not found in
ANY of these classes
21Lets look at some code
- Using ResourceBundles in Packages
- Package name MUST be the same as the bundles
base name - The ResourceBundle class must be FULLY qualified
- Do not need to import the package
22Formatting Text Messages
- Sometimes theres no way around it. You HAVE to
have variables integrated into the message. - Remember sentence structures vary between
languages, so you need to give your translator a
way to move things around without breaking the
code
23Java to the rescue
- The class MessageFormat allows you to number the
placeholders for your variables - In your ResourceBundle
- key, my formatted 1 message is very 2
- // helpful hints to the translator go here
- In your code
- myObj.value MessageFormat.format(
- rb.getString(key),
- new Object(
- varible1,
- variable2)
- )
- )
24Automatic formatting of dates and numbers as
appropriate to the locale
- Date formats vary from country to country, even
among English speaking counties. - Long Date examples
- US Thursday, August 19, 1999
- UK 19 August 1999
- DE Donnerstag, 19.August 1999
- FR jeudi 19 aôut 1999
25Automatic formatting continued...
- Date formats vary from country to country, even
among English speaking counties. - Short Date examples
- US 8/19/99
- UK 19/08/99
- DE 19.08.99
- FR 19/08/99
26Automatic formatting of numbers and currency
- Numeric examples Currency
- US 1,234,567.89 1,234.45
- UK 1,234,567.89 1,234.45
- DE 1.234.567,89 1.234,45 DM
- FR 1 234 567,89 1 234,45 F
- Java 1.1.6 and later support the Euro
27Automatic Formatting in Java
- Available classes
- DateFormat
- NumberFormat
- DecimalFormat
- SimpleDateFormat
- Date
- good for storing elapsed time since Jan 1, 1970
GMT - API assumes the Gregorian Calendar
- Calendar
- TimeZone
- JDK supports only the Gregorian calendar
28Dealing with characters and strings
- Assuming Unicode
- Character traits
- Comparisons and conversions
- Sorting
- Text boundaries
29Characters traits
- idDefined()
- isDigit()
- isLetter()
- isSpace()/isSpaceChar()/isWhiteSpace()
- isLetterOrDigit()
- isUpperCase()/isLowerCase()/isTitleCase()
- getType()
- getNumericValue()
30Comparisons and conversions
- Comparing pre-composed characters with decomposed
characters - String conversions (e.g. toUpperCase()) not
always round trip
31Sorting
- Do not use String.compareTo() for natural
language text. - Use Collator to compare locale sensitive strings
- Use CollationKey to sort long lists
- RuleBasedCollator
- Character folding (ignore diacritics résumé vs.
resume)
32Tools to help you go global...
- Internationalizing source code
- One Realm
- Uniscape
- Java
- Machine Translation/Machine Assisted Translation
- Consulting
- Internationalization - small but growing
- Localization - Lots
- Training - Minimal, usually in conjunction with a
product purchase or consulting contract
33Use terms consistentlyUse correct grammar, avoid
slang
- Facilitates the use of Machine Assisted
Translation translation tools - Helps minimize questions from translators
- Impacts Developers, Documentation, QA
34Closing Thoughts
- EJAL English is Just Another Language
- Anything is fair game for localization, including
corporate names and logos. - Internationalization is NOT a feature.
- Internationalization IS a design issue
- Internationalization shortens and simplifies the
localization process. - Rapid deployment, improved time to market
- Lower maintenance time costs
- Frees development resources for new product
development
35Not Discussed
- Using third party software
- Sorting
- Text boundary conditions
- Accelerator keys
- Color
- Software Architecture
- Configuration Management Issues
- Legal requirements
- Bi-directional languages
- Different calendars (Hebrew, Japanese Imperial,
Buddhist, Islamic)
36Recommended Reading
- JavaWorld, Internationalize Your Software, Geoff
Friesen part 1, part 2, and part 3 - Internationalization Localization with Resource
bundles, John O'Conner - Global Design Homepage, Richard Ishida
- Scripting Clinic Using Script to
Internationalize Web Site Functions - Localization and the XML/DHTML Menus
- Developing Global Applications in Java, Richard
Gillam - Developing International Software for Windows 95
and Windows NT, Nadine Kano, Available
electronically on MSDN - MSDN, Windows Interface Guidelines for Software
Design
37Questions???