我发布了这个问题,因为我找到了一个缺乏完整解释或最佳方法的帖子。
我是否应该使用语言文件命名以下项目:
$ 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','此操作不被允许!');
实现此目的的推荐方法是什么?
答案 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值,这是一个坏主意。