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

标签 optimization web performance multilingual

上下文:

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

困境:

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

标准:

存在许多设计多语言网站的方法。我正在寻找能够产生 的技术。更快的浏览体验对于用户。

选项:

目前,我可以想到(并已阅读)以下选择。到目前为止,它们按优先顺序排序。

  • 存储所有特定于语言的字符串
    在数据库中
    并取得好的
    取决于首选语言
    (成员(member)可以选择哪种语言
    他们更喜欢),
    浏览器默认语言和
    在此期间选择语言
    当前 session ,按该顺序。

    优点:
  • 大多数时候,一个
    在 session 开始时进行测试
    确认使用哪种语言
    session 的剩余时间(存储
    在 SESSION 变量中)。否则,一个
    用户登录也会获取
    正确的语言并保持它直到
    他/她退出(没有进一步的测试)。所以测试部分应该是
    相当快。

  • 缺点:
  • 我担心访问
    数据库一直很
    耗时(较长的页面加载时间
    用户),尤其是考虑到
    很多用户也可以
    同时访问数据库
    时间出于同样的原因(以正确的语言获取网站文本),但也
    发表评论之类的。
  • 包含变量的字符串
    (例如“你好”+用户名+“,如何
    你是?”)更难
    存储因为变量(例如
    用户名)更改为每个用户。
  • 直接链接到特定语言的门户会很丑陋(例如 www.site.com?lang=es)
  • 存储所有特定于语言的字符串
    在文本文件中
    并取得好的
    取决于首选语言
    (成员(member)可以选择哪种语言
    他们更喜欢),
    浏览器默认语言和
    在此期间选择语言
    当前 session ,按该顺序。

    优点:
  • 大多数时候,一个
    在 session 开始时进行测试
    确认使用哪种语言
    session 的剩余时间(存储
    在 SESSION 变量中)。否则,一个
    用户登录也会获取
    正确的语言并保持它直到
    他/她退出(没有进一步的测试)。所以测试部分应该是
    相当快。

  • 缺点:
  • 我担心访问
    一直都是文本文件
    耗时(较长的页面加载时间
    用户),尤其是考虑到
    很多用户也可以
    同时访问文件
    时间出于同样的原因(以正确的语言获取网站文本)。
  • 包含变量的字符串
    (例如“你好”+用户名+“,如何
    你是?”)更难
    存储因为变量(例如
    用户名)更改为每个用户。
  • 我不认为多个用户可以同时访问文本文件,尽管我可能是错的。如果是这种情况,每个加载页面的用户都必须等待轮到他/她访问文本文件。
  • 获取文本文件的最后一个字符串可能会很长...
  • 直接链接到特定语言的门户会很丑陋(例如 www.site.com?lang=es)
  • 创建网站的多个版本 在单独的文件夹中,其中每个版本都使用不同的语言。

    优点:
  • 处理语言不需要额外的处理,所以没有额外的等待时间。

  • 缺点:
  • 维护网站就像上学一样:痛苦,漫长,一遍又一遍地做同样的事情会让你变得愚蠢。
  • 丑陋的网址(例如 www.site.com/es/而不是 www.site.com)

  • 另外 ,上述 coices 可以与以下一种或多种技术结合使用:
  • 缓存 某些经常请求的页面(在单例或静态 PHP 函数中?)。某些句子也可以为每种语言缓存。

    优点
  • 更快速地访问经常请求的页面。
  • 哪些页面需要缓存可以随着时间动态确定。

  • 缺点
  • 我不确定这个,但这最终会使服务器的 RAM 膨胀吗?
  • 重写网址 可以用于很多事情。
  • 寻找直接访问一种语言的用户可以使用 www.site.com/fr/somefile 这样做,并将被重定向到 www.site.com/somefile,但所选语言将保存在 session 变量中。

  • 优点
  • 搜索引擎之所以如此,是因为它们有两个不同的页面可以显示两种不同的语言

  • 缺点
  • 为页面添加书签并不意味着您回来时会使用正确的语言,除非我将语言信息放在网址中 (www.site.com/somefile?lang=fr)

  • 更多信息

    我通常使用以下技术来制作网站:
  • PHP
  • SQL
  • XHTML
  • CSS
  • Javascript(和 AJAX)

  • 话虽如此,如果解决方案需要我学习一门新语言或其他东西,我很乐意这样做。我对这个项目没有截止日期,我确实打算从中学到很多东西!

    结论:

    我正在寻找一种方法,它允许我提供多种语言,同时不会增加页面加载时间,并且在尝试维护网站时不会发疯。如果你们/女孩有我应该考虑的其他想法,我会尝试将它们添加到我的列表中。另一种可能性是我做得太过分了。也许我不会在这些方法上获得足够的时间来让这一切都值得,我只是不知道如何验证我是否需要担心这个......所以如果你有任何想法,它会也帮帮我。

    最佳答案

    无论您使用数据库还是文件系统来存储翻译,您都应该一次加载所有文本,然后从内存中提供。大多数应用程序通常不会有太多的文本,这会成为一个问题。在 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 中对语言进行编码。如果您关心搜索引擎对您网站的看法,这是首选方法。 Google 建议使用不同的主机名或不同的子目录。这意味着用户发送的语言标题不能用于任何事情,除非最初将它们发送到一个或另一个登录页面。您需要根据传入的 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 请求中的 Host header )并解析它以确定语言。

    关于optimization - 如果这确实是一个问题,哪种多语言网页设计解决方案对用户来说是最快的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710520/

    相关文章:

    java - 计算 Activity 调用的更快算法

    c++ - 为什么在 c/c++ 中,开关的优化方式与链式 if else 不同?

    .net - 如何突破ASP.NET webservice的限制?

    javascript - 将用户操作从一个页面发送到另一个页面

    html - 我正在尝试删除标题中不需要的空间

    MySQL 使用双重内连接更新性能较差

    c# - 带有很多控件的假滚动容器

    javascript - 这个图表叫什么?如何在网络浏览器中重现它?

    performance - 我如何在 D 中执行类似 memcpy 的操作

    python - 在不使用 "If...Else Statements"的情况下从循环中计算属性的优雅且节省代码的方法