【问题标题】:Unable to read culture specific values无法读取文化特定值
【发布时间】:2019-05-15 08:44:34
【问题描述】:

我从事本地化项目,无法从资源文件中读取本地值。

我有一个示例解决方案如下:

1. Web API project
2. Resources Project.
    - In resources project, I have 3 resource files de-DE, fr-FR, and en-US.

我正在从资源文件中读取资源键“名称”,我可以通过如下设置文化值从 de-DE 和 en-US 获取值。

[HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
        var name = Employees.Name;
        return new string[] { name };
    }

但是,当我尝试读取 fr-FR local 的键时,它给出了英文值。 唯一的区别是,法语资源文件存在于文件夹中,而其他资源文件存在于项目级别。

【问题讨论】:

  • 你得到了什么,你到底期望得到什么?这真的是特定于文化的吗?为什么在访问属性时将当前线程的文化设置为当前线程上的fr-FR?看到“原样”不同文化特定数据的示例也会很有趣
  • 我在所有资源文件中都有一个带有“名称”的键。我想根据用户发送的文化返回名称值。例如:如果他发送 de-DE,我们需要发送德语文件中的值。如果他发送 fr-FR,我们需要发送法语文件中的值。

标签: c# asp.net-web-api asp.net-core localization internationalization


【解决方案1】:

.NET 资源系统主要基于约定;它期望在非常特定的路径中找到特定文化的资源文件。

  • Employees.resx 包含 Employees 容器的中性资源。
  • Employees.[culture].resx 包含特定文化的 Employees 容器的资源。

如果您在另一个文件夹中有资源文件,则资源查找系统会将其视为单独的资源。 fr-FR/Employees.fr-FR.resx 是 fr_FR.Employees 容器的法语资源。

为了让你的资源正确加载,你只需要把它们放在同一个文件夹中:

  • Employees.resx
  • Employees.de-DE.resx
  • Employees.fr-FR.resx

【讨论】:

  • 谢谢,@Paul。我尝试了一种替代方法并且能够读取该值。我们只需要在项目文件中添加以下代码。 $(TargetName).%(Filename)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多