Asp.net mvc 如何通过传递区域性而不是使用线程区域性来获取RESX字符串

Asp.net mvc 如何通过传递区域性而不是使用线程区域性来获取RESX字符串,asp.net-mvc,localization,cultureinfo,resx,Asp.net Mvc,Localization,Cultureinfo,Resx,我在5种文化/语言的一系列RESX文件中有几个字符串。我有一个MVC视图,其中视图的不同部分需要显示不同的语言(这是一个发票打印卷,其中包含多个发票,每个发票将使用5种语言中的一种) 我有没有办法通过键来获取RESX字符串,并能够显式定义区域性,而不是依赖于线程区域性 我无法使用该线程,因为我的单个视图需要在不同点显示多种语言 我想这样做: @MyRESX.String1("de-DE") @MyRESX.String1("fr-FR") private static readon

我在5种文化/语言的一系列RESX文件中有几个字符串。我有一个MVC视图,其中视图的不同部分需要显示不同的语言(这是一个发票打印卷,其中包含多个发票,每个发票将使用5种语言中的一种)

我有没有办法通过键来获取RESX字符串,并能够显式定义区域性,而不是依赖于线程区域性

我无法使用该线程,因为我的单个视图需要在不同点显示多种语言

我想这样做:

@MyRESX.String1("de-DE") 

