如何使用 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;
}