通过Java和Javascript API,您可以在以下类型的资源中国际化字符串:
有关国际化和本地化流程的概述,请参阅组件国际化。
com.day.cq.i18n
Java包允许您在UI中显示本地化字符串。 I18n
类提供从AEM词典中检索本地化字符串的get
方法。 get
方法唯一必需的参数是英语中的字符串文字。 英语是UI的默认语言。 以下示例将单词Search
本地化:
i18n.get("Search");
以英语标识字符串不同于典型的国际化框架,在该框架中,ID标识字符串,并在运行时用于引用字符串。 使用英文字符串文本具有以下好处:
可通过两种方式确定用户首选的语言:
用户帐户的语言属性是首选方法,因为它更可靠。 但是,用户必须登录才能使用此方法。
I18n类提供两个构造函数。 确定用户首选语言的方式确定要使用的构造函数。
要以用户帐户中指定的语言显示字符串,请使用以下构造函数(在导入com.day.cq.i18n.I18n)
之后):
I18n i18n = new I18n(slingRequest);
构造函数使用SlingHTTPRequest
检索用户的语言设置。
要使用页面区域设置确定语言,您首先需要获取所请求页面语言的资源包:
Locale pageLang = currentPage.getLanguage(false);
ResourceBundle resourceBundle = slingRequest.getResourceBundle(pageLang);
I18n i18n = new I18n(resourceBundle);
使用I18n
对象的get
方法来国际化字符串。 get
方法唯一必需的参数是要国际化的字符串。 该字符串与Translator词典中的字符串相对应。 get方法会在词典中查找字符串,并返回当前语言的翻译。
get
方法的第一个参数必须符合以下规则:
String
的变量不可接受。i18n.get("Enter a search keyword");
指定国际化字符串的翻译提示以区分词典中的重复字符串。 使用get
方法的第二个可选参数提供翻译提示。 翻译提示必须与词典中项目的Comment属性完全匹配。
例如,词典包含字符串Request
两次:曾经是动词,曾经是名词。 以下代码在get
方法中包含翻译提示作为参数:
i18n.get("Request","A noun, as in a request for a web page");
在本地化字符串中包含变量,以将上下文含义构建到句子中。 例如,登录Web应用程序后,主页显示消息“欢迎返回管理员”。 收件箱中有2条邮件。” 页面上下文确定用户名和消息数量。
在字典中,变量在字符串中表示为方括号内的索引。将变量的值指定为get
方法的参数。 参数位于转换提示之后,且索引与参数的顺序相对应:
i18n.get("Welcome back {0}. You have {1} messages.", "user name, number of messages", user.getDisplayName(), numItems);
国际化字符串和翻译提示必须与词典中的字符串和注释完全匹配。 通过提供null
值作为第二个参数,可以忽略本地化提示。
I18N
类定义静态get
方法,当您需要本地化少量字符串时,该方法非常有用。 除了对象get
方法的参数之外,静态方法还要求使用SlingHttpRequest
对象或您使用的ResourceBundle
,具体取决于您确定用户首选语言的方式:
使用用户的语言首选项:提供SlingHttpRequest作为第一个参数。
I18n.get(slingHttpRequest, "Welcome back {}. You have {} messages.", "user name, number of messages", user.getDisplayName(), numItems);
使用页面语言:提供ResourceBundle作为第一个参数。
I18n.get(resourceBundle,"Welcome back {}. You have {} messages.", "user name, number of messages", user.getDisplayName(), numItems);
Javascript API允许您将字符串本地化到客户端上。 与Java和JSP代码一样,Javascript API允许您识别要本地化的字符串,提供本地化提示,并在本地化的字符串中包含变量。
granite.utils
客户端库文件夹提供Javascript API。 要使用API,请在您的页面上包含此客户端库文件夹。 本地化函数使用Granite.I18n
命名空间。
在显示本地化字符串之前,您需要使用Granite.I18n.setLocale
函数设置区域设置。 函数需要区域设置的语言代码作为参数:
Granite.I18n.setLocale("fr");
要显示本地化字符串,请使用Granite.I18n.get
函数:
Granite.I18n.get("string to localize");
以下示例将字符串“Welcome back”国际化:
Granite.I18n.setLocale("fr");
Granite.I18n.get("string to localize", [variables], "localization hint");
函数参数与Java I18n.get方法不同:
以下示例使用Javascript将“欢迎返回管理员”本地化。 收件箱中有2条邮件。” 句子:
Granite.I18n.setLocale("fr");
Granite.I18n.get("Welcome back {0}. You have {1} new messages in your inbox.", [username, numMsg], "user name, number of messages");
UI字符串通常基于JCR节点属性。 例如,页面的jcr:title
属性通常用作页面代码中h1
元素的内容。 I18n
类提供了用于本地化这些字符串的getVar
方法。
以下示例JSP脚本从存储库中检索jcr:title
属性,并在页上显示本地化字符串:
<% title = properties.get("jcr:title", String.class);%>
<h1><%=i18n.getVar(title) %></h1>
与Java API🔗中的翻译提示类似,您可以提供翻译提示以区分词典中的重复字符串。 将翻译提示作为包含国际化属性的节点的属性提供。 提示属性的名称由带有_commentI18n
后缀的国际化属性名称的名称组成:
${prop}_commentI18n
例如,cq:page
节点包含正在本地化的jcr:title属性。 提示将作为名为jcr:title_commentI18n的属性的值提供。
测试您的UI中的所有字符串是否都已国际化。 要查看涵盖的字符串,请将用户语言设置为zz_ZZ,然后在Web浏览器中打开UI。 国际化字符串将以下格式显示为存根转换:
USR_*Default-String*_尠
下图显示了AEM主页的存根翻译:
要为用户设置语言,请为用户帐户配置首选项节点的语言属性。
用户的“首选项”节点的路径如下:
/home/users/<letter>/<hash>/preferences