如何使用 cultureInfo 获取国家名称并进行翻译?
How can I get the name of a country with cultureInfo and translate it?
如何获取保存在手机 phone 或平板电脑(Android 和 iOS 设备)的设备设置中的国家名称?可以用 cultureInfo 做到这一点吗?
我想以多种语言显示国家名称。我需要用英文、法文和德文显示国家名称。是否可以自动显示英文、法文和德文国家名称的翻译版本,还是我必须自己翻译所有国家名称?
例如,如果我有这个 cultureInfo = "nl-BE".
结果应如下所示:
string English_name = "Belgium";
string French_name = "Belgique";
string German_name = "Belgien";
我该怎么做?
这并不完美。它以 .NET Framework 本地化版本的语言获取 country/region 的全名。只有当 .NET Framework 的本地化版本对应于所需的语言时,它才会起作用。
显然,.NET Framework 仅以一种语言存储国家名称。
var culture = CultureInfo.CurrentUICulture; // Other get any desired culture info.
var regionInfo = new RegionInfo(culture.Name);
string countryName = regionInfo.DisplayName;
您必须自己实现此翻译功能。您可以使用新的 ValueTuple
(自 C# 7.0 起)创建一个由国家代码和语言代码组成的复合字典键。
public static readonly Dictionary<(string language, string country), string> _countryNames =
new Dictionary<(string language, string country), string> {
[("en","BE")] = "Belgium",
[("fr", "BE")] = "Belgique",
[("de", "BE")] = "Belgien",
[("en", "CH")] = "Switzerland",
[("fr", "CH")] = "Suisse",
[("de", "CH")] = "Schweiz",
// ...
};
示例:获取比利时的英文名称。
string name = _countryNames[("en", "BE")];
或者,当您不确定条目是否存在时:
if (_countryNames.TryGetValue(("en", "BE"), out string name)) {
//TODO: use name
}
您可以通过
获取当前的UI语言
string language = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
您可以使用通用方法通过 alpha2 或 alpha3 获取国家/地区名称。
例如:
public static string GetCountryName(string alpha2code = null, string alpha3code = null, bool nativeName = true)
{
RegionInfo result = null;
if (!String.IsNullOrEmpty(alpha2code))
result = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
?.Where(item => (new RegionInfo(item.LCID))
?.TwoLetterISORegionName.Equals(alpha2code, StringComparison.Ordinal) == true)
?.Select(item => new RegionInfo(item.LCID))
?.FirstOrDefault();
if (!String.IsNullOrEmpty(alpha3code))
result = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
?.Where(item => (new RegionInfo(item.LCID))?.ThreeLetterISORegionName.Equals(alpha3code, StringComparison.Ordinal) == true)
?.Select(item => new RegionInfo(item.LCID))
?.FirstOrDefault();
if (result == null) return String.Empty;
return nativeName ? result.NativeName : result.EnglishName;
}
如何获取保存在手机 phone 或平板电脑(Android 和 iOS 设备)的设备设置中的国家名称?可以用 cultureInfo 做到这一点吗?
我想以多种语言显示国家名称。我需要用英文、法文和德文显示国家名称。是否可以自动显示英文、法文和德文国家名称的翻译版本,还是我必须自己翻译所有国家名称?
例如,如果我有这个 cultureInfo = "nl-BE".
结果应如下所示:
string English_name = "Belgium";
string French_name = "Belgique";
string German_name = "Belgien";
我该怎么做?
这并不完美。它以 .NET Framework 本地化版本的语言获取 country/region 的全名。只有当 .NET Framework 的本地化版本对应于所需的语言时,它才会起作用。
显然,.NET Framework 仅以一种语言存储国家名称。
var culture = CultureInfo.CurrentUICulture; // Other get any desired culture info.
var regionInfo = new RegionInfo(culture.Name);
string countryName = regionInfo.DisplayName;
您必须自己实现此翻译功能。您可以使用新的 ValueTuple
(自 C# 7.0 起)创建一个由国家代码和语言代码组成的复合字典键。
public static readonly Dictionary<(string language, string country), string> _countryNames =
new Dictionary<(string language, string country), string> {
[("en","BE")] = "Belgium",
[("fr", "BE")] = "Belgique",
[("de", "BE")] = "Belgien",
[("en", "CH")] = "Switzerland",
[("fr", "CH")] = "Suisse",
[("de", "CH")] = "Schweiz",
// ...
};
示例:获取比利时的英文名称。
string name = _countryNames[("en", "BE")];
或者,当您不确定条目是否存在时:
if (_countryNames.TryGetValue(("en", "BE"), out string name)) {
//TODO: use name
}
您可以通过
获取当前的UI语言string language = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
您可以使用通用方法通过 alpha2 或 alpha3 获取国家/地区名称。
例如:
public static string GetCountryName(string alpha2code = null, string alpha3code = null, bool nativeName = true)
{
RegionInfo result = null;
if (!String.IsNullOrEmpty(alpha2code))
result = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
?.Where(item => (new RegionInfo(item.LCID))
?.TwoLetterISORegionName.Equals(alpha2code, StringComparison.Ordinal) == true)
?.Select(item => new RegionInfo(item.LCID))
?.FirstOrDefault();
if (!String.IsNullOrEmpty(alpha3code))
result = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
?.Where(item => (new RegionInfo(item.LCID))?.ThreeLetterISORegionName.Equals(alpha3code, StringComparison.Ordinal) == true)
?.Select(item => new RegionInfo(item.LCID))
?.FirstOrDefault();
if (result == null) return String.Empty;
return nativeName ? result.NativeName : result.EnglishName;
}