我们翻译网站的方式会导致性能问题吗?

Gaz*_*ter 7 c# translation entity-framework asp.net-mvc-3

背景

我们的网站是一个新闻网站,全球许多人都在观看.显然,这意味着我们将以尽可能多的语言对网站进行本地化.将聘请专业翻译人员为每种语言.

我们的网站目前如何运作

我们计划这样做的方法是在Guid链接的数据库中存储页面的每个元素的翻译.因此,当页面加载时,使用Guid和用户的语言首选项将字符串从数据库中拉出.

我们的项目中有几个包含英文翻译的文档.比如这样:

public class StandardButtonToken : LocalisationToken
{
    protected StandardButtonToken(string defaultText, Guid key) : base(defaultText, key)
    {
    }

    public static readonly LocalisationToken Update = new StandardButtonToken("Update", Guid.Parse("8a999f5b-7ca1-466d-93ca-377321e6de00"));
    public static readonly LocalisationToken Go = new StandardButtonToken("Go", Guid.Parse("7a013ecc-0772-4f87-9f1f-da6a878a3c99"));
    public static readonly LocalisationToken Edit = new StandardButtonToken("Edit", Guid.Parse("c31be427-5016-475d-997a-96fa5ff8b51f"));
    public static readonly LocalisationToken New = new StandardButtonToken("New", Guid.Parse("f72d365c-b18f-4f01-a6e4-b0cd930dc730"));
    public static readonly LocalisationToken More = new StandardButtonToken("More", Guid.Parse("bd4da7df-afd2-481e-b6b6-b4a989324758"));
    public static readonly LocalisationToken Delete = new StandardButtonToken("Delete", Guid.Parse("ab00ec14-4414-4cda-a8e2-4f03c9e7c5a8"));
    public static readonly LocalisationToken Add = new StandardButtonToken("Add", Guid.Parse("01e44600-a556-4a07-8a2a-e69a1ea79629"));
    public static readonly LocalisationToken Confirm = new StandardButtonToken("Confirm", Guid.Parse("4c50e91e-3e2f-42fa-97aa-9f1f6f077f09"));
    public static readonly LocalisationToken Send = new StandardButtonToken("Send", Guid.Parse("24121766-f424-4d73-ac58-76f90d58b95c"));
    public static readonly LocalisationToken Continue = new StandardButtonToken("Continue", Guid.Parse("dd2ca0e5-8a35-4128-b2e8-db68a64a6fe5"));
    public static readonly LocalisationToken OK = new StandardButtonToken("OK", Guid.Parse("9a359f93-7c23-44ad-b863-e53c5eadce90"));
    public static readonly LocalisationToken Accept = new StandardButtonToken("Accept", Guid.Parse("3206a76b-1cd7-4dc3-9fff-61dfb0992c75"));
    public static readonly LocalisationToken Reject = new StandardButtonToken("Reject", Guid.Parse("f99c6a9c-6a55-4f55-ac4b-9581e56d18d3"));
    public static readonly LocalisationToken RequestMoreInfo = new StandardButtonToken("Request more info", Guid.Parse("19f3d76b-dafa-47ae-8416-b7d61546b03d"));
    public static readonly LocalisationToken Cancel = new StandardButtonToken("Cancel", Guid.Parse("75617287-5418-466b-9373-cc36f8298859"));
    public static readonly LocalisationToken Publish = new StandardButtonToken("Publish", Guid.Parse("efd87fd4-e7f1-4071-9d26-a622320c366b"));
    public static readonly LocalisationToken Remove = new StandardButtonToken("Remove", Guid.Parse("f7db5d81-5af8-42bf-990f-778df609948e"));
}
Run Code Online (Sandbox Code Playgroud)

每次我们创建页面时,我们都会确保按钮使用这些标记而不是手动编写文本.因此,如果我们确定需要一个新按钮,我们将在下面的文件中添加一个新令牌,当该站点第一次运行时,它将检查它是否存在于数据库中,如果不存在则将创建它.

因此,在翻译方面,我们会将这些代币发送给翻译人员,他们只会更改文本.然后,这将以相关语言添加到站点中,页面将根据所选语言调用正确的翻译.

问题/疑问

我们的翻译令牌将默认文本作为字符串,但我担心服务器必须在启动时将所有这些文本字符串加载到内存中.它们实际上只用于在db中存储转换,从未在代码中使用过,所以我认为它可能有点浪费.相反,我相信我们可以在需要时单独调用这些翻译,可能来自某种不在内存中的查找表.

所以问题是.我们目前这样做会导致性能问题吗?

如果是这样,任何人都可以建议更好的解

在我们的网站中总共有1000个这些令牌.

谷歌在这个场合对我没有多大帮助,所以任何建议都会非常感激.我已尽力尽力说出这一点,这样才有意义.这不是一个容易解释的问题.

提前感谢您提供的任何帮助.

小智 3

我目前正在与一个团队合作开展一个项目,我们也遇到了类似的情况。我们的项目是基于客户端/服务器的应用程序。我们的翻译数据库位于服务器上,我们所有的控件都有默认的英语值。最初,当任何新窗口打开时,我们都会读取数据库并提取所有必要的翻译并翻译控件。这样,只有我们需要的值才会被翻译到内存中的位置,并且只要该窗口需要它们。当窗口关闭时,将使用垃圾收集来回收内存。

我们发现,即使每个按钮、标签、列标题等的所有翻译......整个系统都加载到内存中,我们只处理几百K。最后我们所做的是:

  1. 用户登录:
    • 如果它们默认为英语以外的另一种语言,则会在内存中设置一个数据表,并使用来自服务器的系统中所有用户控件的翻译进行填充。
    • 该数据表被赋予一个主键,以帮助改进对其的查询。只要应用程序打开,该数据表就存在。
    • 每当实例化用户控件时,都会运行一个方法来查找翻译并应用它。

用户登录所需的时间确实增加了,但平均仅增加了几毫秒。

说了这么多,我想知道你是否可以使用类似的设计。这个想法将使服务器不必跟踪每个会话的翻译。它只会将页面提供给用户。

  1. 用户登录:
    • 数据表对象中填充了该站点的所有翻译
    • 调用 WriteXML()
    • 将生成的 XML 发送到客户端
  2. 当用户导航到新页面时:
    • 调用客户端脚本,使用 XML 来翻译客户端计算机上的页面。

您可以添加一些缓存,以便仅在站点更新时替换 XML,或者您可以让每个用户每次登录时下载 XML。无论哪种方式,它都会减轻服务器的负载。