我正在尝试本地化我的网络API的响应。
我在项目中创建了一个包含所有本地化字符串的资源文件(Messges.resx)。并使用Accept-Language标头识别用户的语言。
在回复中我可以将字符串设置为:
response = Messages.KEY_GOOD_MORNING
将以当前线程文化的语言获取该名称的字符串。我将不得不将线程的当前文化更改为从Accept-Language标题中找到的文化。 但我不想改变主题文化,因为这也会改变数字/日期格式,这对我来说是个问题。
我看到的另一种选择是 - 使用ResourceManager并将文化传递为 -
Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))
这样我就不必改变线程的文化。但这种方法的问题是 - 字符串名称不再是类型安全的。传递给GetString()的字符串名称中的拼写错误可能会导致返回空值。
我可以采取其他方法来避免上述问题吗?
答案 0 :(得分:3)
首先,您应该检查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设置为auto,您可以设置为auto并忽略某些情况。有关详细信息,请查看上面的链接。
如果您想接受浏览器的文化
<globalization
enableClientBasedCulture="true"
uiCulture="auto"
culture="auto" />
或使用默认操作
<globalization
enableClientBasedCulture="true"
uiCulture="auto:en-US"
culture="auto:en-US" />
为了获得最佳实践,请不要更改计算机线程文化信息。但是您可以更改基于会话的更改当前线程文化,它只是基于线程的信息而不是所有系统。 我希望它会有用。
答案 1 :(得分:2)
只是一个想法,但您可以使用您的方法并使用nameof()
construct /关键字来保持类型安全 - 因为这是您最初的问题“这个方法的问题是 - 字符串名称不是't type safe。传递给GetString()的字符串名称中的拼写错误可能会导致返回空值。“
示例使用 nameof
:
Messages.ResourceManager.GetString(nameof(Messages.KEY_GOOD_MORNING), CultureInfo.CreateSpecificCulture(lang.value))
它做什么&amp;文档:强>