【问题标题】:PHP :multi-language issuePHP:多语言问题
【发布时间】:2017-12-20 10:55:09
【问题描述】:

我正在创建一个多语言网站,语言切换器会加载所需的语言文件,但如果文件不包含所需的条目,则根本不会出现,甚至默认数组值也不可见。

我是这样翻译的:

$lang = "en";
if(isset($_GET['lang'])){ 
    $lang = $_GET['lang']; 
}
require_once("languages/lang_".$lang.".php");

语言数组:

<?php echo $language["USERNAME"]; ?>

带翻译的语言文件:

$language["USERNAME"] = "User name";

如果语言文件不包含$language["USERNAME"] = "User name";然后什么都没有显示。我想要实现的是:如果加载的语言文件不包含翻译,那么数组应该返回默认值,例如:USERNAME

我确实检查了数组键或值是否可用于显示所需信息,但似乎检查是在加载的语言文件中完成的,如果语言文件为空,则没有可显示的内容。我只需要显示位于主 PHP 文件中的默认数组值。如果数组没有翻译

<?php echo $language["USERNAME"]; ?> 

我想在括号中回显值:USERNAME

【问题讨论】:

  • 您有没有尝试过实现这一目标?
  • 不幸的是不知道从哪里开始。
  • 在其中创建一个传递数组键的函数,并检查该键是否存在于翻译中,然后从翻译中返回值。否则返回默认值。
  • 我这样做了:$value){ if (empty($value)) { $empty = $value = $key; $language[$value] = ucfirst(strtolower($empty)); } } ?> 但是如果语言文件不包含数组值,在索引 php 中没有翻译,只是空的......
  • 使用array_replace函数合并EN和其他语言文件数组

标签: php multilingual


【解决方案1】:

为此,您需要定义一种默认语言。 在这种情况下,我选择英语。

在你的语言文件中,尽量不要定义变量,而是返回翻译数组。

如果您在语言文件中使用 return 关键字,您可以控制变量,因此您可以在脚本中包含多个语言文件。

语言文件

lang_en.php

<?php
   return [
       'username' => 'username'
   ];

其他语言文件的方式相同。

index.php

<?php
$lang = "en" // that's default language key
$GLOBALS['defaultLanguage'] = require_once('lang_'.$lang.'.php');

if(isset($_GET['lang'])){
   $lang = $_GET['lang'];
}
$GLOBALS['language'] = include('lang_'.$lang.'.php');

if(!is_array($GLOBALS['language']) {
   $GLOBALS['language'] = [];
}
echo translate('username');

翻译功能

/**
 * @param string $key
 * @return string
 */
function translate($key)
{
    $language = $GLOBALS['language'];
    $defaultLanguage = $GLOBALS['defaultLanguage'];

    if(!isset($language[$key]) || !$language[$key]){
        $language[$key] = $defaultLanguage[$key];
    }


    return $language[$key];
}

【讨论】:

  • 快速提问: 不会返回任何内容,但是如果没有翻译,有什么简单的方法可以返回数组主值(在本例中为单词 USERNAME)?
  • 如果 $language['username'] 返回 null 或未设置,则 username 值将来自默认语言。只需测试上面的代码,您就会发现它是如何工作的。
  • 不幸的是它不起作用。如果语言文件是空的,只是没有任何翻译的空文档,那么我仍然什么也看不到。
  • 我在包含动态语言文件后进行了编辑。 if(!is_array($language){$language = []; }
  • 谢谢,但它不起作用,没有加载,空的翻译。我觉得没有人明白我真正在问什么 :) 想象一下加载的语言文件绝对是空的,然后语言条目 应该显示 USERNAME 或此对象中存在的任何其他值:
【解决方案2】:

语言数组:

$language["USERNAME"] = "User name";

文件脚本

$lang = "en";
if(isset($_GET['lang'])){ 
    $lang = $_GET['lang']; 
}
require_once("languages/lang_".$lang.".php");
global $templang = $language;

<?php echo language("USERNAME"); ?>

funtion language($key){
    global $templang;
    return (isset($templang[$key]))? $templang[$key] : "Default Value";
}

【讨论】:

    【解决方案3】:

    你可以试试这个:

    function getTranslatedText($key) {
        if(array_key_exists($key, $array_contains_translation_text))
            return $array_contains_translation_text[$key];
        else
            return $array_contains_common_text[$key];
    }
    
    
    getTranslatedText("UserName");
    

    【讨论】:

      【解决方案4】:

      与 Andrei Todorut 的回答类似,您可以简单地合并 2 个语言文件,将默认字符串替换为已翻译,其中未翻译的将保持不变。为此,您可以使用array_replace 函数,这样就可以了。这将保留您的 $language 数组,不需要额外的函数来检查是否存在已翻译的字符串等。

      假设您的语言文件如下所示:

      lang_en.php

      <?php
        return [
         'username' => 'username',
         'no-trans' => 'not translated'
        ];
      

      lang_other.php

      <?php
        return [
         'username' => 'user name'
        ];
      

      多语言数组代码:

      <?php
        $lang = "en";
        $defaultLanguage = require_once('lang_'.$lang.'.php');
      
        if(isset($_GET['lang'])){
          $lang = $_GET['lang'];
        }
        $translated = include('lang_'.$lang.'.php');
      
        if(is_array($translated)) {
          $language = array_replace($defaultLanguage, $translated);
        } else {
          $language = $defaultLanguage;
        }
      

      输出

        print_r($language);
        // output:
        array[
          'username' => 'user name',
          'no-trans' => 'not translated'
        ]
      
        echo $language['username'];
        // output:
        user name
      

      【讨论】:

        【解决方案5】:

        所以,在和Newcomer讨论并更好地理解了一些需求之后,这里是另一个解决问题的方法:

        语言文件

        lang_en.php

        <?php
          $language["USERNAME"] = "Username";
          $language["EMAIL"] = "Email";
          $language["PASSWORD"] = "Password";
          $language["CREATE_ACCOUNT"] = "Create account"; 
        

        lang_de.php

        <?php
          $language["USERNAME"] = "Nutzername";
          $language["PASSWORD"] = "Passwort"; 
        

        脚本和函数

        index.php

        <?php
          require_once('translate.php');
          if(isset($_GET['lang']) && file_exists('lang_'.$_GET['lang'].'.php')) {
            include_once('lang_'.$_GET['lang'].'.php');
          } else {
            include_once('lang_en.php');
          }
        
          // print
          _e('USERNAME');
          // return
          __('USERNAME');
        

        translate.php

        <?php
          function _e($key) {
            if(isset($language[$key])) {
              echo $language[$key];
            } else {
              echo $key;
            }
          }
        
          function __($key) {
            if(isset($language[$key])) {
              return $language[$key];
            } else {
              return $key;
            }
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多