Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:多语言问题_Php_Multilingual - Fatal编程技术网

PHP:多语言问题

PHP:多语言问题,php,multilingual,Php,Multilingual,我正在创建一个多语言网站,语言切换器加载所需的语言文件,但如果该文件不包含所需的条目,它将不会显示,甚至默认数组值也不可见 我这样翻译: $lang = "en"; if(isset($_GET['lang'])){ $lang = $_GET['lang']; } require_once("languages/lang_".$lang.".php"); 语言数组: <?php echo $language["USERNAME"]; ?> $language["US

我正在创建一个多语言网站,语言切换器加载所需的语言文件,但如果该文件不包含所需的条目,它将不会显示,甚至默认数组值也不可见

我这样翻译:

$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"]; ?> 

我想回显括号中的值:
用户名

语言数组:

<?php echo $language["USERNAME"]; ?>
$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";
}
$lang=“en”;
如果(isset($_GET['lang']){
$lang=$_GET['lang'];
}
需要一次(“languages/lang”.$lang.“.php”);
全局$templang=$language;
功能语言($key){
全球$templang;
返回(isset($templang[$key])?$templang[$key]:“默认值”;
}

为此,您需要定义默认语言。 那样的话,我选择英语

在语言文件中,尝试不定义变量,而是返回转换数组

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

语言文件

lang_en.php

<?php
   return [
       'username' => 'username'
   ];
<?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');
<?php
  return [
   'username' => 'username',
   'no-trans' => 'not translated'
  ];
<?php
  return [
   'username' => 'user name'
  ];
<?php
  $language["USERNAME"] = "Username";
  $language["EMAIL"] = "Email";
  $language["PASSWORD"] = "Password";
  $language["CREATE_ACCOUNT"] = "Create account"; 
<?php
  $language["USERNAME"] = "Nutzername";
  $language["PASSWORD"] = "Passwort"; 
<?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');
<?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;
    }
  }
您可以尝试以下方法:

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

与Andrei Todorut answer类似,您可以简单地合并2个语言文件,将默认字符串替换为已翻译字符串,而未翻译的字符串将保持不变。要实现这一点,您可以使用函数,这将达到目的。这将保留您的
$language
数组,不需要额外的函数来检查是否存在翻译的字符串等

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

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

<?php
   return [
       'username' => 'username'
   ];
<?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');
<?php
  return [
   'username' => 'username',
   'no-trans' => 'not translated'
  ];
<?php
  return [
   'username' => 'user name'
  ];
<?php
  $language["USERNAME"] = "Username";
  $language["EMAIL"] = "Email";
  $language["PASSWORD"] = "Password";
  $language["CREATE_ACCOUNT"] = "Create account"; 
<?php
  $language["USERNAME"] = "Nutzername";
  $language["PASSWORD"] = "Passwort"; 
<?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');
<?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;
    }
  }

因此,在与新来者讨论并更好地理解一些需求之后,这里是问题的另一个解决方案:

语言文件

lang_en.php

<?php
   return [
       'username' => 'username'
   ];
<?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');
<?php
  return [
   'username' => 'username',
   'no-trans' => 'not translated'
  ];
<?php
  return [
   'username' => 'user name'
  ];
<?php
  $language["USERNAME"] = "Username";
  $language["EMAIL"] = "Email";
  $language["PASSWORD"] = "Password";
  $language["CREATE_ACCOUNT"] = "Create account"; 
<?php
  $language["USERNAME"] = "Nutzername";
  $language["PASSWORD"] = "Passwort"; 
<?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');
<?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;
    }
  }

您是否尝试过实现这一点?很遗憾,您不知道从何处开始。请在中创建一个传递数组键的函数,并检查翻译中是否存在此键,然后从翻译中返回值。否则返回默认值。我这样做了:但如果语言文件不包含数组值,在索引php中没有翻译,只是空的…使用
array\u replace
函数合并EN和其他语言文件数组快速问题:将不返回任何内容,但有没有简单的方法返回数组主值(在本例中为word USERNAME)如果没有翻译?如果
$language['username']
返回空值或未设置,则
username
值将来自默认语言。只要测试上面的代码,你就会发现它是如何工作的。不幸的是,它不工作。如果语言文件是空的,只是空文档而没有任何翻译,那么我仍然什么也看不到。我在包含动态语言文件后进行了编辑<代码>如果(!is_array($language){$language=[];}
谢谢,但它不起作用,没有加载任何内容,翻译为空。我觉得没有人理解我的真正要求:)假设加载的语言文件是绝对空的,那么语言条目应该显示用户名或任何其他值,这些值正好出现在这个对象中: