MPe*_*ier 7 c# culture resources localization embedded-resource
从一个层次了这个问题,这将是(通过环)来存储所有可用的资源和相关的文化,允许特定文化的用户选择的方式是什么?
进一步说明:
假设有三个资源文件:
我可以在每个称为一个字符串LanguageName.我如何能够以编程方式循环遍历不同的LanguageName值以列出它们(例如列表框)?
编辑:WinForms项目,嵌入式资源.
这是我认为适用于Winforms的解决方案:
// get cultures for a specific resource info
public static IEnumerable<CultureInfo> EnumSatelliteLanguages(string baseName)
{
if (baseName == null)
throw new ArgumentNullException("baseName");
ResourceManager manager = new ResourceManager(baseName, Assembly.GetExecutingAssembly());
ResourceSet set = manager.GetResourceSet(CultureInfo.InvariantCulture, true, false);
if (set != null)
yield return CultureInfo.InvariantCulture;
foreach (CultureInfo culture in EnumSatelliteLanguages())
{
set = manager.GetResourceSet(culture, true, false);
if (set != null)
yield return culture;
}
}
// determine what assemblies are available
public static IEnumerable<CultureInfo> EnumSatelliteLanguages()
{
foreach (string directory in Directory.GetDirectories(AppDomain.CurrentDomain.BaseDirectory))
{
string name = Path.GetFileNameWithoutExtension(directory); // resource dir don't have an extension...
// format is XX or XX-something, we discard directories that can't match.
// could/should be replaced by a regex but we still need to catch cultures errors...
if (name.Length < 2)
continue;
if (name.Length > 2 && name[2] != '-')
continue;
CultureInfo culture = null;
try
{
culture = CultureInfo.GetCultureInfo(name);
}
catch
{
// not a good directory...
continue;
}
string resName = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location) + ".resources.dll";
if (File.Exists(Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, name), resName)))
yield return culture;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何将它用于WindowsFormsApplication1:
List<CultureInfo> cultures = new List<CultureInfo>(EnumSatelliteLanguages("WindowsFormsApplication1.GUILanguage"));
Run Code Online (Sandbox Code Playgroud)