如何在 Web Api 控制器中安全地获取本地化字符串?
How to safely get localized string in Web Api Controllers?
我正在尝试本地化我网站的响应 api。
我在我的项目中创建了一个资源文件 (Messges.resx),其中包含所有已本地化的字符串。并使用 Accept-Language header 来识别用户的语言。
在响应中我可以将字符串设置为:
response = Messages.KEY_GOOD_MORNING
这将以当前线程区域性的语言获取该名称的字符串。我将不得不将线程的当前文化更改为从 Accept-Language header 中找到的文化。 但我不想改变线程的文化,因为这也会改变 number/date 格式,这对我来说是有问题的。
我看到的另一种选择是 - 使用 ResourceManager 并将文化作为 -
Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))
这样我就不必改变线程的文化。但是这种方法的问题是- 字符串名称不再是类型安全的。传递给 GetString() 的字符串名称中的拼写错误可能会导致返回空值。
有没有其他方法可以避免上述两个问题?
只是一个想法,但您可以使用您的方法并使用 nameof()
construct/keyword 来保持类型安全 - 因为这是您最初的问题“解决了这个问题方法是- 字符串名称不再是类型安全的。传递给 GetString() 的字符串名称中的拼写错误可能会导致返回空值。"
示例使用 nameof
:
Messages.ResourceManager.GetString(nameof(Messages.KEY_GOOD_MORNING), CultureInfo.CreateSpecificCulture(lang.value))
它的作用和文档:
- 编译器随后会将字符串作为 "KEY_GOOD_MORNING" 发出,但您可以保留所有 refactoring/renaming/type 安全的好东西。
- 这仅适用于 C# 6.0
- 参考文档:https://msdn.microsoft.com/nl-be/library/dn986596.aspx
首先你应该检查这个msdn discussion
解决此问题的最佳方法。您应该在 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" />
有了它,您将能够在配置中使用文化线程。您也可以将带有浏览器设置的 culturethread 设置为自动,您可以设置为自动并忽略某些情况。有关详细信息,您可以查看上面的 link。
如果你想接受浏览器的文化
<globalization
enableClientBasedCulture="true"
uiCulture="auto"
culture="auto" />
或使用默认操作
<globalization
enableClientBasedCulture="true"
uiCulture="auto:en-US"
culture="auto:en-US" />
为了最佳实践,您永远不要更改您的计算机线程区域性信息。但是您可以更改基于会话的更改当前线程文化,它只是基于线程的信息而不是所有系统。
希望对你有用。
我正在尝试本地化我网站的响应 api。
我在我的项目中创建了一个资源文件 (Messges.resx),其中包含所有已本地化的字符串。并使用 Accept-Language header 来识别用户的语言。
在响应中我可以将字符串设置为:
response = Messages.KEY_GOOD_MORNING
这将以当前线程区域性的语言获取该名称的字符串。我将不得不将线程的当前文化更改为从 Accept-Language header 中找到的文化。 但我不想改变线程的文化,因为这也会改变 number/date 格式,这对我来说是有问题的。
我看到的另一种选择是 - 使用 ResourceManager 并将文化作为 -
Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))
这样我就不必改变线程的文化。但是这种方法的问题是- 字符串名称不再是类型安全的。传递给 GetString() 的字符串名称中的拼写错误可能会导致返回空值。
有没有其他方法可以避免上述两个问题?
只是一个想法,但您可以使用您的方法并使用 nameof()
construct/keyword 来保持类型安全 - 因为这是您最初的问题“解决了这个问题方法是- 字符串名称不再是类型安全的。传递给 GetString() 的字符串名称中的拼写错误可能会导致返回空值。"
示例使用 nameof
:
Messages.ResourceManager.GetString(nameof(Messages.KEY_GOOD_MORNING), CultureInfo.CreateSpecificCulture(lang.value))
它的作用和文档:
- 编译器随后会将字符串作为 "KEY_GOOD_MORNING" 发出,但您可以保留所有 refactoring/renaming/type 安全的好东西。
- 这仅适用于 C# 6.0
- 参考文档:https://msdn.microsoft.com/nl-be/library/dn986596.aspx
首先你应该检查这个msdn discussion
解决此问题的最佳方法。您应该在 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" />
有了它,您将能够在配置中使用文化线程。您也可以将带有浏览器设置的 culturethread 设置为自动,您可以设置为自动并忽略某些情况。有关详细信息,您可以查看上面的 link。
如果你想接受浏览器的文化
<globalization
enableClientBasedCulture="true"
uiCulture="auto"
culture="auto" />
或使用默认操作
<globalization
enableClientBasedCulture="true"
uiCulture="auto:en-US"
culture="auto:en-US" />
为了最佳实践,您永远不要更改您的计算机线程区域性信息。但是您可以更改基于会话的更改当前线程文化,它只是基于线程的信息而不是所有系统。 希望对你有用。