Internationalization and the Java Stack Part 2 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 – Internationalization and the Java Stack Part 1 – Installed LdsTech IDE (or other equivalent)
Overview Stack provided internationalization tools Message source expression language resolver JS Message Source RequireJS Message Source Internationalization best practices Internationalization testing Dynamic pseudo translation
Expression Language Resolver Provided message resolver can be utilized in EL sites/stack/module.html?module=web- spring/#El_Message_Source ${messages['abc.def.ghi']}
JavaScript MessageSource Configuration classpath:messages messageSourceController
MessageSource with JS Usage in a JSP page var msgs = { "index.welcome":"Welcome", "accessDenied.accessdenied":"Access Denied", "def":"{0} asdfa asdfasd {1} asdfasd asdf ", "index.mainpage":"Main page - {0}“ }; alert(msgs['index.welcome']);
RequireJS MessageSource Configuration classpath:messages
MessageSource with RequireJS Usage define([ 'tmpl!example/templates/list', 'i18n!nls/messages' ], function (listTemplate, messages) { alert(messages['createExample_loading']); }; define({"root": { "createExample_loading":"Carga…", "createExample_form_label_data":"Datos:", "createExample_form_label_name":"Nombre:", "createExample_form_message_success":"Ejemplo \" \" se ha …" "createExample_form_button_save":"Cree Ejemplo“ } });
DEMO
Some I18n Best Practices Externalize ALL translatable text Do not concatenate translations Create duplicate / separate resources Avoid text in images Introduce pseudo-translation tool
Externalize ALL Text Example – Name: – Notice that we have concatenated the : with the translated name label "Name:" including the colon should be externalized – Concatenation itself is a best practice violation – : and associated formatting can be different – It might also be in a different order #messages.properties name.label=Name #JSP page ${messages['name.label']}: #messages.properties name.label=Name: #JSP page ${messages['name.label']}
Do NOT Concatenate Translations For example: Attempted usage: #messages.properties key1=Someone named key2=likes hiking. #JSP Page ${messages['key1']} Billy ${messages['key2']}
More Correct Way Create a single string with replaceable parameters Sentence maintains context – Parameters can be moved around to accommodate language grammar For example: And then it will be used as follows: key=Someone named {0} likes hiking.
Create Separate Resources Counter-intuitive to code reuse concept Same English strings should not be shared Within the same application, or even the same page Create a separate key value pair for each occurrence Words change based on context Concept of masculine and/or feminine, age classes, … Or usage Similar English words may not be similar in another language
DEMO
Avoid Placing Text in Images An image that contains text will require a new image for each language It will also require a custom way to load the image Impose the text over the image, using.css or other ingenious alternative – Then the text can be stored in the resource bundles with all other strings – And it won’t require a new image for each language
DEMO
I18n Testing (Dynamic Pseudo Translation) Configured to translate for specified locales Simplifies testing – Expansion – Special characters – Completeness – zz locale sites/stack/module.html?module=web- spring/#Pseudo_Translation_Message_Source_Faca de
Dynamic Pseudo Translation The trick (delegate) <bean id="delegatingMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> classpath:messages
Example
DEMO
Credit where credit is due iple_meanings
Lab 1: Internationalize a page the_Java_Stack_- _Part_2#Lab_1_Pseudo_Translator