Как я могу получить файл для содержимого каждого языка в этой демонстрации определения языка php? - PullRequest
1 голос
/ 28 февраля 2010

Это руководство посвящено выбору языка в соответствии с предпочтительным языком в браузере.

lang.php:

<?php

function dlang($Var)
{
 if(empty($GLOBALS[$Var]))
 {
  $GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
  $GLOBALS['_SERVER'][$Var]:
  (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var]))?
  $GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
 }
}

function language()
{
 // Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
 dlang('HTTP_ACCEPT_LANGUAGE');
 dlang('HTTP_USER_AGENT');

 $_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
 $_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);

 // Try to detect Primary language if several languages are accepted.
 foreach($GLOBALS['_LANG'] as $K)
 {
  if(strpos($_AL, $K)===0)
   return $K;
 }

 // Try to detect any language if not yet detected.
 foreach($GLOBALS['_LANG'] as $K)
 {
  if(strpos($_AL, $K)!==false)
   return $K;
 }
 foreach($GLOBALS['_LANG'] as $K)
 {
  if(preg_match("/[\[\( ]{$K}[;,_\-\)]/",$_UA))
   return $K;
 }

 // Return default language if language is not yet detected.
 return $GLOBALS['_DLANG'];
}

// Define default language.
$GLOBALS['_DLANG']='es';

// Define all available languages.
// WARNING: uncomment all available languages

$GLOBALS['_LANG'] = array(
'es',
'en',
'zh'
);
?>

session.php:

<?php
//proc all page display
include('lang.php'); //language detector
class Session
{
 var $lang;         //Username given on sign-up
 var $url;          //The page url current being viewed
    var $referrer;     //Last recorded site page viewed

 /* Class constructor */
   function Session(){
      $this->time = time();
      $this->startSession();
   }

   function cf($filename){//function to clean a filename string so it is a valid filename
     $fp = explode('/',$filename);
  $num = count($fp);
  return $fp[$num-1];
 }

   /**
    * startSession - Performs all the actions necessary to 
    * initialize this session object. Tries to determine if the
    * the user has logged in already, and sets the variables 
    * accordingly. Also takes advantage of this page load to
    * update the active visitors tables.
    */
   function startSession(){
     session_start();   //Tell PHP to start the session

  /* Set referrer page */
      if(isset($_SESSION['url'])){
         $this->referrer = $search = $this->cf($_SESSION['url']);
      }else{
         $this->referrer = "/";
      }

      /* Set current url */
      $this->url = $_SESSION['url'] = $this->cf($_SERVER['PHP_SELF']);

   /* Set user-determined language: */
    //set up languages array:
    $langs = array('en','es','zh');
  //
   if(isset($_GET['lang'])){
    if(in_array($_GET['lang'],$langs)){
   $this->lang =  $_SESSION['lang'] = $_GET['lang'];
  }
   }
   if(!isset($_SESSION['lang']) || !in_array($_SESSION['lang'],$langs)){
      $this->lang = $_SESSION['lang'] = language();
   }
 }
};
/**
 * Initialize session object - This must be initialized before
 * the form object because the form uses session variables,
 * which cannot be accessed unless the session has started.
 */
$session = new Session;
?>

Теперь я хочу выбрать lang.en.php или lang.es.php в соответствии со значением $lang (en, es и т.д ...) ). Я хочу, чтобы содержимое каждого языка имело собственный файл.

Я думаю, этот код может работать:

// use appropiate lang.xx.php file according to the value of the $lang
switch ($lang) {
case 'en':
 $lang_file = 'lang.en.php';
 break;

case 'es':
 $lang_file = 'lang.es.php';
 break;

case 'tw':
 $lang_file = 'lang.tw.php';
 break;

case 'cn':
 $lang_file = 'lang.cn.php';
 break;

default:
 $lang_file = 'lang.en.php';
}

 include_once 'languages/'.$lang_file;
?>

lang.en.php (образец):

<?php
$lang = array(
 'tagline_h2' => 'English Tagline',

Я поместил этот оператор switch в конец файла session.php , но, что бы я ни делал, он застрял с отображением языка по умолчанию (en).

Есть предложения?

1 Ответ

1 голос
/ 28 февраля 2010

Попробуйте повторить $lang и посмотреть, каково его значение - чтобы вы могли увидеть, если это проблема в первую очередь?Кроме того, я предлагаю вам заменить переключатель на простой

include_once("languages/lang.$lang.php");

Если вы хотите проверить, является ли это действительный язык, вы можете сравнить его с массивом или проверить, существует ли файл первым.

...