2009-02-16 40 views
22

我在設計使用.resx文件的多語言應用程序。獲取所有可用語言的程序化方法(在衛星程序集中)

我有幾個文件像GlobalStrings.resx,GlobalStrings.es.resx,GlobalStrings.en.resx等 當我想使用這個,我只需要設置Thread.CurrentThread.CurrentCulture。

問題: 我有所有可用的語言組合框,但我這個手動加載:

comboLanguage.Items.Add(CultureInfo.GetCultureInfo("en")); 
comboLanguage.Items.Add(CultureInfo.GetCultureInfo("es")); 

我已經與

cmbLanguage.Items.AddRange(CultureInfo.GetCultures(CultureTypes.UserCustomCulture)); 

嘗試沒有成功。還嘗試過CultureTypes中的所有元素,但我只是得到了一大堆沒有使用的語言或空列表。

有什麼辦法只獲得支持的語言?

回答

1

使用什麼符文格里姆斯塔說,我結束了這一點:

string executablePath = Path.GetDirectoryName(Application.ExecutablePath); 
string[] directories = Directory.GetDirectories(executablePath); 
foreach (string s in directories) 
{ 
    try 
    { 
     DirectoryInfo langDirectory = new DirectoryInfo(s); 
     cmbLanguage.Items.Add(CultureInfo.GetCultureInfo(langDirectory.Name)); 
    } 
    catch (Exception) 
    { 

    } 
} 

或另一種方式

int pathLenght = executablePath.Length + 1; 
foreach (string s in directories) 
{ 
    try 
    { 
     cmbLanguage.Items.Add(CultureInfo.GetCultureInfo(s.Remove(0, pathLenght))); 
    } 
    catch (Exception) 
    { 

    } 
} 

我仍然認爲這不是一個好主意...

+0

我認爲這是我們得到的唯一解決方案。我在同一條船上。 – Jippers 2010-03-25 21:42:58

+0

這不會得到你的依賴部署的資源目錄(如果有的話)嗎?所以你可能最終會遇到一些你不支持的文化,但是你的一些依賴關係可以做到。 – 2017-04-25 14:32:54

2

我不知道獲取語言,也許你可以掃描安裝文件夾的dll文件,但將您的語言設置爲不支持的語言不應該是一個問題。

如果沒有找到文化特定文件,.NET將回退到文化中性資源,因此您可以安全地選擇不受支持的語言。

只要您自己控制應用程序,您就可以將可用語言存儲在某處的應用程序設置中。只是一個逗號分隔的字符串與文化的名字就足夠了:「恩,ES」

37

您可以用編程方式列出您的應用程序中可用的文化

// Pass the class name of your resources as a parameter e.g. MyResources for MyResources.resx 
ResourceManager rm = new ResourceManager(typeof(MyResources)); 

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
foreach (CultureInfo culture in cultures) 
{ 
    try 
    { 
     ResourceSet rs = rm.GetResourceSet(culture, true, false); 
     // or ResourceSet rs = rm.GetResourceSet(new CultureInfo(culture.TwoLetterISOLanguageName), true, false); 
     string isSupported = (rs == null) ? " is not supported" : " is supported"; 
     Console.WriteLine(culture + isSupported); 
    } 
    catch (CultureNotFoundException exc) 
    { 
     Console.WriteLine(culture + " is not available on the machine or is an invalid culture identifier."); 
    } 
} 
+0

請注意`GlobalStrings.resx`將在InvariantCulture下檢測到。 – Hans 2014-07-18 23:20:27

1

基於由@漢斯 - holzbart答案,但固定不返回InvariantCulture的也和包裹成一個可重複使用方法:使用方法

public static IEnumerable<CultureInfo> GetAvailableCultures() 
{ 
    List<CultureInfo> result = new List<CultureInfo>(); 

    ResourceManager rm = new ResourceManager(typeof(Resources)); 

    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
    foreach (CultureInfo culture in cultures) 
    { 
    try 
    { 
     if (culture.Equals(CultureInfo.InvariantCulture)) continue; //do not use "==", won't work 

     ResourceSet rs = rm.GetResourceSet(culture, true, false); 
     if (rs != null) 
     result.Add(culture); 
    } 
    catch (CultureNotFoundException) 
    { 
     //NOP 
    } 
    } 
    return result; 
} 

,你可以得到的字符串添加到列表一些組合框與以下:

public static ObservableCollection<string> GetAvailableLanguages() 
{ 
    var languages = new ObservableCollection<string>(); 
    var cultures = GetAvailableCultures(); 
    foreach (CultureInfo culture in cultures) 
    languages.Add(culture.NativeName + " (" + culture.EnglishName + " [" + culture.TwoLetterISOLanguageName + "])"); 
    return languages; 
} 
4

這將是對下面的語句的基礎上的解決方案之一:
特定語言的每顆衛星組件命名相同但位於以特定文化命名的子文件夾中,例如fr或fr-CA。

public IEnumerable<CultureInfo> GetSupportedCulture() 
{ 
    //Get all culture 
    CultureInfo[] culture = CultureInfo.GetCultures(CultureTypes.AllCultures); 

    //Find the location where application installed. 
    string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); 

    //Return all culture for which satellite folder found with culture code. 
    return culture.Where(cultureInfo => Directory.Exists(Path.Combine(exeLocation, cultureInfo.Name))); 
} 
相關問題