7

背景

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

我们的网站目前如何运作

我们计划这样做的方法是将页面的每个元素的翻译存储在由 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"));
}

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

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

问题/问题

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

所以问题是。我们目前这样做的方式是否会导致性能问题?

如果是这样,任何人都可以提出更好的解决方案吗?

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

在这种情况下,谷歌对我的帮助不是很大,所以任何建议都将不胜感激。我已经尽我所能把这句话说得通了。它不是一个容易解释的。

提前感谢人们可以提供的任何帮助。

4

2 回答 2

3

忽略其他实现并专注于您正在使用的设置,答案是“是”和“否”。

是的,如果传入请求的数量增加,尤其是随着令牌数量的增加,您所遵循的方法可能会出现性能问题。这种关系可以很容易地解释为“进来的请求越多,服务器要做的工作就越多。存在的令牌越多,服务器要做的工作就越多。如果请求和令牌都增加,你就爆炸了服务器必须完成的工作量。”

“否”可以通过添加到您当前的解决方案来完成。您可以将缓存添加到您的设置中,以保存已翻译的页面,以便服务器无需查询数据库或按请求翻译每个页面。例如,如果您有一个mypage.aspx包含 20 个可翻译标记的页面 - 让服务器第一次翻译它,然后将翻译后的文件保存为/localized/mypage.EN.html所有未来的请求(如果原始页面没有被修改或新的标记没有'未添加)只会发送缓存页面,而不是每次都重新翻译。

此外,您可以让服务器在更新页面或更新令牌时生成所有翻译,而不是等待客户端请求进入。

于 2012-07-16T14:56:12.593 回答
3

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

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

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

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

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

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

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

于 2012-07-18T17:56:24.317 回答