模拟多语言网站的最有效方式

时间:2009-08-03 22:12:37

标签: php templates multilingual

我正在建立一个英文/法文网站,并想知道是否有这样一份工作的最佳实践。

  1. 复制网站并使用适当的网站制作法语和英语文件夹。

  2. 使用PHP将内容与html标签交换。 例如。如果($郎== 'EN'):

  3. 使用php只交换保留html标签的内容。例如。如果声明到处都是。这对效率有害吗?

  4. 任何其他建议将不胜感激

4 个答案:

答案 0 :(得分:5)

我们有一个框架,用于何时(如果)我们的网站走向国际化,就像这样......

文件夹结构;

/
  lang/
    english/
      images/
      text/
    dutch/
      images/
      text/

任何特定语言的文本或图像都会直接从页面中删除,并替换为常量。例如,在登录屏幕上,我们会进入;

echo TEXT_LOGIN_WELCOME;

在/lang/english/text/login.php中定义为;

define('TEXT_LOGIN_WELCOME', 'Welcome, please login:');

但是在/lang/dutch/text/login.php中它被定义为;

define('TEXT_LOGIN_WELCOME', 'Welcome, please login (in dutch):'); 

- )

每个语言定义文件的名称与其用于的页面完全相同,因此当我们加载面向公众的页面时,我们只需要确定用户说的语言,我们可以包含相关的语言定义文件

这个系统的好处是所有的语言信息都是集中的。当你需要添加一种新语言时,只需复制main(english?)文件夹,重命名它,压缩整个文件并将其发送到翻译服务以实现他们的魔力。当然,这个系统的缺点是维护,因为语言和内容都在增长......如果有人对此有任何好主意,那么我很乐意听到它们!

顺便说一句,如果您最终需要通过IP猜测用户的位置,您可能需要查看geoIP

答案 1 :(得分:4)

使用模板系统。 Smarty Template Engine可能是最着名的PHP之一。模板系统不仅可以满足您正在尝试完成的目的,而且还可以通过将显示代码与内容分离来更轻松地维护页面(这也允许您对许多不同的内容页面使用相同的模板类似的性质)。

答案 2 :(得分:2)

作为最简单的方法,我建议您使用i18n internationalization method& gettext目录(.po文件)。
着名的WordPress项目是using it as well

答案 3 :(得分:0)

1 - 复制整个网站会强制您将所有代码修补重复到2个文件夹中: - [

2 - 如果你的意思是像

那样
<?php if($lang=='en') { ?>  
  <p>English text</p>  
<? } else { ?>  
  <p>Text français</p>  
<? } ?>

此解决方案非常适合在同一页面中管理两种语言 但是你仍然有重复的标签。

3 - 仅更改内容,确实令人满意 也许扩散if语句可以压低php编译...我不知道。
无论如何,使用这种方法可以更简洁:

<?php            
  function interpreter($buffer) {
    $pieces = explode('#', $buffer);

    if (isset($_GET['lang'])) $begin=$_GET['lang'];
    else $begin = 1;  // 1 to display français, 2 to display english

    $tot = count($pieces);          

    for ($i=$begin; $i<$tot; $i+=3) {  // remove one language
    unset($pieces[$i]); }

    foreach ($pieces as $value) {  // recompose the text
    $output .= $value; }

    return $output;
  }

  ob_start("interpreter");      
?>

<a href="?lang=#1#2#">#Français#English#</a>
<p>#English text#Texte français#.</p>

<?php ob_end_flush() ?>

在PHP编译之后解析ob_startob_end_flush之间的文本 这意味着受影响的字符串即将到来。来自echo语句,而不是在&lt; ?php?&gt;标签。
来自php的内容也包括受影响的IS 但不是外部的CSS或javascript。

保持注意分隔符#不是其他地方使用的特征 也许您希望替换为||^^

当然,将来您可以将此解决方案改为3种语言或更多语言。但是如果你必须在大型网站的许多行中插入“第三语言翻译#”,那么MatW的解决方案可能适合你。