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



我正在尝试本地化我的Web API的响应。

我在我的项目中创建了一个资源文件(Metsges.resx),其中包含所有本地化的字符串。并使用接受语言标题来识别用户的语言。

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

response = Messages.KEY_GOOD_MORNING

将以当前线程文化的语言获得该名称的字符串。我将不得不将线程的当前文化更改为从接受语言标题发现的文化。,但我不想改变线程的文化,因为这也会更改数字/日期格式,这对我来说是有问题的。

我看到的另一种选择是 - 使用ResourceManager并将文化作为 -

Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))

这样,我不必改变线程的文化。但是,这种方法的问题是 - 字符串名称不再键入SAFE 。字符串名称中传递给getString()中的错字可能导致返回的null值。

我还可以采用其他方法来避免以上两个问题?

首先,您应该检查此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"/>

对于英语文化案件

<globalization 
    enableClientBasedCulture="false" 
    uiCulture="en-US" 
    culture="en-US" />

这样,您就可以将文化线程与配置一起使用。另外,您可以将浏览器设置设置为自动设置,可以将其设置为自动设置并忽略某些情况。有关更多信息,您可以检查上面的链接。

如果您想接受浏览器的文化

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto" 
    culture="auto" />

或默认操作

<globalization 
    enableClientBasedCulture="true" 
    uiCulture="auto:en-US" 
    culture="auto:en-US" />

为了获得最佳练习,您从来没有更改计算机线程文化信息。但是您可以更改基于会话的更改当前线程文化,它只是基于线程的信息而不是全系统。我希望它会很有用。

只是一个想法,但是您可以使用您的方法并使用nameof()构造/关键字来保持类型安全性 - 因为最初是您的问题" - 字符串名称不再键入安全。字符串名称中传递给getString()中的错别字可能导致返回的null值。" "

使用 nameof示例:

Messages.ResourceManager.GetString(nameof(Messages.KEY_GOOD_MORNING), CultureInfo.CreateSpecificCulture(lang.value))

它的作用&amp;文档:

  • 编译器然后将字符串排放为" key_good_morning",但是您可以保留所有重构/重命名/键入安全的好东西。
  • 这仅在C#6.0
  • 时可用
  • 引用文档:https://msdn.microsoft.com/nl-be/library/dn986596.aspx

最新更新