And*_*nea 6 .net resources localization resx internationalization
我需要以编程方式列出resx文件组中的可用文化,但ResourceManager类似乎没有帮助.
我可能有 :
Labels.resx
Labels.fr-FR.resx
Labels.ro-RO.resx
Run Code Online (Sandbox Code Playgroud)
等等
但是,如何在运行时找到这三种(或者有多少种)文化?
在应用程序的目录中查找附属程序集:对于每个子目录,检查其名称是否对应于区域性名称,以及它是否包含.resources.dll文件:
public IEnumerable<CultureInfo> GetAvailableCultures()
{
var programLocation = Process.GetCurrentProcess().MainModule.FileName;
var resourceFileName = Path.GetFileNameWithoutExtension(programLocation) + ".resources.dll";
var rootDir = new DirectoryInfo(Path.GetDirectoryName(programLocation));
return from c in CultureInfo.GetCultures(CultureTypes.AllCultures)
join d in rootDir.EnumerateDirectories() on c.IetfLanguageTag equals d.Name
where d.EnumerateFiles(resourceFileName).Any()
select c;
}
Run Code Online (Sandbox Code Playgroud)
基于 @hans-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;
}
Run Code Online (Sandbox Code Playgroud)
使用该方法,您可以获得要添加到某些 ComboBox 的字符串列表,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)