【问题标题】:How to Implement multi language in PHP application?如何在 PHP 应用程序中实现多语言?
【发布时间】:2023-03-06 23:27:01
【问题描述】:

我自己发布了这个问题,因为我发现一个缺乏完整解释或最佳方法的帖子。

我是否应该使用语言文件来命名项目,例如:

$first_name='名字'; $last_name = '姓氏';

然后根据选择包含此文件?

我有一个需要两种语言的应用程序。

会喜欢这几行:

http://www.myapp.com/?lang=en http://www.myapp.com/?lang=es

我应该为此使用常量文件吗?

constants.php

define('OPERATION_NOT_ALLOWED_EN', '该操作不允许!');

define('OPERATION_NOT_ALLOWED_ES', '该操作不允许!');

推荐的方法是什么?

【问题讨论】:

    标签: php internationalization translation


    【解决方案1】:

    您可以跟随 phpBB 的脚步 - 他们使用 $lang[] 数组,代码如下:

    $lang['Next'] = 'Next';
    $lang['Previous'] = 'Previous';
    $lang['Goto_page'] = 'Goto page';
    $lang['Joined'] = 'Joined';
    $lang['IP_Address'] = 'IP Address';
    
    $lang['Select_forum'] = 'Select a forum';
    $lang['View_latest_post'] = 'View latest post';
    $lang['View_newest_post'] = 'View newest post';
    $lang['Page_of'] = 'Page <b>%d</b> of <b>%d</b>'; // Replaces with: Page 1 of 2 for example
    
    $lang['ICQ'] = 'ICQ Number';
    $lang['AIM'] = 'AIM Address';
    $lang['MSNM'] = 'MSN Messenger';
    $lang['YIM'] = 'Yahoo Messenger';
    

    它当然包含在用户设置中指定的文件中,但您可以在访问类似于constants.php 文件的查询字符串中建议?lang=en

    为了清楚起见,您可能希望将文件命名为 lang_en.php 或类似名称。

    【讨论】:

    • 我也推荐这种方法。
    【解决方案2】:

    这适用于您在示例中给出的字符串。但还有其他并发症。例如,您是否想以适合区域设置的格式(es 与 en?)来格式化日期。数字和货币的格式如何?此外,您可能有“动态”消息:“您的收件箱中有 $x 条消息”。你想传递变量的地方。查看一些 php 本地化库。这是一个在线教程:http://www.devx.com/webdev/Article/38732

    还请查看您正在使用的框架。其中许多有本地化支持。

    【讨论】:

      【解决方案3】:

      你应该如何实现它?喜欢Zend_Translate

      【讨论】:

        【解决方案4】:

        我会使用带有常量的特定于语言环境的文件,例如:

        locale_en.php:
        
        define('GREETING', "Welcome to Widgets Inc');
        

        locale_de.php:
        
        define('GREETING', 'Wir begruessen Sie zu Widgets Inc');
        

        在您的设置中,您检测语言环境并执行以下操作:

        if ($locale == 'en') {
          require 'locale_en.php';
        } else if ($locale == 'de') {
          require 'locale_de.php';
        }
        

        这为您提供了常量的好处,并使本地化对您的应用程序相当透明,因为您不必到处都使用if ($locale ...。如果有任何特定于语言环境的内容,只需将其放入语言环境文件中即可。

        如果你想添加一个语言环境文件,只需复制一个现有的文件并更改所有引用,而不是为它们搜索你的代码库。

        您还可以将代码放入这些文件中,例如为这些区域设置正确格式化数字和日期(包括每种语言中的正确名称以及逗号、引号、句点等的使用)、货币转换和显示等。

        【讨论】:

        • 我是否使用 GET 检测语言?类似于: $locale = $_GET['lang'];那将读取 uri?
        • 自动检测语言存在问题。我会默认使用英语(或任何适合主要网站受众的语言),然后在页面上设置一些小标志来更改它,这会将其设置在 cookie 中。
        【解决方案5】:

        有免费的 3rd 方控件可以使用 ISO 标准 XML 文件执行此操作(我编写了一个数据库实用程序来创建、编辑和导出到这种格式)。

        其他答案非常手动,比使用此控件涉及更多工作。

        您需要的控件位于: http://ezcomponents.org/docs/api/trunk/introduction_Translation.html

        在服务器上安装 eZ 组件后,您需要检索所有 eZ 组件所需的基本控件

        require_once "ezc/Base/base.php";
        /**
         * __autoload()
         *
         * @param mixed $className
         * @return
         */
        function __autoload( $className )
        {
            ezcBase::autoload( $className );
        }
        

        然后您必须定义 XML 语言文件的位置(参见:ISO639-2、ISO3166 和 Qt Linguist)

        $config["language_code"] = "en_us"; // as defined by ISO639-2 and ISO3166
        
        // grab our translation XML file
        $backend = new ezcTranslationTsBackend( dirname( __FILE__ ). '/translations' );
        $backend -> setOptions( array( 'format' => $config["language_code"].'.xml' ) );
        
        // create a manager object
        $manager = new ezcTranslationManager( $backend );
        
        $language = $manager->getContext( $config["language_code"], 'strings' );
        

        现在您只需调用以下函数即可获取字符串

        getTranslation( "SOME_KEY" );
        

        要检索具有参数的短语,请使用以下语法,请注意 [KEYWORD] 和“关键字”之间的关系是有意的,建议使用

        getTranslation( "FIND_[KEYWORD]_BY_[TYPE]", array("keyword" => $keyword, "type" => $type ) );
        

        TS XML 文件的示例是(应称为 en_US.xml)

        <!DOCTYPE TS>
        <TS>
        <context>
            <name>strings</name>
            <message>
                <source>ZONE_TYPE</source>
                <translation>Zone Type</translation>
            </message>
            <message>
                <source>ZONE_TOOL</source>
                <translation>Zone Tool</translation>
            </message>
            <message>
                <source>HELLO_[NAME]_WELCOME_TO</source>
                <translation>Hello, %name, welcome to Webfood Admin</translation>
            </message>
            <message>
                <source>YOUR_ADMINISTRATIVE_SESSION_HAS</source>
                <translation>Your administrative session has timed out. Please login again.</translation>
            </message>
        </context>
        </TS>
        

        我只需要在您的 PHP 会话中设置一个存储使用的语言的设置,可能会在用户登录他们想要的语言之前或之后询问用户,如果您有帐户,则将其存储到他们的用户表中。没有理由一遍又一遍地发送 URL 值,这是个坏主意。

        【讨论】:

        • Ty,期待链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2011-01-11
        • 2011-08-10
        • 2010-11-12
        相关资源
        最近更新 更多