@MyRESX.String1("fr-FR") 
   private static readonly List<string> _validCultures = new List<string> { "af", "af-ZA", "sq", "sq-AL", "gsw-FR", "am-ET", "ar", "ar-DZ", "ar-BH", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-YE", "hy", "hy-AM", "as-IN", "az", "az-Cyrl-AZ", "az-Latn-AZ", "ba-RU", "eu", "eu-ES", "be", "be-BY", "bn-BD", "bn-IN", "bs-Cyrl-BA", "bs-Latn-BA", "br-FR", "bg", "bg-BG", "ca", "ca-ES", "zh-HK", "zh-MO", "zh-CN", "zh-Hans", "zh-SG", "zh-TW", "zh-Hant", "co-FR", "hr", "hr-HR", "hr-BA", "cs", "cs-CZ", "da", "da-DK", "prs-AF", "div", "div-MV", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-BZ", "en-CA", "en-029", "en-IN", "en-IE", "en-JM", "en-MY", "en-NZ", "en-PH", "en-SG", "en-ZA", "en-TT", "en-GB", "en-US", "en-ZW", "et", "et-EE", "fo", "fo-FO", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-LU", "fr-MC", "fr-CH", "fy-NL", "gl", "gl-ES", "ka", "ka-GE", "de", "de-AT", "de-DE", "de-LI", "de-LU", "de-CH", "el", "el-GR", "kl-GL", "gu", "gu-IN", "ha-Latn-NG", "he", "he-IL", "hi", "hi-IN", "hu", "hu-HU", "is", "is-IS", "ig-NG", "id", "id-ID", "iu-Latn-CA", "iu-Cans-CA", "ga-IE", "xh-ZA", "zu-ZA", "it", "it-IT", "it-CH", "ja", "ja-JP", "kn", "kn-IN", "kk", "kk-KZ", "km-KH", "qut-GT", "rw-RW", "sw", "sw-KE", "kok", "kok-IN", "ko", "ko-KR", "ky", "ky-KG", "lo-LA", "lv", "lv-LV", "lt", "lt-LT", "wee-DE", "lb-LU", "mk", "mk-MK", "ms", "ms-BN", "ms-MY", "ml-IN", "mt-MT", "mi-NZ", "arn-CL", "mr", "mr-IN", "moh-CA", "mn", "mn-MN", "mn-Mong-CN", "ne-NP", "no", "nb-NO", "nn-NO", "oc-FR", "or-IN", "ps-AF", "fa", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa", "pa-IN", "quz-BO", "quz-EC", "quz-PE", "ro", "ro-RO", "rm-CH", "ru", "ru-RU", "smn-FI", "smj-NO", "smj-SE", "se-FI", "se-NO", "se-SE", "sms-FI", "sma-NO", "sma-SE", "sa", "sa-IN", "sr", "sr-Cyrl-BA", "sr-Cyrl-SP", "sr-Latn-BA", "sr-Latn-SP", "nso-ZA", "tn-ZA", "si-LK", "sk", "sk-SK", "sl", "sl-SI", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-SV", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "sv", "sv-FI", "sv-SE", "syr", "syr-SY", "tg-Cyrl-TJ", "tzm-Latn-DZ", "ta", "ta-IN", "tt", "tt-RU", "te", "te-IN", "th", "th-TH", "bo-CN", "tr", "tr-TR", "tk-TM", "ug-CN", "uk", "uk-UA", "wen-DE", "ur", "ur-PK", "uz", "uz-Cyrl-UZ", "uz-Latn-UZ", "vi", "vi-VN", "cy-GB", "wo-SN", "sah-RU", "ii-CN", "yo-NG" };
@Lang.GetGlobalString("String1", "de-DE")
我可以使用HTML助手手动编写代码,并对字符串进行编码(我只有大约20个字符串),但这感觉很糟糕

public static string GetImplementedCulture(string name)
    {
        // make sure it's not null
        if (string.IsNullOrEmpty(name))
            return GetDefaultCulture(); // return Default culture

        // make sure it is a valid culture first
        if (_validCultures.Where(c => c.Equals(name, StringComparison.InvariantCultureIgnoreCase)).Count() == 0)
            return GetDefaultCulture(); // return Default culture if it is invalid


        // if it is implemented, accept it
        if (_cultures.Where(c => c.Equals(name, StringComparison.InvariantCultureIgnoreCase)).Count() > 0)
            return name; // accept it



        // Find a close match. For example, if you have "en-US" defined and the user requests "en-GB", 
        // the function will return closes match that is "en-US" because at least the language is the same (ie English)  
        var n = GetNeutralCulture(name);
        foreach (var c in _cultures)
            if (c.StartsWith(n))
                return c;



        // else 
        // It is not implemented
        return GetDefaultCulture(); // return Default culture as no match found
    }
这是我发现的一个很好的代码,我一直在我的项目中使用它,您只需添加一个您支持的语言或文化列表,如下所示:

@MyRESX.String1("de-DE") 

@MyRESX.String1("fr-FR") 
   private static readonly List<string> _validCultures = new List<string> { "af", "af-ZA", "sq", "sq-AL", "gsw-FR", "am-ET", "ar", "ar-DZ", "ar-BH", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-YE", "hy", "hy-AM", "as-IN", "az", "az-Cyrl-AZ", "az-Latn-AZ", "ba-RU", "eu", "eu-ES", "be", "be-BY", "bn-BD", "bn-IN", "bs-Cyrl-BA", "bs-Latn-BA", "br-FR", "bg", "bg-BG", "ca", "ca-ES", "zh-HK", "zh-MO", "zh-CN", "zh-Hans", "zh-SG", "zh-TW", "zh-Hant", "co-FR", "hr", "hr-HR", "hr-BA", "cs", "cs-CZ", "da", "da-DK", "prs-AF", "div", "div-MV", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-BZ", "en-CA", "en-029", "en-IN", "en-IE", "en-JM", "en-MY", "en-NZ", "en-PH", "en-SG", "en-ZA", "en-TT", "en-GB", "en-US", "en-ZW", "et", "et-EE", "fo", "fo-FO", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-LU", "fr-MC", "fr-CH", "fy-NL", "gl", "gl-ES", "ka", "ka-GE", "de", "de-AT", "de-DE", "de-LI", "de-LU", "de-CH", "el", "el-GR", "kl-GL", "gu", "gu-IN", "ha-Latn-NG", "he", "he-IL", "hi", "hi-IN", "hu", "hu-HU", "is", "is-IS", "ig-NG", "id", "id-ID", "iu-Latn-CA", "iu-Cans-CA", "ga-IE", "xh-ZA", "zu-ZA", "it", "it-IT", "it-CH", "ja", "ja-JP", "kn", "kn-IN", "kk", "kk-KZ", "km-KH", "qut-GT", "rw-RW", "sw", "sw-KE", "kok", "kok-IN", "ko", "ko-KR", "ky", "ky-KG", "lo-LA", "lv", "lv-LV", "lt", "lt-LT", "wee-DE", "lb-LU", "mk", "mk-MK", "ms", "ms-BN", "ms-MY", "ml-IN", "mt-MT", "mi-NZ", "arn-CL", "mr", "mr-IN", "moh-CA", "mn", "mn-MN", "mn-Mong-CN", "ne-NP", "no", "nb-NO", "nn-NO", "oc-FR", "or-IN", "ps-AF", "fa", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa", "pa-IN", "quz-BO", "quz-EC", "quz-PE", "ro", "ro-RO", "rm-CH", "ru", "ru-RU", "smn-FI", "smj-NO", "smj-SE", "se-FI", "se-NO", "se-SE", "sms-FI", "sma-NO", "sma-SE", "sa", "sa-IN", "sr", "sr-Cyrl-BA", "sr-Cyrl-SP", "sr-Latn-BA", "sr-Latn-SP", "nso-ZA", "tn-ZA", "si-LK", "sk", "sk-SK", "sl", "sl-SI", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-SV", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "sv", "sv-FI", "sv-SE", "syr", "syr-SY", "tg-Cyrl-TJ", "tzm-Latn-DZ", "ta", "ta-IN", "tt", "tt-RU", "te", "te-IN", "th", "th-TH", "bo-CN", "tr", "tr-TR", "tk-TM", "ug-CN", "uk", "uk-UA", "wen-DE", "ur", "ur-PK", "uz", "uz-Cyrl-UZ", "uz-Latn-UZ", "vi", "vi-VN", "cy-GB", "wo-SN", "sah-RU", "ii-CN", "yo-NG" };
@Lang.GetGlobalString("String1", "de-DE")
private static readonly List\u validCultures=新列表{“af”、“af ZA”、“sq”、“sq AL”、“gsw FR”、“am ET”、“ar”、“ar”、“ar DZ”、“ar BH”、“ar EG”、“ar IQ”、“ar JO”、“ar KW”、“ar LB”、“ar LY”、“ar MA”、“ar OM”、“ar QA”、“ar SA”、“ar SY”、“ar TN”、“ar AE”、“ar YE”、“hy am”、“as IN”、“az”、“az”、“az Cyrl az”、“az Latn az”、“ba RU”、“eu”、“eu ES”,“be”、“be BY”、“bn BD”、“bn IN”、“bs Cyrl BA”、“bs Latn BA”、“br FR”、“bg”、“bg bg”、“ca”、“ca ES”、“zh HK”、“zh MO”、“zh CN”、“zh Hans”、“zh SG”、“zh TW”、“zh Hant”、“co FR”、“hr”、“hr BA”、“cs”、“cs CZ”、“da”、“da DK”、“prs AF”、“div”、“div MV”、“nl”、“nl be”、“nl nl nl nl”、“en”、“en”、“en AU”、“en BZ”、“en ca”、“en-029”、“en-IN”、“en-IE”、“en-JM”“,”en MY“,”en NZ“,”en PH“,”en SG“,”en ZA“,”en TT“,”en GB“,”en US“,”en ZW“,”et EE“,”fo“,”fo-fo“,”fil-PH“,”fi-fi“,”fr-fi“,”fr-LU“,”fr-MC“,”fr-CH“,”fy-NL“,”gl-NL“,”gl“,”ka“,”ka“,”de“,”de“,”de-AT“,”de-de“,”de-LI“,”de-LU,“he-IL”、“hi”、“hi-IN”、“hu”、“hu-hu”、“is”、“is”、“ig-NG”、“id”、“iu-Latn-CA”、“iu-Cans-CA”、“ga-IE”、“xh-ZA”、“zu-ZA”、“it”、“it-it”、“it-CH”、“ja-JP”、“kn”、“kn-IN”、“kk”、“kk-kk”、“rw”、“sw-KE”、“ko-kk”、“ko”、“ky”、“KG”、“KG”、“lo-LA”、“lv”、“lv”、“lv-lv-lv”、“lt”、“lt-lt”、“wee-DE”、“lb-LU”“,”mk“,”mk“,”mk“,”ms“,”ms BN“,”ms MY“,”mt mt“,”mt NZ“,”arn CL“,”mr IN“,”moh CA“,”mn“,”mn mn mn“,”mn Mong CN“,”ne NP“,”no“,”nb no“,”nn no“,”oc FR“,”或IN“,”ps AF“,”fa“,”fa“,”fa IR“,”pl“,”pt BR“,”pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt pt“,”pa“,”pa“,“smj SE”、“SE FI”、“SE NO”、“SE SE”、“sms FI”、“sma NO”、“sma SE”、“sa”、“sa IN”、“sr”、“sr Cyrl BA”、“sr Cyrl SP”、“sr Latn BA”、“sr Latn SP”、“nso ZA”、“tn ZA”、“si LK”、“sk”、“sk sk”、“sl”、“sl si”、“es”、“es AR”、“es BO”、“es CL”、“es CO”、“es CR”、“es DO”、“es EC”、“es SV”、“es GT”、“es HN”、“es MX”、“es NI”、“es PA”、“es PA”、“es PE”,“es PR”、“es es es”、“es US”、“es UY”、“es VE”、“sv”、“sv FI”、“sv SE”、“syr”、“syr SY”、“tg Cyrl TJ”、“tzm Latn DZ”、“ta”、“ta IN”、“tt”、“tt RU”、“te IN”、“th”、“th”、“th”、“bo CN”、“tr”、“tr tr”、“tk TM”、“ug CN”、“uk UA”、“wen DE”、“ur PK”、“uz”、“uz Cyrl uz”、“uz Latn uz”、“vi”、“vi”、“vi VN”、“cy GB”、“wo SN”、“sah RU”、“ii CN”、“yo NG NG NG”等" };

用它来改变你的文化。如果您需要更多详细信息,请询问。

我想我现在已经通过助手方法解决了这个问题

1) 添加您的RESX文件并将其设置为具有“公共”访问权限修改器

2) 创建一个类似以下内容的助手函数,其中“MyNamepsace.ResourceClass”是默认RESX文件下类的完整路径。您可以通过查看RESX下的*.Designer.cs文件来找到这一点

public static class Lang
{        
    public static string GetGlobalString(string key, string language)
    {
        CultureInfo ci = new CultureInfo(language);
        ResourceManager rm = new ResourceManager(typeof(MyNamespace.ResourceClass)));
        return rm.GetString(key, ci);
    }
}
3) 在我的MVC视图中,我现在可以这样做:

