对于用户来说哪种多语言网页设计解决方案最快,如果这确实是一个问题?

时间:2009-11-10 19:23:58

标签: optimization web performance multilingual

5 个答案:

答案 0 :(得分:2)

无论您使用数据库还是文件系统来存储翻译,您都应该一次性加载文本,然后从内存中提供文本。大多数应用程序通常没有这么多的文本,这成为一个问题。在Java或.Net中,这可以通过将文本存储在单个或静态对象中来实现。然后所有字符串都在RAM中,不需要加载或解析。如果您的平台没有方便的方法在ram中存储数据,则可以运行单独的缓存应用程序,例如memcached。

隐藏细节可以减轻您关注的其他问题。构建或找到一个框架,让您加载翻译,然后通过某些键查找它们。如果您决定稍后切换到文件或数据库,则其余代码不受影响。在短期内,做哪个更容易。我发现最好有一个混合:在版本控制系统中管理应用程序文本和源代码更容易。但是一些文本经常更改,或者需要更改而不需要构建+部署周期,并且该文本应该在DB中。

最后,不要构建带有替换的字符串。使用某种格式字符串,因为否则你的翻译人员会疯狂地尝试翻译句子碎片。

(警告:Java代码示例)

//WRONG
String msg = "Hello, " + username + ", welcome back.";

//RIGHT
String fmt = "Hello, %s, welcome back."; // in real code: load this string from a file or the db
String msg = fmt.format(username);

另一个人提到在URL中编码语言。如果您关心搜索引擎对您网站的看法,这是首选方法。 Google建议使用不同的主机名或不同的子目录。这意味着用户发送的语言标题不能用于任何内容,除非最初将它们发送到一个目标网页或另一个目标网页。您需要根据传入的URL确定每个请求的语言(这实际上会在以后简化您的代码)。在Java中,我将语言代码存储在Request中,并在需要时随时抓取它。

在URL中处理语言代码的最简单方法是使用重写。客户端发送www.yoursite.com/de/somepage请求,并在内部将请求重新写入www.yoursite.com/somepage并将语言标识符存储在某处。在Java中,每个请求都有一个HttpServletRequest对象,您可以在其中存储请求生命周期的属性。如果您的框架没有类似的东西,您只需在网址中添加一个参数:www.yoursite.com/de/somepage => www.yoursite.com/somepage?lang=de。如果您使用的是基于主机名的语言,则可以使用de.yoursite.com或www.yoursite.de等主机名。使用这种方法有利有弊。首先,使用国家代码顶级域名(TLD)意味着注册新顶级域名(TLD)并试图弄清楚国家代码是否适合代表一种语言(通常不是)。使用不同的主机名/域意味着您必须考虑在哪些域中存储cookie。如果您想要一个无cookie的子域,您需要仔细计划。但是从编码方面来看,基于语言的主机名不需要任何额外的重写;您可以读取主机名(它是HTTP请求中的主机头)并解析它以确定语言。

答案 1 :(得分:1)

  • 根据Accept-Language HTTP标头以语言提供初始页面。

  • 让用户在当前会话中设置语言,如果经过身份验证,则在用户个人资料中设置语言。

  • 在您的代码和模板中,将字符串标记为“可翻译”。您应该拥有收集代码库中所有字符串的工具,并让翻译人员对其进行翻译。

  • 有一个图层可以单独或作为一个包从数据库加载翻译,并将它们应用到正在加载的页面。缓存这些部分以使它们快速 - 每个页面加载不应该为每个可翻译的字符串调用数百个数据库。

结帐how Django does it - 它应该具有启发性。

答案 2 :(得分:0)

“我担心一直访问[数据库/文本文件]会非常耗时”

可能会,但这就是为什么你可能会在某种程度上使用缓存。几乎所有大型站点都访问存储在HTML页面本身之外的数据,因此,根据需要使用缓存技术。

关于速度的问题确实与拥有多种语言无关。这是存储数据(内容)的问题,因此易于维护并呈现给用户。无论是一种语言还是10种问题都是一样的。

答案 3 :(得分:0)

尽可能创建最常用的网站形式。从数据库导入翻译,后退(即语言顺序,如果翻译不存在,则使用下一个最佳语言(德语:德语,荷兰语,英语等)。

您可以通过保留动态创建的页面的缓存来解决性能问题。 [检查相关数据并在必要时进行更新]

用户希望的语言在HTTP请求标头中传递。选择语言+查询字符串通常是不必要的。

资源文件是一种方法。发送给翻译人员更容易。但是,在多个网站中重复使用可能很困难。

数据库很方便,因为它是应该在网站上备份的第一件事。它还具有快速的优点。但是,如果您有一个非常关注数据库的项目,则可能不希望在数据库上增加额外的压力。

答案 4 :(得分:0)

对于我的解决方案,我想要这个:

  • 该语言应在网址中显示,它可以更好地与谷歌索引页面和人们关注谷歌搜索结果中的链接。
  • 尽可能多地预先生成翻译,以加快页面服务速度。

第一个很容易通过拥有像http://example.com/fr/and-so-on这样的网址来完成。 URL重写可以将其转换为http://example.com/and-so-on?lang=fr,这可能更容易处理。

对于预生成的翻译,最好使用html模板框架,以便您可以从一组源模板生成翻译的模板。一种直接的方法是从语言键值文件生成sed脚本,并在每个模板上运行该sed脚本以获得翻译版本。

剩下的就是翻译动态生成的页面部分。有一些工具可供java拥有捆绑,gnu gettext是一个非常好的工具。