PHP:多语言问题

时间:2017-12-20 10:55:10

标签: php multilingual

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

我做这样的翻译:

$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

5 个答案:

答案 0 :(得分:3)

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

在您的语言文件中,请尝试不定义变量,而是返回翻译数组。

如果您在语言文件中使用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];
}

答案 1 :(得分:0)

语言数组:

$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";
}

答案 2 :(得分:0)

你可以试试这个:

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");

答案 3 :(得分:0)

类似于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

答案 4 :(得分:0)

因此,在与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;
    }
  }