2011-04-07 174 views
8

我得到ISO2語言代碼是這樣的:如何獲取語言環境的ISO2語言代碼?

public String getLang(Locale language) 
    return language.toString().substring(0,2).toLowerCase() 
} 

有沒有更好的方式來做到這一點?

編輯:當我使用getLanguage時,我得到一個空字符串。

+3

您的方法並不安全。例如。 Aragonese的ISO3代碼是'arg',而ISO2代碼是'an'。 – 2016-07-29 00:36:39

回答

0

Locale locale = ?; locale.getLanguage();

11

什麼

public String getLang(Locale language) 
    return language.getLanguage(); 
} 

當然,這僅是一個ISO 639-1 2 lettercode如果有這種語言定義的,否則它可能會返回一個3個字母的代碼(甚至更長)。


您的代碼會給愚蠢的結果,如果你有沒有語言代碼語言環境(如_DE)(我將回空字符串,這是一個好一點,恕我直言)。如果區域設置包含語言代碼,則它將返回該語言代碼,但您不需要撥打toLowerCase()

+0

對我而言,這返回「nl_be」,而不是預期的「nl」。這怎麼可能?我不得不使用locale.getLanguage()。split(「_」)[0]得到它:( – Wouter 2014-04-23 07:36:13

2

我有同樣的問題,這是我發現的。

如果用構造函數創建Locale

Locale locale = new Locale("en_US"); 

然後調用getLanguage

String language = locale.getLanguage(); 

language值將是 「EN_US」;

如果創建Locale與建築商:

Locale locale = new Locale.Builder().setLanguage("en").setRegion("US").build() 

那麼該值locale.getLanguage()將返回將是 「恩」。

這對我來說很奇怪,但它是它實施的方式。

因此,如果您希望語言代碼返回兩個字母的ISO語言(需要使用Java Locale構建器或進行一些字符串操作),那麼這是解釋的長答案。

您的方法與substring的作品,但我會用我寫下面的東西來涵蓋分隔符可能是「 - 」或「_」的情況。

public String getLang(Locale language) 
    String[] localeStrings = (language.split("[-_]+")); 
    return localeStrings[0]; 
} 
相關問題