Use Case: You want to display certain text in page based on page language
Prerequisite: http://sling.apache.org/site/internationalization-support-i18n.html
Solution: You can use i18n bundle approach for this
Suppose you want to display certain text for a component in different language based on page language or URL. Take an example of /apps/geometrixx/components/homepage component.
1) Create a i18n node under /apps/geometrixx/components/homepage of type sling:Folder
2) create a node of type sling:Folder under i18n of mixin type mix:language
3) Add a property called jcr:language and assign value of lang code or lang_COUNTRY
Structure would be like
/apps/myApp
+-- English (nt:folder, mix:language)
| +-- jcr:language = en
| +-- mx (sling:messageEntry)
| +-- sling:key = "msgXXX"
| +-- slign:message = "An Application Text"
+-- Deutsch (nt:folder, mix:language)
+-- jcr:language = de
+-- mx (sling:messageEntry)
+-- sling:key = "msgXXX"
+-- slign:message = "Ein Anwendungstext"
4) Then on jsp page use following code
<cq:setContentBundle/>
<%
Locale pageLocale = currentPage.getLanguage(false);
//If above bool is set to true. CQ looks in to page path rather than jcr:language property.
ResourceBundle resourceBundle = slingRequest.getResourceBundle(pageLocale);
I18n i18n = new I18n(resourceBundle);
%>
I am printing using I18n <%=i18n.get("updateLocations") %>
I am printing using fmt:message now <fmt:message key="updateLocations"/>
I found page locale is <%=pageLocale.toString() %>
You can also test language using grid under http://localhost:4502/libs/cq/i18n/translator.html
More Info: http://labs.sixdimensions.com/blog/dklco/2012-05-25/adobe-cq5-translator
To change what languages are shown in the translator's grid, create a multi-value string property /etc/languages/languages (node structure must be created), containing the iso language codes (e.g. ["de", "fr", …]). The default is hard coded in the translator and maps the ootb CQ languages: ['de', 'fr', 'it', 'es', 'ja', 'zh-cn']
Some More Good blog Post on this:
http://blogs.adobe.com/dekesmith/2012/10/21/internationalization-within-sling-and-cq
Prerequisite: http://sling.apache.org/site/internationalization-support-i18n.html
Solution: You can use i18n bundle approach for this
Suppose you want to display certain text for a component in different language based on page language or URL. Take an example of /apps/geometrixx/components/homepage component.
1) Create a i18n node under /apps/geometrixx/components/homepage of type sling:Folder
2) create a node of type sling:Folder under i18n of mixin type mix:language
3) Add a property called jcr:language and assign value of lang code or lang_COUNTRY
Structure would be like
/apps/myApp
+-- English (nt:folder, mix:language)
| +-- jcr:language = en
| +-- mx (sling:messageEntry)
| +-- sling:key = "msgXXX"
| +-- slign:message = "An Application Text"
+-- Deutsch (nt:folder, mix:language)
+-- jcr:language = de
+-- mx (sling:messageEntry)
+-- sling:key = "msgXXX"
+-- slign:message = "Ein Anwendungstext"
4) Then on jsp page use following code
<cq:setContentBundle/>
<%
Locale pageLocale = currentPage.getLanguage(false);
//If above bool is set to true. CQ looks in to page path rather than jcr:language property.
ResourceBundle resourceBundle = slingRequest.getResourceBundle(pageLocale);
I18n i18n = new I18n(resourceBundle);
%>
I am printing using I18n <%=i18n.get("updateLocations") %>
I am printing using fmt:message now <fmt:message key="updateLocations"/>
I found page locale is <%=pageLocale.toString() %>
You can also test language using grid under http://localhost:4502/libs/cq/i18n/translator.html
More Info: http://labs.sixdimensions.com/blog/dklco/2012-05-25/adobe-cq5-translator
To change what languages are shown in the translator's grid, create a multi-value string property /etc/languages/languages (node structure must be created), containing the iso language codes (e.g. ["de", "fr", …]). The default is hard coded in the translator and maps the ootb CQ languages: ['de', 'fr', 'it', 'es', 'ja', 'zh-cn']
Some More Good blog Post on this:
http://blogs.adobe.com/dekesmith/2012/10/21/internationalization-within-sling-and-cq
Hi Yogesh,
ReplyDeletethanks for this article. Could you please be more specific what needs to be done so I can see a different language in the cq translator? I tried to do the structure, but with no result, still have the hardcoded list.
Thanks
Jan
@Jan,
DeleteDone. http://www.wemblog.com/2012/06/how-to-add-new-supported-language-in-cq.html
Yogesh
Thanks - this was really useful
ReplyDeleteAnother point to note is that you may want to have separate bundles for different applications.
To do this, place a property "sling:basename" under myApps/i18n/en of a value (e.g. "TEST")
Then reference either by
or
slingRequest.getResourceBundle("TEST", pageLocale);
depending on the message you are using to access the bundle
I'll write a blog post about this shortly
Tim,
DeleteThanks for your feedback. For some reason I don't see [sling:Language] as registered mixin node type in CQ5.5 or in CQ5.6
[sling:Language]
mixin
- sling:basename (string)
- sling:basename (string) multiple
Have you used this feature in CQ ?
Yogesh
Hi Yogesh,
ReplyDeleteThanks for the info you have provided. I have a question on using the below line of code.
<%=i18n.get("updateLocations") %>
It works if I use pass String literal to i18n.get() method but doesn't work when I pass object reference. Do you have any idea why?
String gtBodyText = "Name";
<%=i18n.get(gtBodyText) %>
Thanks,
Stephen
Stephen,
DeleteThat could be bug. Can you please work with daycare on this ?
Yogesh
I have a component and try to print this fmt:message key="firstname"
ReplyDeleteIt works well for en,fr,de but not for en_UK and en_US.
Is it needed to select the language for the parent path in page properties
Ex: content/geometrixx/en/test.html - works fine
content/geometrixx/en_UK/test.html - the key is returned as value and it is printed.
I'm having the dame issue. How did you fix ir?
DeleteHave you tried Locale pageLocale = currentPage.getLanguage(false) ?
DeleteIt is genuinely very useful for me.
ReplyDelete