如何在Web Api控制器中安全地获取本地化字符串?

Qua*_*ark 6 c# localization cultureinfo

我正在尝试本地化我的网络API的响应.

我在项目中创建了一个包含所有本地化字符串的资源文件(Messges.resx).并使用Accept-Language标头来识别用户的语言.

在响应中,我可以将字符串设置为:

response = Messages.KEY_GOOD_MORNING
Run Code Online (Sandbox Code Playgroud)

它将以当前线程文化的语言获取该名称的字符串.我将不得不将线程的当前文化更改为从Accept-Language标题中找到的文化.但我不想改变线程的文化,因为这也会改变数字/日期格式,这对我来说是个问题.

我看到的另一种选择是 - 使用ResourceManager并将文化传递给 -

Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))
Run Code Online (Sandbox Code Playgroud)

这样我就不必改变线程的文化.但这种方法的问题是 - 字符串名称不再是类型安全的.传递给GetString()的字符串名称中的拼写错误可能导致返回空值.

我可以采取其他方法来避免上述问题吗?

orh*_*ndi 3

首先你应该检查这个msdn讨论

对于这个问题的最佳方法。您应该在 web.config 文件中设置全球化设置。

<configuration>
 <system.web>
  <globalization 
    enableClientBasedCulture="true|false"
    requestEncoding="any valid encoding string"
    responseEncoding="any valid encoding string"
    fileEncoding="any valid encoding string"

    responseHeaderEncoding = "any valid encoding string" 
    resourceProviderFactoryType = string
    enableBestFitResponseEncoding = "true|false"

    culture="any valid culture string"
    uiCulture="any valid culture string"/>
Run Code Online (Sandbox Code Playgroud)

对于英语文化案例

<globalization 
    enableClientBasedCulture="false" 
    uiCulture="en-US" 
    culture="en-US" />
Run Code Online (Sandbox Code Playgroud)

这样您就可以通过配置使用文化线程。您还可以将浏览器设置设置为自动,您可以设置为自动并忽略某些情况。欲了解更多信息,您可以查看上面的链接。

如果你想接受浏览器文化

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto" 
    culture="auto" />
Run Code Online (Sandbox Code Playgroud)

或者使用默认操作

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto:en-US" 
    culture="auto:en-US" />
Run Code Online (Sandbox Code Playgroud)

为了获得最佳实践,请勿更改计算机线程文化信息。但是您可以更改基于会话的当前线程区域性,它只是基于线程的信息而不是所有系统。我希望它会有用。