【问题标题】:Most effient way to template a multi lingual site模板化多语言网站的最有效方法
【发布时间】:2009-08-03 22:12:37
【问题描述】:

我正在建立一个英语/法语网站,并且想知道是否有适合此类工作的最佳实践。

  1. 复制站点并制作一个包含适当站点的法语和英语文件夹。

  2. 使用 PHP 将内容与 html 标签交换。 例如。 if($lang=='en'):

  3. 使用 php 仅交换内容,使两者的 html 标签相同。例如。到处都是 if 语句。这会影响效率吗?

任何其他建议将不胜感激

【问题讨论】:

  • 我应该提一下英文部分已经建好了。许多“if”语句会显着降低我的网站速度吗?

标签: php templates multilingual


【解决方案1】:

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

文件夹结构;

/
  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):'); 

;-)

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

这个系统的好处是所有语言信息都是集中的。当您需要添加新语言时,只需复制主(英语?)文件夹,重命名,压缩整个文件并将其发送到翻译服务以发挥他们的魔力。当然,这个系统的缺点是随着语言和内容的增长而维护......如果有人对此有任何好的想法,那么我很想听听他们的意见!

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

【讨论】:

  • 我认为,对于一个提供太多语言的 UI 的网站来说可能很难。
【解决方案2】:

使用模板系统。 Smarty Template Engine 可能是最著名的 PHP 之一。模板系统不仅可以满足您要实现的确切目的,而且还可以通过将显示代码与内容分开来更轻松地维护页面(这还允许您对一个网站的许多不同内容页面使用相同的模板)相似的性质)。

【讨论】:

  • Smarty 看起来很酷。我尝试构建自己的模板引擎。我正在寻找现在使它成为多语言的最佳方法。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    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() ?>
    

    ob_startob_end_flush 之间的文本在 php 编译后被解析。
    这意味着受影响的字符串即将到来,例如。来自 echo 语句,不在 标签内。
    来自 php 的内容也包括受到影响。
    但不是外部 css 或 javascript。

    注意分隔符# 不是一个尚未在其他地方使用的字符。
    也许您更愿意用||^^ 替换

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多