【问题标题】:The pains of creating a global application创建全球应用程序的痛苦
【发布时间】:2009-11-11 19:44:55
【问题描述】:

我需要创建一个全局应用程序。这意味着它应该在世界任何地方、任何国家(或大多数国家)都可以正常工作。这是一个 PHP 网站,会在某些时候处理金钱和时间。

我希望我能知道国家、相关时区、货币格式、符号和代码这类东西的好资源...

如果有人对这些数据有提示,以及我该如何以适当的方式使用它们,我将不胜感激:)

提前致谢!

【问题讨论】:

    标签: web-applications internationalization global localization globalization


    【解决方案1】:

    Zend Locale,Zend 框架的一部分,帮助您解决与货币、时区、翻译等相关的问题...

    逐个采用 Zend Framework 很容易,因此您可以只使用您需要的那些部分(不会膨胀或减速)。

    【讨论】:

      【解决方案2】:

      看看 intl (http://www.php.net/manual/en/book.intl.php)。

      它是 ICU(Unicode 的国际组件,http://site.icu-project.org/)的包装,包含您需要的大部分内容。

      【讨论】:

        【解决方案3】:

        看看Mantis BugTracking software 如何处理国际化。他们使用的方法相当不错。

        其他信息: 自从我使用它已经有好几年了,但是快速浏览一下源代码会发现这部分代码并没有显着变化。他们使用许多产品使用的通用消息目录和获取消息方法。他们的语言 API 非常简单——phpxref output is available,这并不奇怪。消息目录被实现为一个简单地获取include'd 的PHP 脚本。例如,the catalog for English 包含如下条目:

        $s_new_bug = 'New Issue';
        $s_bugnote_added = 'Note Added';
        

        它包含大约 1,600 条左右的声明。有趣的魔法发生在lang_load 内部。加载语言时,会包含目录文件,因此它定义的所有变量都在本地范围内定义。 Lang_load 迭代本地定义的变量并根据变量名称构建消息映射,以便它可以按名称查找消息。比如加载了之前的sn-p之后,就好像执行了下面的语句:

        $g_lang_strings['en']['new_bug'] = 'New Issue';
        $g_lang_strings['en']['bugnote_added'] = 'Note Added';
        

        当 UI 需要访问“硬编码”字符串时,它会使用像 lang_get('new_bug') 这样的调用:

        1. 在当前用户的设置中查找首选语言
        2. 确保通过调用lang_load() 加载语言映射
        3. 从相应的语言映射中返回值

        有趣的是所有机器都是懒加载的。在您需要访问其中一种语言之前,您无需为他们定义了大约 50 种语言这一事实​​付费。总体而言,这可能是我多年来研究过的最令人印象深刻的 PHP 应用程序之一。

        【讨论】:

        • 您能否进一步说明?我很好奇,但我现在没有时间检查代码。
        • 对不起,有更好的方法来处理多语言应用程序 - gettext。我永远不会像你描述的那样走。 Gettext 是事实上的标准,您不必自己构建它。
        【解决方案4】:

        我曾开发过一个全球化的应用程序,我发现最棘手的元素之一是时区以及如何存储日期时间。有时日期需要存储在本地时间(例如世界上某个地方的事件时间),有时它们需要存储在一个公共时区(例如,将创建的日期存储为所有事物的 UTC)并转换为用户需要时的当地时间。我会建议您的数据库列/变量的命名约定,以明确它是什么。

        永远不要尝试手动处理时区转换(它比您想象的要复杂得多),使用某种库/框架 - 我不知道在 PHP 中使用什么,在 .Net 中我们可以依赖 . Net BCL 处理这类事情。

        【讨论】:

        • JonoW,为什么不将所有日期/时间存储为 UTC 并即时转换它们呢?这对我来说似乎更可靠,并且由于您知道日期/时间,因此转换功能将相应地工作。我认为遇到麻烦的唯一方法是您只存储没有日期的时间。
        • 是的,您当然可以,但是您可能希望保留未转换的日期。例如。如果伦敦的用户说伦敦的活动从晚上 7 点开始,您可能不希望德国的用户将其视为晚上 8 点(取决于上下文),因此需要某种方式来记录这一点 - 在我们的例子中,我们选择一个命名惯例。如果事件是全球事件(例如,通过网络广播的演讲),那么以 UTC 存储是有意义的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多