在我们公司,我们有一个现有的翻译ms-sql表,存储字符串如下:
Id | Key | Language | Value
1 | hello-world | nl-BE | Hallo Wereld
2 | hello-world | en-GB | Hello World该系统中有3种语言,我预计在未来将增加到最多10种。
此表由多个非常不同的项目(大约60个项目,主要是网站/ web应用程序和一些web服务)读取,每个项目都打开到翻译数据库的数据库连接,缓存翻译。
前端开发者的反馈是我们的UIto输入或修改翻译的S最大的缺点是他们不知道什么项目使用什么字符串。
他们有时修改字符串,不知道他们正在用它破坏7个项目。
现在,他们只需键入类似this.Translate("Hello World")的内容,系统就会处理剩下的部分。
当然,我可以强迫他们做一些类似this.Translate("Hello World","AwesomeApplication1")的事情,但这似乎需要对许多项目进行大量的重构。
重要注意事项:翻译重用是集中化数据库的全部要点,因此可以通过以下方式对一个项目进行范围转换
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2并不是真正想要的选择。
我更喜欢这样的:
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2或者一个外键就相当于把名字放进表里。
基于规范数据库的建议,我到目前为止提出了这样的建议:

//this allows me to distinquish if translations where added by developer or by translatorUPDATE2:添加edmx而不是文本。如果人们感兴趣,我可以github的WCF项目,我正在包装这个概念,以便其他人可以测试和使用它。
发布于 2013-02-28 16:58:40
初步注1:您现在没有告诉我们翻译是如何维护的
初步说明2:您的数据库没有标准化。不管你要采取什么解决方案,首先,使数据库规范化。如果你现在不这么做的话,你以后会遇到严重的维护问题。
这就是我会做的。
变体:
我还建议您编写一个单独的“翻译维护”程序,该程序将显示缺少翻译等。我曾经这样做过,获得了2级授权:每个翻译都必须由另一个人(通常是母语为母语的人)进行审核。
发布于 2013-02-28 16:46:15
因为他们指的是“这个”..。您可以将项目名称一次分配给“this”(例如,通过构造函数),并且转换函数的接口不会因编码器而改变。在幕后,它只是将项目名称添加到数据库查询中。或者,您可以提供“此”方法来了解项目名称。这将取决于您如何构建类。
对于存储,您可以这样做:
1 ! hello-world ! nl-EN ! Hello World ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh ! PirateApp使用通配符对所有应用程序应用通用翻译,但当您想要覆盖特定应用程序的翻译时,则使用特定的应用程序名称。这将使重复减少到最低限度。
要查看程序使用的是哪个翻译,您现在知道了--如果您不想查看并手动获取这些信息,您可以记录翻译请求。
发布于 2013-02-28 17:54:08
如果您的所有项目都是用C#编写的,并且所有翻译器调用都是这样的
this.Translate("hello-world")如果"hello-world“是翻译表中的关键,那么使用正则表达式来查找所有的翻译器调用并分配相应的项目名称,编写一个小的源代码扫描器应该不会太困难。这样,您就不必更改任何现有的代码或翻译接口。
根据程序的实际结构,也可以更容易地从程序集的IL代码中提取该信息。不久前,我做了非常类似的事情,也是为了翻译目的,使用此示例代码解析程序集。
https://softwareengineering.stackexchange.com/questions/188771
复制相似问题