2013-04-20 37 views
0

嘿所有,PHP國際化 - PHP函數的執行順序

我想用php國際化我的網站。我對PHP非常陌生!

index.php啓動與此:

<?php session_start(); ?> 
<?php include 'api/locale.php'; ?> 

<html> 
    <!-- ... --> 
    <div><?php loc('foo') ?></div> 

locale.php看起來是這樣的:

<?php 
    if(isset($_GET['lang']) { 
     $_SESSION['lang'] = $_GET['lang']; 
    } else { 
     $_SESSION['lang'] = 'en';  // default value 
    } 

    // use the necessary language file 
    include('/locale/' . $_SESSION['lang'] . '.php'); 

    // get phrase from URL 
    if (isset($_GET["phrase"])) 
    loc($_GET["phrase"];); 

    function loc($phrase) 
    { 
    global $lang; 

    if(array_key_exists($phrase, $lang)) { 
     echo $lang[$phrase]; 
    } else { 
     echo $phrase; 
    } 
    } 
?> 

的想法是我想使用的功能loc($phrase)獲取內容無論是在德語或英語。但這裏是問題:

如果我有這樣的代碼,我總是得到英文版本,因爲在locale.php我無法從網址獲得lang$_GET['lang']未定義。因此,會話語言始終設置爲默認語言(en)。

但是,如果我移動session_start();到文件locale.php,國際化的工作原理:

index.php

<?php include 'api/locale.php'; ?> 

<html> 
    <!-- ... --> 
    <div><?php loc('foo') ?></div> 

locale.php

<?php 
    session_start(); 
    if(isset($_GET['lang']) { 
     $_SESSION['lang'] = $_GET['lang']; 
    // ... rest the same as above 

爲什麼會這樣呢?我在做一些概念上的錯誤?問題是,我也是用這個locale.php在Ajax調用來獲得國際內容動態生成HTML元素:

function loc(phrase) 
{ 
    var locString; 
    $.ajax({ 
    // force synchronous ajax call, to return with locString 
    async: false, 
    // url with to be translated id 
    url: "api/locale.php?phrase=" + phrase, 
    // "get" for small data (otherwise post) 
    method: "get", 
    // callback function after server has reveiced information 
    success: function (data) 
     { 
     locString = data; 
     } 
    }); 
    return locString; 
} 

所以,如果我一遍又一遍地打電話locale.php這個AJAX調用,是不是有開始新的會話一遍又一遍地?我不確定我是否正確設計了我的功能。我對任何評論感到高興!

謝謝!

===============編輯===============

好了,我現在嘗試一種新的方式:

  1. session.php

    // session starts at this point 
    session_start(); 
    
    // internationalisation in EN and DE 
    $allowedLangs = array('en', 'de'); 
    
    // check lang-parameter given in URL and set language from there 
    if(isset($_GET['lang']) && in_array($_GET['lang'], $allowedLangs)) 
        $_SESSION['lang'] = $_GET['lang']; 
    
    if(!isset($_SESSION['lang'])) 
        $_SESSION['lang'] = 'en';  // default value 
    
  2. locale.php

    // include correct languguage file 
    $root = realpath($_SERVER["DOCUMENT_ROOT"]) ; 
    include($root . '/locale/' . $_SESSION['lang'] . '.php'); 
    
    // get phrase from URL and translate it 
    if (isset($_GET["phrase"])) 
    { 
        $phrase = $_GET["phrase"]; 
        global $lang; 
    
        if (array_key_exists($phrase, $lang)) 
        echo $lang[$phrase]; 
        else 
        echo $phrase; 
    } 
    

兩個文件會包含在index.php

<?php include 'api/session.php'; ?> 
<?php include 'api/locale.php'; ?> 

但是,如果我現在語言環境的短語與阿賈克斯,出現以下錯誤信息:

Notice: Undefined variable: _SESSION in ... /locale.php on line 4 

怎麼可能?我以爲$_SESSION是超全球?!?

+0

你應該仍然可以在'include'd和'require'd文件中訪問'$ _GET' ... – Ryan 2013-04-20 22:33:32

回答

2

當您通過ajax調用帶有session_start的api/locale.php版本時,並不是新建的,但會話將會啓動,這是正確的行爲。

文字開始可能會讓您感到困惑,但會話開始時會正確提供當前會話的信息,而不是新會話。所以沒有什麼可擔心的。

你也可以考慮在尋找

$_SERVER['HTTP_ACCEPT_LANGUAGE'] 

開始在服務器和客戶端的初始語言快速猜測的AJAX乒乓前...

爲您的代碼的兩個版本,當session_start在locale.php中爲
時,它的工作原理並不神祕。

的原因是:

你的Ajax調用的index.php進入腳本,它直接進入到API/locale.php

如果你請不要在api/locale.php中session_start,ajax調用將進入一個無會話的php調用。

所以它會保持默認值,因爲會話數據既不能被提取也不能被記錄。

+0

oooh,有趣!謝謝你的澄清:) – MenschMarcus 2013-04-29 13:00:04

1

我認爲你的locale.php文件中有一些概念錯誤。 事實上,你總是設置$_SESSION['lang']是一種難聞的氣味。
應該有這樣一種情況,當您不設置值$_SESSION['lang']並且只使用$_SESSION['lang']的值而不修改它時。
將您的語言環境文件保持原樣,並且您的ajax調用不會將'lang'作爲參數傳遞,您將始終使用默認語言。
但無論如何,您的local.php文件應該以ishan解釋的session_start();開頭。

順便說一句,你不應該在你的函數loc中使用'echo'。取而代之的是返回結果,並做

echo loc('foo'); 

它會做同樣的工作,但你的loc函數將更加可重用。

+0

+1你有一個很好的觀點......爲什麼要在每次訪問時設置語言?而我錯過了:)。 – Ihsan 2013-04-21 10:54:40

+0

再次感謝您的澄清。正如我所說,我對服務器端編碼和PHP真的很陌生。當然,每次設置'$ _SESSION ['lang']'似乎都很奇怪。但不知何故,我無法找到另一種方法來事先設置超全局變量,並始終在這個'locale.php'文件中訪問它。有任何想法嗎?另一個全局php文件,開始會話並設置所有超全局變量? – MenschMarcus 2013-04-29 13:04:14

0

嗨馬庫斯我會盡力在評論中回答你的問題。

$ _SESSION id確實是超級全球。但是你需要調用session_start()來使其工作。 這就是爲什麼它不再工作locale.php

問題是,你的locale.php文件同時服務於兩個目的。 它應該只是翻譯,但不能直接從URL訪問。 所以你應該這樣做:

  1. session。php
    `

    //在這裏你定義一個默認值。所以無論發生什麼,你都知道$ _session ['lang']
    //將一直設置。

    if(! isset ($_SESSION['lang'] { 
        $_SESSION['lang'] = 'en';  // default value 
    } 
    
    // internationalisation in EN and DE 
    $allowedLangs = array('en', 'de'); 
    
    // check lang-parameter given in URL and set language from there 
    //if necessary, the default value will be overwritten. 
    if(isset($_GET['lang']) && in_array($_GET['lang'], $allowedLangs)) { 
        $_SESSION['lang'] = $_GET['lang']; 
    } 
    
  2. `translate.php

    功能getTranslation($短語,$ LANG = 'EN'){

    $root = realpath($_SERVER["DOCUMENT_ROOT"]) ; 
    include($root . '/locale/' . $lang . '.php'); 
    
    //the array with the phrases and their translations should not be called $lang 
    //to avoid confusion. Let's call it $translations 
    if (array_key_exists($phrase, $translations)) 
        return $translations[$phrase]; 
    else 
        return $phrase; 
    } 
    

    }

  3. locale.php ' 這文件將在ajax中調用。 它將提供$ _SESSION ['lang'],如已經定義的 (例如在index.php中)。否則,你會回到默認的lang。

    include'path_to_translate/translate.php';

    session_start();

    如果(isset($ _ SESSION [ '郎'] {
    $ LANG = $ _SESSION [ '郎'];
    }否則{
    $ LANG = 'EN';
    }

    $短語= $ _GET [ '短語'];

    回聲getT​​ranslation($短語,$ LANG);

  4. index.php

    session_start(); 
        include 'api/session.php'; 
        include 'path_to_translate/translate.php'; 
    
        $lang = $_SESSION['lang']; 
    
    
    
    <some html> 
    
    //to translate anything 
    <?php echo getTranslation($anything, $lang) ?> 
    
    </some html> 
    

希望這會有所幫助。當然,我不能測試所有的代碼,所以他們可能會有一些錯誤。但這是一般的想法。
我儘量不要改變你所做的一切。但仍然存在問題。你不應該在index.php中定義lang。如果您的索引中有表單來選擇lang。在ajax中調用set_lang.php。這不是索引在會話中設置lang。

+0

對不起,以上代碼無法正確格式化。我不知道爲什麼。 – 2013-04-29 17:07:28

+0

非常感謝你的代碼。我會嘗試使用它,然後告訴你,如果我成功了:) – MenschMarcus 2013-04-30 19:37:25

+0

感謝您的一些PHP編碼技巧。它的大部分工作。但是,對於您的代碼,我沒有看到如何設置動態附加JavaScript的文本節點的語言。那麼,如果我想用文本填充HTML節點,我該怎麼做: $('#someId')。html(???) – MenschMarcus 2013-04-30 19:59:38