【问题标题】:How to create a multilingual project如何创建多语言项目
【发布时间】:2015-05-12 11:23:19
【问题描述】:

我是 VB.net 的新手,我正在尝试做一个简单的多语言项目。

到目前为止,我已经创建了 2 个资源文件:

en-US.resx  
pt-PT.resx

在他们两个中,我都有相同的 ID 和不同的值(仅限字符串) (这些字符串将在多个表单中使用)

当我更改语言时:

Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")

Thread.CurrentThread.CurrentCulture = New CultureInfo("pt-PT")

基于我想看到的语言。

但我不知道如何正确访问我的资源文件,正在做:

Dim assembly As System.Reflection.Assembly
assembly = Me.GetType.Assembly
Dim resourceManager As New System.Resources.ResourceManager("My.Resources", assembly)  
MsgBox(resourceManager.GetString("TEST"))  

给我一​​个例外System.Resources.MissingManifestResourceException' occurred in mscorlib.dll

我错过了什么?

在第一次建议后编辑:

【问题讨论】:

    标签: vb.net localization cultureinfo resourcemanager


    【解决方案1】:

    此示例需要下表中列出的基于文本的资源文件。每个都有一个名为DateStart 的字符串资源。

      Culture    |     File name     |  Resource name    |    Resource value
    
       en-US        DateStrings.txt       DateStart              Today is
       pt-PT    DateStrings.pt-PT.txt     DateStart               hoje é
    

    此代码使用GetString(String, CultureInfo) 方法检索特定于文化的资源。该示例的默认文化是英语 (en),它包括葡萄牙语(葡萄牙)(pt-PT) 文化的附属程序集。

    Module Example
       Public Sub Main()
    
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("pt-PT")
    
      Dim cultureNames() As String = { "en-US", "pt-PT" }
      Dim rm As New ResourceManager("DateStrings",GetType(Example).Assembly)
    
    
        'Access to resource file
        For Each cultureName In cultureNames
                 Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
                 Dim dateString As String = rm.GetString("DateStart", culture)
                 Console.WriteLine("{0}: {1} {2}.", culture.DisplayName, dateString, 
                                                    Date.Now.ToString("M", culture))                           
                 Console.WriteLine()
        Next
    
       End Sub
    End Module 
    

    【讨论】:

    • 我尝试了您的代码但没有成功...我唯一的区别是我使用了 2 个 resx 文件。我将它们命名为 DateStrings.pt-PT.resx 和 DateStrings.en.US.resx ,它不应该这样工作吗? P.s.:我也在使用表单,我的测试应用没有任何模块
    • Here 您有一篇很好的分步文章,介绍了如何使用资源文件 (.resx) 本地化带有附属程序集的 vb.net 应用程序
    • @RagnaRock 不要担心不使用模块。您可以声明您的 ResourceManager 传递 Form 而不是 Module 作为参数 Dim rm As New ResourceManager("DateStrings",GetType(Form1).Assembly)
    • 我就是这样做的,但它不断发送异常(我告诉我我的第一篇文章)
    • 这个问题可能是因为Form类不是代码中的第一个类。尝试移动所有其他类定义,使它们出现在表单的类定义之后
    【解决方案2】:

    我只是停止使用资源管理器。显然不需要资源管理器,现在它正在工作。当教程似乎失败时,我希望这对其他人有所帮助:\

    Public Class Form1
      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US")
        MsgBox(My.Resources.MStrings.TEST)
      End Sub
    
      Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT")
        MsgBox(My.Resources.MStrings.TEST)
      End Sub
    End Class
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多