0

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

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

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

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

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

会喜欢以下几行:

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

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

常量.php

define('OPERATION_NOT_ALLOWED_EN', '这个操作是不允许的!');

define('OPERATION_NOT_ALLOWED_ES', '这个操作是不允许的!');

完成此操作的推荐方法是什么?

4

5 回答 5

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或类似名称。

于 2009-03-24T03:24:10.420 回答
1

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

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

于 2009-03-24T03:25:55.550 回答
1

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

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

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

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

于 2009-03-24T03:23:16.197 回答
0

有免费的第 3 方控件可以使用 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 值,这是个坏主意。

于 2009-03-24T03:31:13.463 回答