【问题标题】:Correct locale for Indonesia( "id_ID" Vs "in_ID" )?印度尼西亚的正确语言环境(“id_ID”与“in_ID”)?
【发布时间】:2019-09-21 03:56:17
【问题描述】:

我目前正在使用 hybris6.0 version。我们的项目完全基于Backoffice。之前我们为印度尼西亚语言环境配置了in_ID (languageISOcode_countryISOcode) 并且工作正常,但现在客户要求将语言环境设置为印度尼西亚语言环境的id_ID

请注意,languageISOcode 已弃用,id 是印度尼西亚更新后的languageISOcode

下面是我们hybris中的sn-p代码:

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,那么 convertOldISOCodes 方法(在 Locale.class 内部)也在将 id_ID 转换为 in_ID

请看下面的代码:

import java.util.Locale;

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

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

您能否帮我将id_ID 设置为印度尼西亚的语言环境。

如果它是 Java 中的错误,那么有没有办法在 hybris 中获取 id_ID ?

【问题讨论】:

  • 您运行的是什么版本的 Java?我在 1.7.0_79、1.8.0_181 和 11.0.1 上进行了测试,所有这三个版本都有 toLanguageTag()Locale.forLanguageTag("id-ID")Locale.forLanguageTag("in-ID") 返回 id-ID
  • 嗨 Andreas,我也将 toLanguageTag() 设为“id-ID”,但我需要将语言环境值设为“id_ID”,请您帮我获取印度尼西亚语言环境的确切值作为“id_ID”在 hybris 端或 java 端(也可以)。

标签: java localization locale hybris backoffice


【解决方案1】:

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

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

由于 Java 语言环境是最终的,并且它会用in 积​​极地覆盖id,因此没有简单的方法来改变这种行为。

ResourceBundleMessageSource 本身在很大程度上依赖于 Locale,因此重写一些方法来改变行为充其量只是一团糟。事情比看起来更困难,因为spring消息源在下面使用java.util.ResourceBundle,这依赖于最终且相当严格的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 中的一些硬编码默认行为。

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    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    |
    +---------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      相关资源
      最近更新 更多