7

我目前正在6.0 version使用hybris。我们的项目完全基于Backoffice。早些时候,我们为印度尼西亚语言环境配置了in_ID( languageISOcode_countryISOcode) 并且工作正常,但现在客户已请求像id_ID印度尼西亚语言环境一样进行语言环境设置。

请注意,inlanguageISOcode已弃用,id 是languageISOcode印度尼西亚的更新版本。

下面是我们的 hybris 中的代码片段:

final Locale locale = cockpitLocaleService.getCurrentLocale();

LOG.info("locale : " + locale); //Here I'm getting in_ID value of locale in all scenario

它正在调用 java 的 Locale.class 文件,如果我通过了,id_ID那么convertOldISOCodesmethod(inside Locale.class) 也将转换id_IDin_ID.

请参阅下面的代码:

import java.util.Locale;

Locale localeIndonesia = new Locale("id", "ID");

System.out.println(localeIndonesia); //printed in_ID

你能帮我找到id_ID印度尼西亚的语言环境吗?

或者

如果这是 Java 中的错误,那么有什么方法可以在hybri 中获取 id_ID吗?

4

2 回答 2

22

您可以使用以下代码:

Locale locale = new Locale("id", "ID");
System.out.print(locale.toLanguageTag().replace('-', '_')) // printed id_ID

顺便提一句。这不是 Java 中的错误,而是向后兼容的“问题”。Java使用的是ISO 639的第一个版本,后来标准更新了,一些代码也更新了。Java 被设计为完全向后兼容,因此作者决定不更新该代码。这就是为什么“id_ID”更改为“in_ID”的原因。印尼语不是唯一以旧形式使用的代码。至少希伯来语和意第绪语也以旧形式使用。

+---------------------------------+
|  Language  | ISO 639 | ISO 3166 |
|------------|---------|----------|
| Indonesian |   IN    |    ID    |
|   Hebrew   |   HE    |    IW    |
|   Yiddish  |   YI    |    JI    |
+---------------------------------+
于 2019-05-03T07:20:49.507 回答
2

如果您处于提供本地化文件id而不是本地化文件的情况,in并且您无法在本地控制它来更改它,那么以下内容可能会对您有所帮助。

我遇到了无法从翻译文件中读取本地化的情况,因为 Java 会在内部id自动更改id为。inSpringResourceBundleMessageSource依赖于访问由 java Locale 提供的标记,即使我对 Locale 的最佳尝试id仍然导致“进入”。这基本上意味着每当查询印尼语时,in都找不到必要的后缀文件,它会退回到默认的英语。由于本地化是由依赖项生成的,因此我无法控制命名,必须使用id.

由于 Java Locale 是最终的并且它会积极地用 覆盖idin因此没有简单的方法来改变行为。

ResourceBundleMessageSource本身很大程度上依赖于 Locale,所以重写一些方法来改变行为充其量是混乱的。事情比看起来更困难,因为 spring 消息源java.util.ResourceBundle在下面使用,这依赖于 final 并且相当严格Locale

所以最后我设法想出了一个解决方案,我只需编辑我的 Maven pom.xml 文件以使用 maven-antrun-plugin 将id本地化文件复制到in

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-antrun-plugin</artifactId>
     <version>3.0.0</version>
     <executions>
         <execution>             
             <phase>generate-resources</phase>
             <configuration>
                 <target>
                     <copy file="${messagesdir}/myProps_id.properties"
                           tofile="${messagesdir}/myProps_in.properties" />
                 </target>
             </configuration>
             <goals>
                 <goal>run</goal>
             </goals>
         </execution>
     </executions>
</plugin>

这种解决方法对我有用,并且在某种意义上说是干净的,因为我不必想出一个技巧来覆盖 Spring 或 Locale 中的一些硬编码默认行为。

于 2020-10-06T06:55:19.563 回答