Java 印度尼西亚的正确地区设置(“id”与“in”中的“id”)?

Java 印度尼西亚的正确地区设置(“id”与“in”中的“id”)?,java,localization,locale,hybris,backoffice,Java,Localization,Locale,Hybris,Backoffice,我目前正在使用hybris的6.0版本。我们的项目完全基于后台。早些时候,我们在印尼语言环境的(languageISOcode\u countryISOcode)中配置了,工作正常,但现在客户端请求为印尼语言环境设置为ID\u ID 请注意,inlanguageISOcode已弃用,id是印度尼西亚更新的languageISOcode 下面是我们的hybris中的代码片段: final Locale locale = cockpitLocaleService.getCurrentLocale()

我目前正在使用hybris的
6.0版本。我们的项目完全基于后台。早些时候,我们在印尼语言环境的
languageISOcode\u countryISOcode
)中配置了
,工作正常,但现在客户端请求为印尼语言环境设置为
ID\u ID

请注意,in
languageISOcode
已弃用,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\u id
,那么
convertOldISOCodes
方法(在
Locale.class
中)也在将
id\u id
转换为
in\u id

请参阅下面的代码:

import java.util.Locale;

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

System.out.println(localeIndonesia); //printed in_ID
你能帮我把印尼的
id\u id
作为当地语言吗


如果它是Java中的一个bug,那么有没有办法在hybris中获得id\u id?

您可以使用以下代码:

Locale=newlocale(“id”、“id”);
System.out.print(locale.toLanguageTag().replace('-','''.')//打印id\u id
顺便说一句,这不是Java中的错误,而是向后兼容性的“问题”。Java使用ISO 639的第一个版本。后来,标准更新了,一些代码也更新了。Java被设计为完全向后兼容,因此作者决定不更新这些代码。这就是为什么“id_id”更改为“in_id”的原因。印尼语并不是唯一以旧形式使用的代码。至少希伯来语和意第绪语也用在旧形式中

+---------------------------------+
|  Language  | ISO 639 | ISO 3166 |
|------------|---------|----------|
| Indonesian |   IN    |    ID    |
|   Hebrew   |   HE    |    IW    |
|   Yiddish  |   YI    |    JI    |
+---------------------------------+

如果您所处的情况是,本地化文件提供了
id
,而不是
中的
,并且您无法在本地对其进行控制以更改此设置,那么以下内容可能会对您有所帮助

我面临的情况是,我无法从
id
翻译文件中读取本地化信息,因为Java会在内部将
id
更改为
。Spring
ResourceBundleMessageSource
依赖于访问java语言环境提供的标记,即使是我最好的获取
id
Locale的尝试也会导致仍然获取“in”。这基本上意味着,无论何时查询印尼语,都无法在
后缀文件中找到必要的
,并返回到默认英语。由于本地化是由依赖项生成的,因此我无法控制命名,必须使用
id

由于Java语言环境是最终的,并且它在
中用
积极地覆盖
id
,因此没有简单的方法来更改行为

ResourceBundleMessageSource
本身很大程度上依赖于区域设置,因此重写某些方法来更改行为充其量也会很混乱。事情比看起来更困难,因为spring消息源在下面使用
java.util.ResourceBundle
,这依赖于最终的、相当严格的
语言环境

因此,最后我设法想出了一个解决方案,我只需编辑我的Maven pom.xml文件,使用Maven antrun插件将
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>

org.apache.maven.plugins
maven antrun插件
3.0.0
产生资源
跑

这个变通方法对我来说很有效,而且从某种意义上讲很干净,我不需要想出一个方法来覆盖Spring或Locale中的一些硬编码默认行为。

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