@MyRESX.String1("de-DE") 

@MyRESX.String1("fr-FR") 
   private static readonly List<string> _validCultures = new List<string> { "af", "af-ZA", "sq", "sq-AL", "gsw-FR", "am-ET", "ar", "ar-DZ", "ar-BH", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-YE", "hy", "hy-AM", "as-IN", "az", "az-Cyrl-AZ", "az-Latn-AZ", "ba-RU", "eu", "eu-ES", "be", "be-BY", "bn-BD", "bn-IN", "bs-Cyrl-BA", "bs-Latn-BA", "br-FR", "bg", "bg-BG", "ca", "ca-ES", "zh-HK", "zh-MO", "zh-CN", "zh-Hans", "zh-SG", "zh-TW", "zh-Hant", "co-FR", "hr", "hr-HR", "hr-BA", "cs", "cs-CZ", "da", "da-DK", "prs-AF", "div", "div-MV", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-BZ", "en-CA", "en-029", "en-IN", "en-IE", "en-JM", "en-MY", "en-NZ", "en-PH", "en-SG", "en-ZA", "en-TT", "en-GB", "en-US", "en-ZW", "et", "et-EE", "fo", "fo-FO", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-LU", "fr-MC", "fr-CH", "fy-NL", "gl", "gl-ES", "ka", "ka-GE", "de", "de-AT", "de-DE", "de-LI", "de-LU", "de-CH", "el", "el-GR", "kl-GL", "gu", "gu-IN", "ha-Latn-NG", "he", "he-IL", "hi", "hi-IN", "hu", "hu-HU", "is", "is-IS", "ig-NG", "id", "id-ID", "iu-Latn-CA", "iu-Cans-CA", "ga-IE", "xh-ZA", "zu-ZA", "it", "it-IT", "it-CH", "ja", "ja-JP", "kn", "kn-IN", "kk", "kk-KZ", "km-KH", "qut-GT", "rw-RW", "sw", "sw-KE", "kok", "kok-IN", "ko", "ko-KR", "ky", "ky-KG", "lo-LA", "lv", "lv-LV", "lt", "lt-LT", "wee-DE", "lb-LU", "mk", "mk-MK", "ms", "ms-BN", "ms-MY", "ml-IN", "mt-MT", "mi-NZ", "arn-CL", "mr", "mr-IN", "moh-CA", "mn", "mn-MN", "mn-Mong-CN", "ne-NP", "no", "nb-NO", "nn-NO", "oc-FR", "or-IN", "ps-AF", "fa", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa", "pa-IN", "quz-BO", "quz-EC", "quz-PE", "ro", "ro-RO", "rm-CH", "ru", "ru-RU", "smn-FI", "smj-NO", "smj-SE", "se-FI", "se-NO", "se-SE", "sms-FI", "sma-NO", "sma-SE", "sa", "sa-IN", "sr", "sr-Cyrl-BA", "sr-Cyrl-SP", "sr-Latn-BA", "sr-Latn-SP", "nso-ZA", "tn-ZA", "si-LK", "sk", "sk-SK", "sl", "sl-SI", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-SV", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "sv", "sv-FI", "sv-SE", "syr", "syr-SY", "tg-Cyrl-TJ", "tzm-Latn-DZ", "ta", "ta-IN", "tt", "tt-RU", "te", "te-IN", "th", "th-TH", "bo-CN", "tr", "tr-TR", "tk-TM", "ug-CN", "uk", "uk-UA", "wen-DE", "ur", "ur-PK", "uz", "uz-Cyrl-UZ", "uz-Latn-UZ", "vi", "vi-VN", "cy-GB", "wo-SN", "sah-RU", "ii-CN", "yo-NG" };
@Lang.GetGlobalString("String1", "de-DE")


您好,谢谢您的评论,但我不太明白这段代码是如何解决这个问题的?这段代码似乎返回了一个区域性,但我想通过传入区域性从RESX实际返回一个字符串。@MartinKearn为什么不编写一个访问RESX的自定义类,类似于
public string GetTranslation(string key,string languageID){return translation;}
?谢谢你的建议,但这仍然不能回答问题-在这个方法中,根据languageID访问正确的RESX时,代码会是什么样子?@MartinKearn哦,你明白了,我只是想发布我的答案,祝你好运!