omaha java users group java internationalization presented by jason shepherd 16-may-2005 6:30 pm
TRANSCRIPT
![Page 1: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/1.jpg)
Omaha Java Users GroupJava Internationalization
Presented by Jason Shepherd16-May-20056:30 PM
![Page 2: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/2.jpg)
Outline
Concepts and terminologyInternationalization in J2SEInternationalization in J2EE (JSTL,
Struts)Internationalization in XSLTThe Process of Internationalization
(Project Plan)
![Page 3: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/3.jpg)
Terms
Internationalization process of creating an application so it
can be adapted to different languages and countries without coding changes
also known as “i18n” (since there are 18 characters between the i and n in Unicode)
![Page 4: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/4.jpg)
Terms (cont)
Characteristics of an i18n application By adding localized text, the app can
display information in any language/country
Textual elements are not hard-coded; they are stored externally and retrieved at run-time
![Page 5: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/5.jpg)
Terms (cont)
Characteristics of an i18n application (cont) Support for new languages/countries
does not require re-compilation Culturally dependent data (dates,
currencies, etc.) conforms to user’s language/country
Can be localized quickly
![Page 6: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/6.jpg)
Terms (cont)
Localization process of adapting software for a
specific language/country by adding locale-specific components and text translations
sometimes abbreviated as l10n (10 letters between L and N in Unicode)
![Page 7: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/7.jpg)
Terms (cont)
Localizing an application text translation is the most time-consuming
phase of l10n (the human element) sounds and images may need localized if they
are culturally sensitive (red is “purity” in India, but “danger” in the U.S… likewise the icon of a mailbox isn’t familiar outside the U.S., and instead a mail envelope icon should be used)
formatting of numbers, dates, and currencies may impact the UI layout strategy
![Page 8: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/8.jpg)
Terms (cont)
Object central to l10n is the user’s locale
Locale political, cultural, and region-specific
elements (in Java, expressed as a language code and country code)
![Page 9: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/9.jpg)
Terms
Locale (cont) has the form xx_YY xx is two-character language code (ISO-
639) YY is two-character country code (ISO-3166) Examples:
en_US - United States Englishen_GB - Great Britain Englishes_MX - Mexico Spanish (Espanol)
![Page 10: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/10.jpg)
java.util.Locale
Locale enUSLocale = new Locale(“en”, “US”);Locale frCALocale = new Locale(“fr”, “CA”);Locale locale = Locale.US;
Locale.getDefault().toString()// “en_US”locale.getLanguage() // “en”locale.getCountry() // “US”locale.getDisplayName() // “English (United States)”locale.getDisplayLanguage()// “English”
Locale.setDefault( Locale.FRANCE );locale.getDisplayName() // “anglais (Etats-Unis)”
* Display names are shown according to the default locale
![Page 11: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/11.jpg)
Internationalization in J2SE
Create properties files externalized locale-specific UI messages
Create the localeCreate a resource bundle (using the
locale)Retrieve UI messages from the
resource bundle
![Page 12: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/12.jpg)
J2SE
Creating properties files Plain text file Will reside in classpath One file for each locale (filename
convention) When paired with a locale, the closest
matching file will be selectedMessagesBundle.propertiesMessagesBundle_en.propertiesMessagesBundle_en_US.propertiesMessagesBundle_fr_FR.properties
default
![Page 13: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/13.jpg)
J2SE
Creating properties files (cont)
greetings = Hello.farewell = Goodbye.inquiry = How are you?
greetings = Bonjour.farewell = Au revoir.inquiry = Comment allez-vous?
MessagesBundle_en_US.properties
MessagesBundle_fr_FR.properties
![Page 14: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/14.jpg)
J2SE
Create the locale and resource bundle
Retrieve UI messages from the resource bundle
Locale currentLocale = new Locale("fr", “FR", "UNIX");
ResourceBundle messages = ResourceBundle.getBundle(“MessagesBundle", currentLocale);
System.out.println( messages.getString(“greetings”) );
![Page 15: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/15.jpg)
Eclipse is Almost Helpful
The “Externalize Strings” option gets you part-way to i18n
DEMO!!
![Page 16: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/16.jpg)
J2SE Side Notes
Properties files and resource bundle keys should follow human-readable naming conventions (not “key1”, “key2”, etc.)
Some UI generation engines for thick clients (e.g. SwiXML) have support for i18n; something to consider if you’re creating a Swing app
![Page 17: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/17.jpg)
Internationalization in J2EE
Locale stored in HTTP sessionResource bundles stored in properties
files; told to load in web.xmlLocale-specific messages accessed in the
Web tier (generally) using tag librariesJSTL versus Struts tag librariesWe’ll refer to Struts for the remainder of
the presentation
![Page 18: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/18.jpg)
J2EE (w/ Struts)
Ensure your properties files are visible on the classpath special attention must be paid if using
Ant or Maven to build your application must be placed somewhere that all
classes will be able to find it (e.g. a “library” jar file or possibly in the WAR file under WEB-INF/classes)
![Page 19: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/19.jpg)
J2EE (w/ Struts)
Configure web.xml to load the properties files
<!-- Web App Framework Action Servlet Configuration --><servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>MessagesBundle</param-value> </init-param> <init-param> <param-name>locale</param-name> <param-value>true</param-value> </init-param>
![Page 20: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/20.jpg)
J2EE (w/ Struts)
Accessing the resource bundles in a JSPFirst, include the Struts “bean” tag
library <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"
%>
Then, replace any hard-coded messages <b>Hello</b> <b><bean:message key=“hello.message” /></b>
![Page 21: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/21.jpg)
J2EE (w/ Struts)
Accessing outside of a JSP e.g. back-end translation code (locale
passed through to data tier) e.g. JavaScript messages At UPRR, we wrote a utility class to load
the properties files and retrieve messagesLocale locale = (Locale)
session.getAttribute(org.apache.struts.action.Action.LOCALE_KEY);
String message = ResourceBundleUtil.getMessage( locale, “hello.message”);
* this class comes in handy later on in the presentation… stay tuned!
![Page 22: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/22.jpg)
J2EE Apps: The Database Dilemma
Translating values that come out of a database
If DB is not shared between applications, localized strings can be stored in the DB DB must be Unicode-enabled and have plenty
of extra disk spaceIf localized messages cannot be stored in
the DB, keys can be stored in the DB that refer to values in the properties files
![Page 23: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/23.jpg)
Storing localized text in the database: Pros
Truly dynamic localizationOne table for supported localesOther tables for translationCan correct translation errors on-the-
fly Good when translation error looks
silly/unprofessional, or worse yet, offensive
![Page 24: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/24.jpg)
Storing localized text in the database: Cons
Requires more database accesses Very bad for high volume sites where
database connections must be managed carefully
Might require complex joins in a well-normalized DB schema
Could be considered bad design to store presentation tier artifacts in the data tier??
![Page 25: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/25.jpg)
J2EE Side Notes
Properties files for Struts can be HTML escape encoded (á) or Unicode encoded (\u0000)… Struts is encoding-aware
The content type in your resulting HTML page must be set correctly
![Page 26: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/26.jpg)
Internationalization in XSLT
Some J2EE applications deliver their data to the Web tier as XML and then render the UI using XSLT (or a combination of JSP and XSLT)
No way in XSLT to natively access your properties files
![Page 27: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/27.jpg)
XSLT
Different approaches to i18n in this case: Option 1: Not try to use properties files; instead,
make a separate XSLT stylesheet for each locale (yuck! Must be maintained and manually synchronized with the properties files)
Option 2: Write code to insert the locale into the stylesheet as an XSL variable. Then use Java from within your stylesheet to extract the resource bundle messages (Xalan-Java extensions)
![Page 28: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/28.jpg)
XSLT
XSLT stylesheets can be localized the same way JSPs are.
But, XSLT stylesheets don't have access to the Java HTTP session object that stores the user’s locale information
The locale must be inserted into the XSLT and passed to the Xalan-Java objects
![Page 29: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/29.jpg)
XSLT: An i18n (not l10n yet) Stylesheet
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inl="http://www.insightnl.com"xmlns:message="http://xml.apache.org/xalan/java/com.uprr.app.inl.util.ResourceBundleUtil" version="0.1"> <!-- $locale gets inserted here --> <xsl:template match="/"> <!-- Do some fancy HTML --> <xsl:value-of select="message:getMessage($locale,’hello.message’)"/> <!-- Do some more fancy HTML --></xsl:template></xsl:stylesheet>
![Page 30: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/30.jpg)
XSLT: Retrieving the Stylesheet and Inserting the Locale
* Note: we store our XSLT in the DB
![Page 31: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/31.jpg)
XSLT: Retrieving the Stylesheet and Inserting the Locale
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"indent="yes"/>
<xsl:template match="xsl:stylesheet"><xsl:element name="xsl:stylesheet">
<xsl:element name="xsl:variable"><xsl:attribute
name="name">locale</xsl:attribute><xsl:text>en_US</xsl:text>
</xsl:element><xsl:apply-templates/>
</xsl:element></xsl:template>
<xsl:template match="*|@*|text()"><xsl:copy>
<xsl:apply-templates select="*|@*|text()"/></xsl:copy>
</xsl:template></xsl:stylesheet>
i18nXSLT
locale insertXSLT
l10nXSLT
![Page 32: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/32.jpg)
The Process of i18n
i18n (create properties files and remove hard-coded values)
Send translations to translatorsReceive translations and perform
l10nDeploy and have customers
acceptance test
![Page 33: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/33.jpg)
Recap
Terms: i18n, l10n, localeJ2SE support for i18nJ2EE support for i18nHow internationalizing a J2EE can
impact XSLT-based front-endsThe Process
![Page 34: Omaha Java Users Group Java Internationalization Presented by Jason Shepherd 16-May-2005 6:30 PM](https://reader035.vdocuments.site/reader035/viewer/2022062500/5697c0281a28abf838cd68ea/html5/thumbnails/34.jpg)
Questions?
Questions, comments, taunts, or exclamations?
I’ll give you an exclamation:
Flippin’ sweet!