2009-08-31 14 views
4

私は、resx-files用のサテライトアセンブリを通じてローカライズできるWinFormsアプリケーションを持っています。ユーザーは実行時にアプリケーション言語を切り替えることができます。利用可能なカルチャの一覧

私の質問は次のとおりです。クライアントとローカライズされたリソースとして出荷されるカルチャを動的に見つける方法はありますか?

答えて

5

私が使用しているコードは次のとおりです。プログラムのサブディレクトリ内の衛星アセンブリを検索する

private static ReadOnlyCollection<CultureInfo> GetAvailableCultures() 
    { 
     List<CultureInfo> list = new List<CultureInfo>(); 

     string startupDir = Application.StartupPath; 
     Assembly asm = Assembly.GetEntryAssembly(); 

     CultureInfo neutralCulture = CultureInfo.InvariantCulture; 
     if (asm != null) 
     { 
      NeutralResourcesLanguageAttribute attr = Attribute.GetCustomAttribute(asm, typeof(NeutralResourcesLanguageAttribute)) as NeutralResourcesLanguageAttribute; 
      if (attr != null) 
       neutralCulture = CultureInfo.GetCultureInfo(attr.CultureName); 
     } 
     list.Add(neutralCulture); 

     if (asm != null) 
     { 
      string baseName = asm.GetName().Name; 
      foreach (string dir in Directory.GetDirectories(startupDir)) 
      { 
       // Check that the directory name is a valid culture 
       DirectoryInfo dirinfo = new DirectoryInfo(dir); 
       CultureInfo tCulture = null; 
       try 
       { 
        tCulture = CultureInfo.GetCultureInfo(dirinfo.Name); 
       } 
       // Not a valid culture : skip that directory 
       catch (ArgumentException) 
       { 
        continue; 
       } 

       // Check that the directory contains satellite assemblies 
       if (dirinfo.GetFiles(baseName + ".resources.dll").Length > 0) 
       { 
        list.Add(tCulture); 
       } 

      } 
     } 
     return list.AsReadOnly(); 
    } 
0

私たちが見つけた最も簡単な方法は、衛星アセンブリファイルを見て、標準の "en-US"スタイル名を使用する親ディレクトリ名から試してみることでした。

関連する問題