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

如何在PHP应用程序中实现多语言?,php,internationalization,translation,Php,Internationalization,Translation,我自己发布这个问题,因为我发现这篇文章缺乏完整的解释或最好的方法 我是否应该使用语言文件来命名项目,如: $first_name='name'; $last_name='last_name' 然后根据选择包括此文件 我有一个应用程序,我需要有两种语言 我想要这行的东西: 我应该为此使用常量文件吗 constants.php 定义('OPERATION\u NOT\u ALLOWED\u EN','This OPERATION NOT ALLOWED!') 定义('操作不允许','此操作不允许

我自己发布这个问题,因为我发现这篇文章缺乏完整的解释或最好的方法

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

$first_name='name'; $last_name='last_name'

然后根据选择包括此文件

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

我想要这行的东西:

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

constants.php

定义('OPERATION\u NOT\u ALLOWED\u EN','This OPERATION NOT ALLOWED!')

定义('操作不允许','此操作不允许!')


实现这一点的推荐方法是什么?

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

locale_en.php:

define('GREETING', "Welcome to Widgets Inc');

在设置中,检测区域设置并执行以下操作:

if ($locale == 'en') {
  require 'locale_en.php';
} else if ($locale == 'de') {
  require 'locale_de.php';
}
这为您提供了常量的好处,并使本地化对您的应用程序相当透明,因为您不必到处执行
if($locale…
。如果有特定于区域设置的内容,只需将其放在区域设置文件中即可

如果您想添加一个区域设置文件,只需复制一个现有文件并更改所有引用,而不是拖网您的代码库


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

我将使用具有常量的区域设置特定文件,例如:

locale_en.php:

define('GREETING', "Welcome to Widgets Inc');

在设置中,检测区域设置并执行以下操作:

if ($locale == 'en') {
  require 'locale_en.php';
} else if ($locale == 'de') {
  require 'locale_de.php';
}
这为您提供了常量的好处,并使本地化对您的应用程序相当透明,因为您不必到处执行
if($locale…
。如果有特定于区域设置的内容,只需将其放在区域设置文件中即可

如果您想添加一个区域设置文件,只需复制一个现有文件并更改所有引用,而不是拖网您的代码库


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

您可以追随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['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_newst_post']='View newst post';
$lang['Page_of']='Page%d of%d';//替换为:例如,第1页,共2页
$lang['ICQ']='ICQ编号';
$lang['AIM']='AIM Address';
$lang['MSNM']='MSN Messenger';
$lang['YIM']='Yahoo Messenger';
当然,它包含在用户设置中指定的文件中,但是您可以在查询字符串中建议访问类似于
constants.php
文件的内容


为了清晰起见,您可能需要将文件命名为
lang_en.php
或类似的名称。

您可以跟随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['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_newst_post']='View newst post';
$lang['Page_of']='Page%d of%d';//替换为:例如,第1页,共2页
$lang['ICQ']='ICQ编号';
$lang['AIM']='AIM Address';
$lang['MSNM']='MSN Messenger';
$lang['YIM']='Yahoo Messenger';
当然,它包含在用户设置中指定的文件中,但是您可以在查询字符串中建议访问类似于
constants.php
文件的内容


为了清晰起见,您可能需要将文件命名为
lang_en.php
或类似的名称。

这将适用于您在示例中给出的字符串。但是还有其他复杂问题。例如,您是否希望将日期格式化为适用于区域设置的适当格式(es vs en?)。数字和货币的格式如何?此外,您可能会收到“动态”消息:“收件箱中有$x消息”。您希望在其中传递变量。请查看一些php本地化库。这里是一个在线教程:


另外,请看一下您正在使用的框架。其中许多框架都有本地化支持。

这将适用于您在示例中给出的字符串。但还有其他复杂问题。例如,您是否希望将日期格式化为适用于区域设置的适当格式(es vs en?)。数字和货币的格式如何?此外,您可能会收到“动态”消息:“收件箱中有$x消息”。您希望在其中传递变量。请查看一些php本地化库。这里是一个在线教程:


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

有免费的第三方控件可以使用ISO标准XML文件来实现这一点(我编写了一个数据库实用程序来创建、编辑并导出为这种格式)

其他答案非常手动,比使用此控件需要更多的工作

您需要的控件位于:

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

require_once "ezc/Base/base.php";
/**
 * __autoload()
 *
 * @param mixed $className
 * @return
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}
然后必须定义XML语言文件的位置(请参阅:ISO639-2、ISO3166和Qt语言专家)

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

getTranslation( "SOME_KEY" );
要检索具有参数的短语,请使用以下语法,请注意[KEYWORD]和“KEYWORD”之间的关系是有意的,建议使用<!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>