为多个(内部)项目构建字符串翻译数据库


9

在我们公司,我们有一个现有的转换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输入或修改翻译的最大弊端是他们不知道哪个项目使用什么字符串。

他们有时会修改字符串,却不知道它们会破坏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 translator

UPDATE2:添加了edmx而不是文本。如果人们有兴趣,我可以在WCF项目上github,我将这个概念包装起来,以便其他人可以测试和使用它。


Ty用于归一化。投票q和a。我相信,春季java github会有所帮助。
tgkprog 2014年

Answers:


5

初步说明#1:您现在还没有告诉我们翻译的维护方式

初步说明#2:您的数据库未规范化。无论您要采用哪种解决方案,请首先对数据库进行规范化。如果您现在不这样做,则会遇到严重的维护问题

这就是我要做的。

  1. 重写您的翻译调用,以便它将程序ID传送回服务器

  2. 如果该字符串尚不存在,则后端翻译器会将其放入数据库表中,并使用程序ID对其进行标记

  3. 如果字符串已经存在,则仅当程序ID与创建该字符串的原始程序ID相匹配时,才会更新该字符串。如果不是,则返回冲突通知。

变化:

  • 您可以使用“开发人员ID /翻译人员ID”代替程序ID。我认为这更好,因为有些人会说一门外语,并且认为他们会。仅第一组具有修改权限。

  • 您可能希望将使用该字符串的所有程序的ID存储在数据库中,以便知道哪些程序发生冲突。

  • 您可以将这种“所有权”思想扩展到每种语言:一个人可以说英语,另一个人可以说荷兰语。

  • 数据库标准化后,您将添加构建复杂度,例如“程序A使用语言1,2,3; B使用3和5”

我还建议您编写一个单独的“翻译维护”程序,该程序将向您显示缺少的翻译等。我曾经使用2级授权进行过此操作:每个翻译都必须由第二个人(通常是讲母语的人)审核。


1
我更新了我的问题,根据你的想法
的mVision

5

由于他们引用的是“ this”,因此您可以将项目名称一次分配给“ this”(例如,通过构造函数),并且翻译功能的接口对于编码人员而言不会更改。在后台,它只是将项目名称添加到数据库查询中。或者,您可以提供“此”方法来自己了解项目名称。这实际上取决于您如何构造课程。

对于存储,您可以执行以下操作:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

当您要覆盖特定应用程序的翻译时,请使用通配符将常规翻译应用到所有应用程序,但是将特定应用程序名称应用到该应用程序。这样可以将重复次数降至最低。

要查看哪个程序正在使用哪些翻译,您现在知道这一点-如果您不想遍历并手动收集该信息,则可以记录翻译请求。


将其移到“此类”类的想法对我来说似乎很好,我想我将把项目名称移至web / app.config文件并从那里读取它。您是否认为通配符/项目名称的想法可扩展到4000种翻译?
Mvision

3
作为增强,可以将触发器添加到数据库或DBAL中,以便每当读取翻译后的单词时更新“订阅程序”列。

数据库触发器如何知道项目名称?(我们使用的是实体框架4)
Mvision

@Mvision我不明白为什么不-音量不应该是一个大问题。如果许多特定于应用程序的翻译只是插入应用程序名称,则也可以使用常量来减少重复数据。
GrandmasterB

NVM我误会了。是的,触发器可以做到,并且与检查和更新读取时通过EF的东西相比,它可以加快处理速度……。不错的选择
Mvision 2013年

1

如果您所有的项目都是用C#编写的,并且所有的翻译器调用都像这样

this.Translate("hello-world")

在“ hello-world”是转换表中的键的情况下,使用正则表达式编写小型源代码扫描器以查找所有翻译器调用并为关键字分配相应的项目名称应该不太困难。这样,您无需更改任何现有代码或翻译器界面。

根据程序的实际结构,从程序集的IL代码中提取信息可能会更容易。一段时间以前,出于翻译目的,我使用此示例代码解析程序集,做了非常相似的事情。


我曾经喜欢这种解决方案。但这将要求所有60个项目(有些甚至不是我的项目)都经过全面测试,然后才能使用此新系统进行生产。将项目名称移动到调用代码中的建议解决方案效果很好,并且会减少很多麻烦,谢谢!
Mvision

1
@Mvision:我认为情况恰恰相反。如果在运行时确定翻译的项目名称,则必须确保必须对所有60个项目的每个带有翻译的网页进行一次调用,以确保将它们全部记录下来。但是,静态扫描源或程序集将为您提供完整列表,而无需进行任何测试或运行整个系统。
布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.