我唯一能想到的是在外部文件中进行本地化。创建一个xml文件,如:
例如:languagesSupported.xml
<Languages>
<language name="English" file="en.dat" />
<language name="French" file="fr.dat" />
<language name="Japanese" file="jp.dat" />
</Languages>
像这样,您实际上可以稍后添加更多语言。
现在在每个文件中,您需要执行以下操作:
(例如:en.dat)
<Language name="English">
<Localized name="hello" value="Hello">
<Localized name="goodbye" value="Goodbye">
</Language>
(例如:fr.dat)
<Language name="French">
<Localized name="hello" value="Bonjour">
<Localized name="goodbye" value="Au revoir">
</Language>
在您的代码中,您会执行以下操作:
private Dictionary<string, Dictionary<string, string>> _localizations = new Dictionary<string, Dictionary<string, string>>();
private string _currentLocalization = "English";
private bool LoadLocalizations()
{
try
{
if (File.Exists("languagesSupported.xml") == false)
{
return false;
}
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("languagesSupported.xml");
XmlNodeList nodeList = xmldoc.SelectNodes("languages/language");
if (nodeList.Count > 0)
{
foreach (XmlNode node in nodeList)
{
LoadLocalization(node.Attributes["name"].Value, node.Attributes["file"].Value);
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
private bool LoadLocalization(string pLang, string pFile)
{
try
{
if (File.Exists(pFile) == false)
{
return false;
}
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(pFile);
XmlNodeList nodeList = xmldoc.SelectNodes("language/localized");
_localizations.Add(pLang, new Dictionary<string,string>());
if (nodeList.Count > 0)
{
foreach (XmlNode node in nodeList)
{
_localizations[pLang].Add(node.Attributes["name"].Value, node.Attributes["value"].Value);
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
private void SetLocalization()
{
labelHello.text = _localizations[_currentLocalization]["hello"];
labelGoodbye.text = _localizations[_currentLocalization]["goodbye"];
}
之后,每次您的用户更改语言时,您只需更新 _currentLocalization 并调用 SetLocalization();
您甚至可以使用 _localizations 中的键填充您的语言下拉列表。
这样,您就可以使本地化完全动态化。
如果您真的想使用 CultureInfo,只需将文化映射到语言名称即可。