代码之家  ›  专栏  ›  技术社区  ›  Shawn

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

  •  2
  • Shawn  · 技术社区  · 15 年前

    语境:

    我正处于设计阶段,我希望这将是一个大网站(大量的流量,大量的用户读写数据库)。 我想用我自己说的三种语言(英语、法语)来提供这个网站,当我完成这个网站时,我希望我已经学会了足够的西班牙语来提供它。

    困境:

    我想知道我应该如何提供这些不同的语言(也许将来还会提供更多)。

    标准:

    设计多语言网站的方法很多。我正在寻找一种能使 更快的浏览体验 对于用户。

    选择:

    目前,我可以考虑(并且已经阅读了)以下选择。到目前为止,它们是按优先顺序排序的。

    1. 存储所有特定于语言的字符串 在数据库中 把好的拿来 取决于首选语言 (成员可以选择哪种语言 他们更喜欢) 浏览器默认语言和 语言是在 当前会话的顺序。

      赞成的意见:

      • 大多数时候,一个人 在会议开始时进行测试 确定要用于哪种语言 会话的其余部分(存储 在会话变量中)。否则,a 用户登录还获取 正确的语言,直到 他/她退出(无进一步测试)。所以测试部分应该是 相当快。

      欺骗:

      • 恐怕访问 数据库一直都是 耗时(页面加载时间更长) 用户),尤其是考虑 很多用户也可以 同时访问数据库 出于同样的原因(获得正确语言的网站文本),但是 用于发布评论等。
      • 包含变量的字符串 (例如,“你好”+user.name+“,如何 你是吗?”)更难 存储因为变量(例如 用户名)每个用户的更改。
      • 直接链接到特定语言的门户会很难看(例如www.site.com?LAN= ES)
    2. 存储所有特定于语言的字符串 在文本文件中 把好的拿来 取决于首选语言 (成员可以选择哪种语言 他们更喜欢) 浏览器默认语言和 语言是在 当前会话的顺序。

      赞成的意见:

      • 大多数时候,一个人 在会议开始时进行测试 确定要用于哪种语言 会话的其余部分(存储 在会话变量中)。否则,A 用户登录还获取 正确的语言,直到 他/她退出(无进一步测试)。所以测试部分应该是 相当快。

      欺骗:

      • 恐怕访问 文本文件一直都是 耗时(页面加载时间更长) 用户),尤其是考虑 很多用户也可以 同时访问文件 同样原因的时间(获得正确语言的网站文本)。
      • 包含变量的字符串 (例如,“你好”+user.name+“,如何 是吗?”更难 存储因为变量(例如 用户名)每个用户的更改。
      • 我不认为多个用户可以同时访问文本文件,尽管我可能错了。如果是这样的话,每个加载页面的用户都必须等待轮到他/她访问文本文件。
      • 获取文本文件的最后一个字符串可能很长…
      • 直接链接到特定语言的门户会很难看(例如www.site.com?LAN= ES)
    3. 创建网站的多个版本 在单独的文件夹中,每个版本都使用不同的语言。

      赞成的意见:

      • 处理语言不需要额外的处理,因此没有额外的等待时间。

      欺骗:

      • 维护这个网站就像上学一样:痛苦,漫长,一次又一次的做同样的事情让你变得愚蠢。
      • 难看的URL(例如www.site.com/es/而不是www.site.com)

    附加地 上述性交可与以下一种或多种技术结合:

    1. 高速缓存 某些经常请求的页面(在singleton或static php函数中?).某些句子也可以缓存到每种语言中。

      赞成的意见

      • 快速访问频繁请求的页面。
      • 哪些页面需要缓存可以随时间动态确定。

      欺骗

      • 我不确定这一点,但这会导致服务器的RAM膨胀吗?
    2. 正在重写URL 可以用来做很多事情。

      • 如果用户希望直接访问一种语言,可以使用www.site.com/fr/somefile进行访问,并将其重定向到www.site.com/somefile,但所选语言将存储在会话变量中。

      赞成的意见

      • 像这样的搜索引擎是因为它们有两个不同的页面显示两种不同的语言

      欺骗

      • 在网页上做书签并不意味着当你回来的时候你会使用正确的语言,除非我把语言信息放在URL(www.site.com/somefile)中。朗= FR)

    更多信息

    我通常使用以下技术制作网站:

    • PHP
    • SQL
    • XHTML
    • CSS
    • JavaScript(和Ajax)

    也就是说,如果一个解决方案要求我学习一种新的语言或其他东西,我很愿意这样做。我没有这个项目的最后期限,我确实打算从中学习很多东西!

    结论:

    我正在寻找的是一种方法,它允许我提供多种语言,而不会增加页面加载时间,并且在尝试维护网站时不会发疯。如果你们还有其他的想法,我会把它们加入我的名单。另一种可能是我做得太过分了。也许我没有足够的时间用这些方法来证明这一切是值得的,我只是不知道如何验证我是否需要担心这个。所以如果你对此有什么想法的话,它也会帮助我。

    5 回复  |  直到 13 年前
        1
  •  2
  •   Mr. Shiny and New 安宇    15 年前

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

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

    最后,不要用其中的替换来构建字符串。使用某种格式字符串,否则您的翻译人员会疯狂地尝试翻译句子片段。

    (警告: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中对语言进行编码。如果你关心搜索引擎对你的网站的看法,这是最好的方法。谷歌建议使用不同的主机名或不同的子目录。这意味着用户发送的语言标题不能用于任何内容,除非最初将它们发送到一个或另一个登录页。您将需要根据传入的URL来确定每个请求的语言(这实际上简化了以后的代码)。在Java中,我将把语言代码存储在请求中,只要需要就抓取它。

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

        2
  •  1
  •   a paid nerd    15 年前
    • 根据 Accept-Language HTTP报头。

    • 允许用户在当前会话中设置语言,如果已通过身份验证,则在其用户配置文件中设置语言。

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

    • 具有一个单独或作为束从数据库加载翻译的层,并将它们应用到正在加载的页面。缓存这些部分以加快速度——每次页面加载都不应该为每个可翻译字符串对数据库进行100次调用。

    结帐 how Django does it --这应该是有启发性的。

        3
  •  0
  •   DA.    15 年前

    “恐怕所有时间访问[数据库/文本文件]都非常耗时”

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

    你关于速度的问题实际上与使用多种语言无关。这是一个存储数据(内容)的问题,因此很容易维护并呈现给用户。不管是一种语言还是10种语言,问题都是一样的。

        4
  •  0
  •   monksy    15 年前

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

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

    在HTTP请求头中传递用户希望使用的完整语言。通常不需要使用select语言+查询字符串。

    资源文件是一种方法。它更容易发送给翻译人员。然而,在多个网站之间复苏可能很困难。

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

        5
  •  0
  •   Christian    15 年前

    对于我的解决方案,我希望:

    • 该语言应该显示在URL中,它更好地与谷歌索引网页和谷歌搜索结果中的链接的人。
    • 尽可能多的预生成翻译,以便更快地提供页面服务。

    第一个很容易通过一个类似于 http://example.com/fr/and-so-on . URL重写可以将其转换为 http://example.com/and-so-on?lang=fr 这可能更容易处理。

    对于预生成翻译,最好使用HTML模板框架,这样您就可以从一组源模板生成翻译后的模板。钝器方法是从语言键值文件生成一个SED脚本,并在每个模板上运行该SED脚本以获得翻译版本。

    接下来剩下的就是翻译页面中动态生成的部分。有一些工具用于Java的捆绑,GNU GETTEX是一个非常好的工具。