如何在PHP应用程序中实现多语言?

时间:2009-03-24 03:10:07

标签: php internationalization translation

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

我是否应该使用语言文件命名以下项目:

$ first_name ='name'; $ last_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','此操作不被允许!');

实现此目的的推荐方法是什么?

5 个答案:

答案 0 :(得分:3)

你可以跟随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';

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

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

答案 1 :(得分:1)

这将适用于您在示例中提供的字符串。但还有其他并发症。例如,您是否要以适当的语言环境格式设置日期格式(es vs en?)。如何格式化数字和货币?此外,您可能会收到“动态”消息:“您的收件箱中有$ x条消息”。您想要传递变量的位置。看看一些php本地化库。这是一个在线教程:http://www.devx.com/webdev/Article/38732

另请查看您正在使用的框架。他们中的许多人都有本地化支持。

答案 2 :(得分:1)

你应该如何实现它?像Zend_Translate一样。

答案 3 :(得分:0)

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

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 ...。如果有任何特定于语言环境的内容,只需将其放在语言环境文件中即可。

如果要添加区域设置文件,只需复制现有文件并更改所有引用,而不是为它们拖动代码库。

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

答案 4 :(得分:0)

使用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语言学家)

$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]和“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值,这是一个坏主意。