我试过gettext
,但我的免费托管不允许。我想过Zend_translate
,但我不想使用框架中的元素,因为我的页面大多是静态的。
所以,我最终得到了这个教程:
http://www.bitrepository.com/php-how-to-add-multi-language-support-to-a-website.html
作者只使用基本的php(不确定),它似乎有用,但我不太确定它是否是一个好的(或常见的)练习,或者它是否会在将来引起我的问题(添加和删除一堆代码)。
这是:
的common.php :
<?php
session_start();
header('Cache-control: private'); // IE 6 FIX
if(isSet($_GET['lang']))
{
$lang = $_GET['lang'];
// register the session and set the cookie
$_SESSION['lang'] = $lang;
setcookie("lang", $lang, time() + (3600 * 24 * 30));
}
else if(isSet($_SESSION['lang']))
{
$lang = $_SESSION['lang'];
}
else if(isSet($_COOKIE['lang']))
{
$lang = $_COOKIE['lang'];
}
else
{
$lang = 'en';
}
switch ($lang) {
case 'en':
$lang_file = 'lang.en.php';
break;
case 'de':
$lang_file = 'lang.es.php';
break;
default:
$lang_file = 'lang.en.php';
}
include_once 'languages/'.$lang_file;
?>
语言/ lang.en.php:
<?php
/*
-----------------
Language: English
-----------------
*/
define('GREETING, Hello World');
?>
语言/ lang.es.php:
<?php
/*
-----------------
Language: Espanol
-----------------
*/
define('GREETING, Hola Mundo');
?>
的index.php:
include_once 'common.php';
<p><?php echo LANG_TEST; ?></p>
所以,如果我想将其更改为西班牙语,我只需在?lang=es
(URL
之后)
index.php
答案 0 :(得分:7)
首先,它不适用于您的代码。你必须使用
define('GREETING', 'Hello World').
查看define的PHP手册。
其次,使用含量是一个可怕的想法。你正在乱扔全局命名空间,有大量的常量和风险不变的名字缩写。请参阅Userland Naming Guide。
如果您不想使用Zend_Translate
(您不必使用整个框架)并且不能使用gettext
,我建议您使用数组来存储翻译,例如像这样的东西:
$lang = array(
'greeting' => 'Hello World'
'something' => 'else'
);
然后您可以在模板中使用它:
<h1><?php echo $lang['greeting'] ?></h1>
这样,您只需要确保$lang
尚未在全局范围内定义。
有些人更喜欢使用默认语言而不是翻译ID,例如他们更喜欢写
<h1><?php echo t('Hello World') ?></h1>
其中t
将输入字符串映射到输出字符串。翻译数组必须包含完整的句子,然后将这些句子映射到其他语言,例如
$lang = array(
'Hello World' => 'Hola Mundo'
);
但当然,你也可以通过$lang['Hello World']
访问它。对于长串而言,它只会变得尴尬。许多翻译功能允许你传递额外的参数,以允许这样的事情:
$lang = array(
'currentTime' => 'The current time is %s'
);
<h1><?php echo t('currentTime', date('H:i:s')) ?></h1>