上下文:
我正处于我希望成为一个大网站的设计阶段(大量流量,大量用户读取和写入数据库)。
我想以我自己会说的三种语言(英语、法语,当我完成网站时,我希望我已经学会了足够的西类牙语来提供)
困境:
我想知道我应该如何提供这些不同的语言(也许将来会更多)。
标准:
存在许多设计多语言网站的方法。我正在寻找能够产生 的技术。更快的浏览体验对于用户。
选项:
目前,我可以想到(并已阅读)以下选择。到目前为止,它们按优先顺序排序。
在数据库中 并取得好的
取决于首选语言
(成员(member)可以选择哪种语言
他们更喜欢),
浏览器默认语言和
在此期间选择语言
当前 session ,按该顺序。
优点:
在 session 开始时进行测试
确认使用哪种语言
session 的剩余时间(存储
在 SESSION 变量中)。否则,一个
用户登录也会获取
正确的语言并保持它直到
他/她退出(没有进一步的测试)。所以测试部分应该是
相当快。
缺点:
数据库一直很
耗时(较长的页面加载时间
用户),尤其是考虑到
很多用户也可以
同时访问数据库
时间出于同样的原因(以正确的语言获取网站文本),但也
发表评论之类的。
(例如“你好”+用户名+“,如何
你是?”)更难
存储因为变量(例如
用户名)更改为每个用户。
在文本文件中 并取得好的
取决于首选语言
(成员(member)可以选择哪种语言
他们更喜欢),
浏览器默认语言和
在此期间选择语言
当前 session ,按该顺序。
优点:
在 session 开始时进行测试
确认使用哪种语言
session 的剩余时间(存储
在 SESSION 变量中)。否则,一个
用户登录也会获取
正确的语言并保持它直到
他/她退出(没有进一步的测试)。所以测试部分应该是
相当快。
缺点:
一直都是文本文件
耗时(较长的页面加载时间
用户),尤其是考虑到
很多用户也可以
同时访问文件
时间出于同样的原因(以正确的语言获取网站文本)。
(例如“你好”+用户名+“,如何
你是?”)更难
存储因为变量(例如
用户名)更改为每个用户。
优点:
缺点:
另外 ,上述 coices 可以与以下一种或多种技术结合使用:
优点
缺点
优点
缺点
更多信息
我通常使用以下技术来制作网站:
话虽如此,如果解决方案需要我学习一门新语言或其他东西,我很乐意这样做。我对这个项目没有截止日期,我确实打算从中学到很多东西!
结论:
我正在寻找一种方法,它允许我提供多种语言,同时不会增加页面加载时间,并且在尝试维护网站时不会发疯。如果你们/女孩有我应该考虑的其他想法,我会尝试将它们添加到我的列表中。另一种可能性是我做得太过分了。也许我不会在这些方法上获得足够的时间来让这一切都值得,我只是不知道如何验证我是否需要担心这个......所以如果你有任何想法,它会也帮帮我。
最佳答案
无论您使用数据库还是文件系统来存储翻译,您都应该一次加载所有文本,然后从内存中提供。大多数应用程序通常不会有太多的文本,这会成为一个问题。在 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/