【问题标题】:Core PHP Site translate to other language核心 PHP 网站翻译成其他语言
【发布时间】:2017-01-04 10:39:09
【问题描述】:

我创建了数组 $_en 来存储英语单词/句子,并创建了 $_no 数组来存储挪威语文本,以将其用作我的核心 PHP 项目的翻译。

<?php
$_en = array(
    'mail' => 'email',
    'msg1' => 'how are you?'

);
$_no = array(
    'mail' => 'epost',
    'msg1' => 'hvordan har du det ?'
);

echo "EMAIL IN ENGLISH:".$_en['mail']."\n"; //email in english
echo "EMAIL IN NORWEGIAN:".$_no['mail']; //email in NORWEGIAN
echo "Message IN NORWEGIAN:".$_no['msg1']; //Message in NORWEGIAN

根据数组和键值,将根据站点翻译函数调用文本。

如果有任何更好的解决方案和增强功能,我们非常欢迎。提前纠正我。

【问题讨论】:

  • 最好有一个带有字符串标记的语言类文件,并将它们的转换放在单独的文件中。根据选择的语言调用文件
  • 问号前有空格是不正确的挪威语,不知道为什么有人开始使用它。您还可以查看php.net/manual/en/function.gettext.php,它是 php 中 i18n 支持的构建
  • @rypskar 谢谢!你可以给我详细解释一下
  • @ben 你可以在stackoverflow.com/questions/4062832/…看看答案

标签: php core translate


【解决方案1】:

正如我在 cmets 中的 Thamilan 所提到的,一个更好的解决方案是使用一个类来处理转换。

这样想;

你的模板文件

$trans = new Translate('en');
<h1><?php echo $trans->__('This is a title'); ?></h1>

翻译.php

class Translate {
    public function __construct($lang) {
        $this->lang = $lang;
    } 

    public function __($string) {
        // $translatedString = $this->getTranslatedString($string);
        return $translatedString;
    }
}

在此类中,您需要从存储位置获取翻译。您可以将此类存储在数组中,或者更好的解决方案是从 CSV 文件中加载它们。

【讨论】:

    【解决方案2】:

    试试这个:--

    parse_ini_file() 是一个非常强大的小工具,它完全可以满足您的期望。使用像这样的简单文件,我们将其称为 en.ini:

    PAGE_TITLE = My website page title
    HEADER_TITLE = My website header title
    SITE_NAME = My Website
    SLOGAN = My slogan here
    HEADING = Heading
    MENU_LOGIN = Login
    MENU_SIGNUP = Sign up
    MENU_FIND_RIDE = Find Ride
    MENU_ADD_RIDE = Add Ride
    MENU_LOGOUT = Logout
    

    您可以简单地使用: parse_ini_file('en.ini') 来返回一个与您的 switch 语句完全相同的数组,这将更容易让其他(非程序员)为您读取和写入。如果您要继续使用这种样式命名文件,您可以将 userLanguage() 简化为:

    public function userLanguage()
    {
        $file = '/path/to/language/config/' . $this->UserLng . '.ini';
        if(!file_exists($file))
        {
            //Handle Error
        }
        return parse_ini_file($file);
    }
    

    【讨论】:

      【解决方案3】:

      尝试另一种解决方案:--

      创建抽象类

      interface Language
      {
          public function getPageTitle();
          public function getHeaderTitle();
          public function getSiteName();
          public function getSlogan();
          public function getHeading();
          public function getMenuLogin();
          public function getMenuSignup();
          public function getMenuFindRide();
          public function getMenuAddRide();
          public function getMenuLogout();
      }
      

      虽然接口很小,但实现它可能会产生一个大文件,尽管它可以说比数组样式更清晰:

      class English implements Language
      {
          public function getHeaderTitle()
          {
              return 'My website header title';
          }
      
          public function getHeading()
          {
              return 'Heading';
          }
      
          // etc...
      }
      

      替代方案:--

      或者,您可以组合这些样式并使用带有访问该数组的 getter 方法的单例语言,即:

      class Language
      {
          private $languageArray;
          private $userLanguage;
      
          public function __construct($language)
          {
              $this->userLanguage = $language;
              $this->languageArray = self::userLanguage();
          }
      
          private static function userLanguage()
          {
              $file = '/path/to/language/config/' . $this->userLanguage . '.ini';
              if(!file_exists($file))
              {
                  //Handle Error
              }
              return parse_ini_file($file);
          }
      
          public function getPageTitle()
          {
              return $this->languageArray['PAGE_TITLE'];
          }
      
          public function getHeaderTitle()
          {
              return $this->languageArray['HEADER_TITLE'];
          }
      
          //etc...
      }
      

      这将提供两者的好处。不过就个人而言,除非您计划在不久的将来添加更多语言,否则我相信解决方案 #2 最适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多