c# - 其他环境下的类库中未加载语言资源文件

标签 c# .net wpf localization resx

我有一个类库项目(c#、.net 4.0)。它有一些 WPF 用户控件,根据数据库中配置的区域性以英语或西类牙语显示内容。

为此,在主窗口构造函数中,我收到一个 CultureInfo 参数,我用它来设置要在本地化命名空间中使用的区域性,如下所示:

public MainWindow(Entities.TransactionContext transactionContext, CultureInfo culture)
        {
            Localization.Resources.Culture = culture;

            InitializeComponent();

            //Some other unrelated code here
        }

这是从调用我的 dll 的主程序中使用的。在那里,进行查询以获取默认区域性。它可以是“en-US”或“es-MX”,然后作为第二个参数发送。第一个现在并不重要。

正如我所说,我有一个名为 MyProject.Localization 的命名空间(您知道,由于内部政策,我正在更改我的项目名称)。在该文件夹中,我有三个资源文件:

  • 资源.resx
  • Resources.en-US.resx
  • Resources.es-MX.resx

Resources.resx 中的默认条目具有西类牙语值,因为我是墨西哥人。

此外,在我的代码中,当我需要显示消息或设置标签文本时,我使用如下内容:

this.lblStatusMessage.Content = Localization.Resources.OperationCancelled;

在此示例中:“OperationCancelled”是所有资源文件中都存在的条目。在西类牙语中,其值为“Operación Cancelada”,在英语中,其值为“Operation Cancelled”。

毕竟这个故事,这在我的开发环境中非常有效。我运行我的测试项目,我看到它是英文的,然后我更改数据库中的语言,再次运行它,然后繁荣!西类牙语。

但是。

当我通过 SVN 向该项目提交更改时,它会通过一些自动化流程部署到 QA 环境(这很棒)。然后我在那里进行测试,我总是看到西类牙语的内容(作为默认内容)。即使我更改 QA 数据库上的语言,它也始终以西类牙语显示标签和消息。

我尝试了一些选项:

将资源 dll 的构建操作更改为资源而不是嵌入式资源。没成功。

右键单击->属性,资源选项卡显示没有资源,因此我在那里创建了三个 resx 文件并将自定义命名空间设置为 MyProject.Localization。接下来,我排除了原始文件,因为现在存在一些不明确的错误。它再次在我的开发机器中工作,但在 QA 中却不起作用。

对此有什么想法吗?我的假设是,它与 resx 文件有关,也许它们没有包含在最终构建的文件中或类似的文件中,这就是应用程序无法获取本地化文本的原因。

提前谢谢您。

最佳答案

这是我根据个人经验给出的答案:构建操作“嵌入式资源”应该有效。所有资源都将包含在内。

Localization.Resources.Culture = culture; 
// "Overrides's the current thread's CurrentUICulture property for all
// resources lookups using this this strongly typed resource class."

我个人没有使用过这个方法,但这也意味着它可以改回Localization.Resources.Culture = null;在你不知道的情况下。相反,请考虑使用 System.Threading.Thread.CurrentThread.CurrentUICulture = culture; 。如果您打算拥有一个具有多种语言的应用程序,这里有一个调用建议:

public void SetUICulture(CultureInfo culture)
{
    CultureInfo savedUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture;
    try
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = uiCultureInfo;

        // Do culture-specific stuff...
        this.lblStatusMessage.Content = Localization.Resources.OperationCancelled;
    }
    finally 
    { 
        System.Threading.Thread.CurrentThread.CurrentUICulture = savedUICultureInfo
    }
}

如果您以后有多个不同的资源文件,这也很有用。一般来说,我建议看看CultureInfo你实际上已经通过了。

关于c# - 其他环境下的类库中未加载语言资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28632763/

相关文章:

c# - 缓存 - IDictionary 与顶级键前缀

c# - "Count()"上的 "Take()"之后的 "IQueryable"返回错误结果?

c# - 跨 Sharepoint 服务器上所有站点和子站点的 Linq 查询?

c# - 在 C# 中将 12 小时格式转换为 24 小时格式

c# - 关于 Josh Smith 的示例应用程序的 MVVM 问题

wpf - 在 WPF 中,如何使用 XAML 指定嵌套在目录中的文件的路径?

c# - Azure Function Post C# 不以大体执行

c# - Html Agility Pack 按类获取所有元素

c# - 在 ASP.NET MVC 中动态呈现 View 的安全隐患

wpf - OpenFileDialog 在 Windows XP 下崩溃,但在 Windows 7 下不崩溃