1 / 26

Matt Wheeler

Internationalization and the Java Stack Part 1. Matt Wheeler. Notes. This is a training NOT a presentation Please ask questions Prerequisites Introduction to Java Stack Introduction to Spring Basic Java and XML skills Installed LdsTech IDE (or other equivalent – good luck there ;).

damien
Download Presentation

Matt Wheeler

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Internationalization and the Java Stack Part 1 Matt Wheeler

  2. Notes • This is a training NOT a presentation • Please ask questions • Prerequisites • Introduction to Java Stack • Introduction to Spring • Basic Java and XML skills • Installed LdsTech IDE (or other equivalent – good luck there ;)

  3. Overview • Internationalization in general • Java Internationalization (ResourceBundle) • Spring Internationalization (MessageSource) • MessageSource vs. ResourceBundle • Spring Helpers • JSP tags • Locale resolver • Locale change interceptor

  4. Internationalization in General (I18n) • "Internationalization, in relation to computer programming, is the process of designing and writing an application so that it can be used in a global or multinational context. An internationalized program is capable of supporting different languages, as well as date, time, currency, and other values, without software modification.“

  5. Internationalization (continued) • "Internationalization is the process of designing software so that it can be adapted (localized) to various languages and regions easily, cost-effectively, and in particular without engineering changes to the software. This generally involves isolating the parts of a program that are dependent on language and culture....“ • http://www.ibm.com/developerworks/java/tutorials/j-i18n/section2.html

  6. Localization (L10n) • "Localization is the process of adapting a program for use in a specific locale. A locale is a geographic or political region that shares the same language and customs. Localization includes the translation of text such as user interface labels, error messages, and online help. It also includes the culture-specific formatting of data items such as monetary values, times, dates, and numbers." • http://www.ibm.com/developerworks/java/tutorials/j-i18n/section2.html

  7. Internationalization vs. Localization • Internationalization is developing the application so that it can handle multiple locales without code change • Localization is the process of adding a new locale to an application • Includes translation of resources, …

  8. First Steps of Internationalization • Extract translatable text from code • Load resources for a specific locale • Inject locale specific resources into the application

  9. Java Internationalization (ResourceBundle) • ResourceBundle is the cornerstone of Java internationalization • Backed by different data stores • Property files (PropertyResourceBundle) • Java source code (ListResourceBundle) • Represents a collection of key/value pairs for a given locale

  10. In Practice • Property file(s) • Accessing locale specific resources at runtime #bundle.properties abc=where is the beef #bundle_es.properties #abc=¿dónde está la carne de vaca abc=\u00a8d\u00a2nde est\u00a0 la carne de vaca ResourceBundle.getBundle("bundle").getString("abc") //where is the beef ResourceBundle.getBundle("bundle", new Locale("es")).getString("abc") //¿dónde está la carne de vaca ResourceBundle.getBundle("bundle", new Locale("es", "AR")).getString("abc") //¿dónde está la carne de vaca

  11. Bundle Resolution • The resolution pattern • Concrete example basename + “_” + language1 + “_” + country1 + “_” + variant1 basename + “_” + language1 + “_” + country1 basename + “_” + language1 basename + “_” + language2 + “_” + country2 + “_” + variant2 basename + “_” + language2 + “_” + country2 basename + “_” + language2 basename messages_pt_BR.properties messages_pt.properties messages_en_GB.properties messages_en_US.properties messages.properties #basename– messages (and we have a default bundle with that name) # fr would resolve to message.properties # pt_PT_COwould resolve to messages_pt.properties # en would resolve to messages.properties

  12. DEMO

  13. Spring Internationalization (MessageSource) • MessageSource is the cornerstone of Spring internationalization • MessageSource interface • An abstraction to the actual text store of translated resources • Data store can be properties files, database, MarkLogic, … • Implement the interface for the given resource store • Many MessageSource implementations available out of the box including a basic resource bundle source

  14. MessageSource Example • Place resource property files in src/main/bundles • Configure the message source as follows: • MessageSource must have an id of “messageSource” <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <value>classpath:messages</value> <value>classpath:otherbundle</value> </list> </property> <property name="defaultEncoding" value="UTF-8" /> </bean>

  15. Inject MessageSource • Utilize the MessageSource @Inject private MessageSourcemessageSource; public void getAStringInCode(ModelMap model) { String message = messageSource.getMessage("abc", null, "Default text.", Locale.ENGLISH); //do something with the message return; }

  16. MessageSource vs. ResourceBundle • MessageSource being an interface is far more extensible • MessageSource allows all resources to be conglomerated together • MessageSource does parameter replacement automatically • MessageSource can set default encoding #born={0} was born on {1}. String pattern = ResourceBundle.getBundle("whatever", Locale.ENGLISH).getString("born"); MessageFormat.format(pattern, "Billy", new Date()) messageSource.getMessage("born", new Object[] {"Billy", new Date()}, "default", Locale.ENGLISH)

  17. DEMO

  18. Spring MessageSourcetaglib • http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/spring.tld.html#spring.tld.message <%@tagliburi="http://www.springframework.org/tags" prefix="spring"%> <spring:message code="message.key"/> <spring:message code="some.key" arguments="aaa, bbb"/>

  19. DEMO

  20. Lab 1: Internationalize a page https://tech.lds.org/wiki/Internationalization_and_the_Java_Stack_-_Part_1#Lab_1_Internationalize_a_Page

  21. Spring Internationalization Architecture • LocaleResolver • Attempts to determine the current user’s locale • Provides a way to set / cache current user’s locale • LocaleChangeInterceptor • Picks up locale changes (from request parameter by default) • Sets locale on the resolver

  22. Example Configuration • Sample native Spring configuration: • LocaleResolver must have id of “localeResolver” • Now /whatever?sitelanguage=it will change the locale <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="sitelanguage"/> </bean> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>

  23. ChainedLocaleResolver • Based on Spring LocaleResolver interface • Locale resolution on steroids • Sets up multiple locale resolvers from which to determine the user’s locale

  24. ChainedLocaleResolver (configuration) • Basic configuration • Or when using WAM • http://code.lds.org/maven-sites/stack/module.html?module=web-spring/xsddoc/index.html • http://code.lds.org/maven-sites/stack/module.html?module=web-spring/apidocs/org/lds/stack/web/spring/i18n/ChainedLocaleResolver.html xmlns:stack-web="http://code.lds.org/schema/spring/web" <stack-web:locale-resolver /> <stack-web:locale-resolver use-wam-locale= " true" />

  25. Lab 2: Configure Locale Change and Resolution https://tech.lds.org/wiki/Internationalization_and_the_Java_Stack_-_Part_1#Lab_2_Configure_Locale_Change_and_Resolution

  26. Credit where credit is due • http://www.springsource.org/spring-framework#documentation • http://www.ibm.com/developerworks/java/tutorials/j-i18n/section2.html

More Related