【问题标题】:Localize WinForms which will used from 3-party application本地化将从 3 方应用程序中使用的 WinForms
【发布时间】:2023-03-21 10:15:01
【问题描述】:

我们创建了一个类库项目,其中包含一些 WinForms。 我们通过内置 VS 设计器(设置 Localizable=true)翻译了表单。

VS 将为包含附属资源文件的每种语言创建程序集和不同的文件夹。

此程序集将由 3 方应用程序加载。

现在我们遇到了一个问题,如果我们通过 3 方应用程序启动表单,我们的表单将无法本地化。 看来,我们的程序集无法从语言子目录中加载资源文件。

是否可以通过代码加载这个资源文件,这样WinForms默认的localize-mechanism就可以了?

编辑

如果我将语言文件夹(de、en、...)复制到主 3 方应用程序文件夹,一切都会像魅力一样工作。

【问题讨论】:

    标签: c# winforms localization .net-3.5 visual-studio-2017


    【解决方案1】:

    如您所知,本地化工作取决于线程文化。您确定第三方应用程序在启动时设置了正确的文化吗?

    // set culture on program startup
    CultureInfo ci = CultureInfo.GetCultureInfo("de-DE");
    Thread.CurrentThread.CurrentCulture       = ci;
    Thread.CurrentThread.CurrentUICulture     = ci;
    
    // .NET 4.5 and above
    CultureInfo.DefaultThreadCurrentUICulture = ci;
    CultureInfo.DefaultThreadCurrentCulture   = ci;
    

    来自 MSDN:

    "在 .NET Framework 4 及以前的版本中,默认情况下,所有线程的 UI 文化都设置为 Windows 系统文化。对于当前 UI 文化与默认系统文化不同的应用程序,此行为是通常不受欢迎。在 .NET Framework 4.5 中,DefaultThreadCurrentUICulture 属性允许您定义应用程序域中所有线程的默认 UI 文化。"

    因此,如果您使用的是 .NET 3.5,线程池和工作线程的文化也可能与您想要的应用程序文化不同,如果这与操作系统文化不同的话。如果需要,您应该检查/设置每个线程调用的区域性。

    【讨论】:

    • 我已经尝试过了,但这似乎不是问题。我测试了创建资源文件并使用自动生成的 ResourceManager 和 ResourceManager.GetString() 并提供不同的 CultureInfos,但没有成功。所以我认为,我的程序集无法自动定位卫星资源文件并加载它。
    • @Markus:我使用 WinForms 本地化功能,从 .NET 1.0 开始,没有这样的问题。您的应用程序目标目录中有附属程序集吗?例如。 MyForms.dll 是否与“de”子目录中的 MyApp.exe 和德语 MyForms.resources.dll 并行?
    • 是的。我认为问题在于,3 方应用程序加载了我的程序集,而我现在正在执行的程序集找不到卫星资源。如果我将包含资源文件的语言文件夹(de、en、...)复制到 3 方应用程序的主文件夹中,它将像魅力一样工作。所以我需要通过代码手动加载资源,但我不知道怎么做。
    • @Markus:你检查了吗,在 UI 线程上设置了哪种确切的 UI 文化(例如 de-DE)?如果这与本地化的 DLL 匹配,例如德?也许,您可以将 TRACE 输出添加到日志文件或包含该信息的临时消息框中。
    • 我编辑我的问题:如果我将资源文件夹/文件复制到 3 方应用程序的主文件夹,一切都会像魅力一样工作。所以我需要一种通过代码将这些资源加载到我的程序集中的方法,本地化机制的构建将起作用。但我不知道如何
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2018-11-14
    • 2011-03-15
    相关资源
    最近更新 更多