Vb.net 翻译应用程序的有效方法

Vb.net 翻译应用程序的有效方法,vb.net,dictionary,translation,Vb.net,Dictionary,Translation,因此,我在vb.net中开发了一个应用程序,但最近我遇到了允许使用多种语言的必要条件。我不知道是否有做这类事情的“通用”方法,但我实现这一点的方法如下: 我需要在代码中搜索组件、错误消息以及要翻译的应用程序GUI中显示的所有内容 其次,我将创建一个类,在该类中,我将在内存中存储所有将被翻译的内容的字典 之后,我将用词典的条目替换要翻译的内容 然后,当应用程序启动时,我将加载字典 稍后,我将替换静态字典,并将其从数据库加载到内存中 例如,我的字典类: Dim dictionary As New

因此,我在vb.net中开发了一个应用程序,但最近我遇到了允许使用多种语言的必要条件。我不知道是否有做这类事情的“通用”方法,但我实现这一点的方法如下:

  • 我需要在代码中搜索组件、错误消息以及要翻译的应用程序GUI中显示的所有内容
  • 其次,我将创建一个类,在该类中,我将在内存中存储所有将被翻译的内容的字典
  • 之后,我将用词典的条目替换要翻译的内容
  • 然后,当应用程序启动时,我将加载字典
  • 稍后,我将替换静态字典,并将其从数据库加载到内存中
例如,我的字典类:

Dim dictionary As New Dictionary(Of String, String)
dictionary.Add("00011", "hello there!")
我将在代码的某个地方替换:

mylabel.text = "hello there!"
与:

稍后,我将不再使用静态字典,而是创建一个从数据库获取信息的字典,如下所示(并在应用程序开始时加载它:

_______________________________________
word_code ### word_EN      ### word_FR
_______________________________________
00011     ### hello there  ### bonjour il
我将根据选择的语言加载词典

我对这种方法不太熟悉,我不知道这样做是否正确,但如果是这样,我有几个问题:

  • 字典是最好的数据结构吗
  • 考虑到我将有1000个条目、1m个条目或10m个条目,这会是一个很大的内存负担吗
  • 是否有任何逻辑和更快的方法来实现同样的目标
非常感谢您的支持,
J

这是一种常见的方法——在语言代码旁边加上一个系统名,用来查找翻译后的值。不过,一般来说,我建议您只对系统文本和较小的文本段这样做

原因是,在例如CMS/电子商务系统中,可能需要在数据模型中翻译包含大量文本的页面,以支持它;然后您就已经有了语言部门。 因此,在这种情况下,最好使用翻译后的数据模型创建页面结构,其中的详细信息将针对当前网站的每种语言。 例如,您将有一个product->product\u detail,其中detail保存所述产品的翻译值。类似于article->article\u detail等等

但对于需要显示的一般翻译和系统文本,这是一种常见的方式。 正如您自己所建议的,像dictionary这样的结构是进行快速查找的好结构,可以缓存在系统中,这样您就不需要一直检索它们

你可以扩展它的一些方法是,将你的翻译分为几个小组;比如说你有一个订单页和一个产品页。然后你可以将翻译分配给“产品”和“订单”,以及一个“公共”小组。 它还可以使构建更小的缓存对象、从数据存储中提取更少的数据等变得更容易,因此只关注订单的页面不需要担心产品翻译

它需要内存,但除非你将整个CMS系统放入翻译中,否则它应该是“次要的”。 然而,我会质疑对1000万个翻译实体的需求,并且怀疑你的系统是否真的需要这么多的翻译,如果它确实如此,那么可以考虑另一种方法,以及是否可以更好地使“页面”的多个版本消除对翻译的需求。
我还建议您不要使用“00011”作为系统代码开始,而应使用更“可读”的版本(如“hello”),以简化代码的可读性和可维护性。如果您需要类似“00011”的“系统值”,很容易进行搜索/替换。

资源就在那里。它已经内置,您可以随时在excel中复制/粘贴资源文件,以便于翻译。我喜欢您的答案,而不是我文章中建议的答案。为什么?因为我需要它完全独立于客户端应用程序。我的应用程序已经从一个数据库中读取了ide数据库。为什么?因为我可以很容易地更正/更改翻译,而无需到本地计算机更改资源文件或添加内容。可读键的建议可能不起作用,原因是。首先,有时需要翻译错误消息之类的句子,在这种情况下,我只需要使用一个单词作为参考第二,我可以通过使用代码而不是字号来最好地控制副本。你认为呢?在我看来,对副本的控制是一样的,特别是如果使用口述(只允许一个键)和/或将翻译存储在数据库中(唯一键)开始时。只是维护包含GetText(“Hello”)的代码比维护GetText(“000011”)的代码更容易,而且正如前面所说的,一旦完成,您就可以随时进行搜索/替换。
_______________________________________
word_code ### word_EN      ### word_FR
_______________________________________
00011     ### hello there  ### bonjour il