2014-01-23 58 views
0

我正試圖想出一種有效的方法來在我的網站中實現語言選擇。使用數據庫和PHP的多語言網站

我右上角有一些標記,點擊時我希望所有的文本都變成所選擇的語言,其中翻譯存儲在我的數據庫中。

我應該這樣做,在如URL參數:

www.myside.com?lang=3 

我有這個唯一的問題是,它可能就複雜的方式,我的路線網址的東西,它不使url看起來很乾淨。

更好的方法是將它存儲在會話中,並且僅在語言發生更改時才從數據庫提取翻譯。翻譯將保存在會話數組中,因此如果您知道我的意思,那麼用戶不會在每次加載頁面時都訪問數據庫。

我在想,如果像下面是我想要的達到的一個好辦法:

Session::set('langarray', array(
     'id' => $languageId, 
     'cake' => $this->model->getLanguagesNavigation('cake', $languageId), 
     'login' => $this->model->getLanguagesNavigation('login', $languageId), 
     'register' => $this->model->getLanguagesNavigation('register', $languageId), 
     'share' => $this->model->getLanguagesNavigation('share', $languageId), 
     'galleries' => $this->model->getLanguagesNavigation('galleries', $languageId), 
     'decorator' => $this->model->getLanguagesNavigation('decorator', $languageId), 
     'find' => $this->model->getLanguagesContent('find', $languageId), 
     'headertext' => $this->model->getLanguagesContent('headerText', $languageId), 
    )); 

    header('Location: ' . $_SERVER['HTTP_REFERER']); 

在我看來:

... 
public function render($viewFile, $data = NULL) { 
    if(!Session::get('langarray')) 
    { 
     $this->Language = new Language; 
     $this->Language->setLanguage(1); 
    } 
    if (is_array($data)) { 
     extract($data); 
    } 
    include Vs . $viewFile . '.php'; 
} 
... 

這簡直是將語言設置爲1 (英語)如果會話變量尚未設置,即語言未被選中。

在我的HTML,我只想回應相應的元素數組中得到了這個詞:

... 
<p><?PHP echo $_SESSION['langarray']['headertext'];?></p> 
... 

這是一個好方法嗎?或者是否有一種將語言實現到網站的標準方式?


我的舊網站目前使用就像我提到的一個URL方法(?LANG = 3)和外國變種的社會企業做的相當不錯。我喜歡使用子域名的想法,但是如何根據第一個之前出現的內容在頁面上顯示正確的內容。在網址?例如。 FR。德。 etc

+3

對於搜索引擎優化,我會建議將語言放在URL中。搜索引擎通常不會在瀏覽您的網站時使用會話,因此您可能會錯過很多索引頁面。您可以通過爲每種語言設置單獨的子域或「子文件夾」樣式來做到這一點。例如主頁是example.com/page/,默認爲英文,那麼西班牙文版本將爲example.com/es/page/。這是我在酒店的網站上使用.htaccess所做的。 – Mike

+0

你應該真的使用poedit。 http://stackoverflow.com/questions/11563403/poedit-and-php-annotations#11625690 – pregmatch

+0

@Mike你願意分享你的.htaccess那部分嗎?我主要關心的是,如何路由請求(www.site.com/controller/method/param1 ...)可能無法工作。 – imperium2335

回答

0

正如我在我上面的評論中提到的,我建議將語言放在URL中主要用於搜索引擎優化。無可否認,它可能需要更多的工作才能建立,但我認爲這些收益大於成本。

例如,我有一個hotel website英文,西班牙文,中文和法文。該URL的結構是這樣的:

/ <- Main page in English 
/es/ <- Main page in Spanish 
/zh/ <- Main page in Chinese 
/fr/ <- Main page in French 

那麼對於子頁面,我做人之道:

/pagename/ 
/es/pagename/ 
/zh/pagename/ 
/fr/pagename/ 

然後,我這是怎麼重定向其他語言正確的腳本:

# Spanish 
RewriteRule ^es/(.*/)?$ $1/index.php?lang=es [NC,L] 

# French 
RewriteRule ^fr/(.*/)?$ $1/index.php?lang=fr [NC,L] 

# Chinese 
RewriteRule ^zh/(.*/)?$ $1/index.php?lang=zh [NC,L] 

這適用於重寫index.php。對於其他事情,我通常使用「友好」URL來明確指定它們。例如,「謝謝」頁面與我們聯繫頁面:

# Contact Us thank you page 
RewriteRule ^([a-z_]+)?/?contact/thankyou$ /contact/thankyou.php?lang=$1 [L] 

我也用來做以下改寫包含參數的網址,但我認爲做這樣可能會被棄用,不能太確定(我有它的代碼,但因爲我不使用參數,它不會觸發):

RewriteCond %{query_string} ([^=]*)=(.*) 
RewriteRule ^es/(.*)$ $1/index.php?lang=es&%1=%2 [NC,L] 

不過,酒店提供旅遊和我們有一個主/tours/頁,我想爲每個單獨的遊覽提供一個友好的網址,例如/tours/56/waterfall-hike(帶遊覽ID和遊覽名稱中的一個)所以這個處理旅行團的改寫:

# Rewrite tours 
RewriteRule ^([a-z_]+)?/?tours/([0-9]+)/reserve$ /tours/tour_reserve.php?lang=$1&id=$2 [L] 
RewriteRule ^([a-z_]+)?/?tours/([0-9]+)/(.*) /tours/tour_text.php?lang=$1&id=$2&urlstr=$3 [L] 

# Tours thank you page 
RewriteRule ^([a-z_]+)?/?tours/thankyou$ /tours/thankyou.php?lang=$1 [L] 

我只是需要用PHP來驗證所提供的塞串是正確的,如果不是做301重定向到基於ID的正確網址。我用這個來計算的話:

function getTourURL($tour_name) { 
    // Transliterate non-ascii characters to ascii 
    $str = trim(strtolower($tour_name)); 
    $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 

    // Do other search and replace 
    $searches = array(' ', '&', '/'); 
    $replaces = array('-', 'and', '-'); 
    $str = str_replace($searches, $replaces, $str); 

    // Make sure we don't have more than one dash together 
    $str = preg_replace("/(-{2,})/", "-", $str); 

    // Remove all invalid characters 
    $str = preg_replace("/[^A-Za-z0-9-]/", "", $str); 

    // Done! 
    return $str; 
} 

那麼只有在其它困難的事情,而不只是把它們放在回主頁是語言切換語言(呸!)。這就是我做的:

// First define the languages used: 
$langs = array(
    'en' => array(
     'lang_code' => 'en_US', 
     'locale' => 'en_US.UTF-8', 
     'base_url' => '/', 
     'name' => 'English', 
    ), 
    'es' => array(
     'lang_code' => 'es_MX', 
     'locale' => 'es_MX.UTF-8', 
     'base_url' => '/es/', 
     'name' => 'Español', 
    ), 
    'fr' => array(
     'lang_code' => 'fr_FR', 
     'locale' => 'fr_FR.UTF-8', 
     'base_url' => '/fr/', 
     'name' => 'Français', 
    ), 
    'zh' => array(
     'lang_code' => 'zh_CN', 
     'locale' => 'zh_CN.UTF-8', 
     'base_url' => '/zh/', 
     'name' => '中國的', 
    ), 
); 
define('LOCALE', $_GET['lang']); 

// Then get the path to the current script after the language code 
$path = (LOCALE == 'en') ? '' : LOCALE.'/'; 

$parsed_url = parse_url($_SERVER['REQUEST_URI']); 
$path = ltrim(str_replace('/'.LOCALE , '', $parsed_url['path']), '/'); 

define('REDIRECT_SCRIPT', $path); 

// Then I put all the links into an array to be displayed in the menu 
foreach ($langs as $lang => $arr) { 
    if ($lang == LOCALE) { 
     continue; 
    } 
    $link = (isset($lang_override[$lang])) 
     ? $lang_override[$lang] 
     : $arr['base_url'] . REDIRECT_SCRIPT; 
    $lang_subs[] = array(
     'name' => '<div class="'.$lang.'"></div> '.$langs[$lang]['name'], 
     'link' => $link, 
     'lang' => $lang, 
    ); 
} 

這可能不會爲你開箱,但至少應該給你一個出發點。嘗試使用print_r($lang_subs);來查看它包含的內容,並根據您的網站設計進行調整。

+0

謝謝!我做了類似於你的建議,而不是像fr.mysite.com等子域。只是我個人的偏好,我猜想,但工作方式類似。 – imperium2335

1

也許我是老式的,但我一直有一個lang文件夾,每種語言的文件(lang.en.php,lang.fr.php,lang.es.php等等)。

在我有一個陣列中的每個文件,像這樣的:

$langarray = array("login" => "...", "connect" => "...", "logout" => "..."); 

最終與他們實際的東西...工作得更好:}

然後,根據不同的$ _SESSION變量,我包括正確的文件。你甚至可以儲存「en」幷包含lang。'。$ _ SESSION ['lang']。'。php。

似乎稍微好一點,不必爲SQL查詢那種事情,但不太容易維護。我認爲這是沒有人錯的問題類型。

1

是的,在會話中保存語言代碼比不斷傳遞參數要好。

不,將翻譯的文本存儲在會話中沒有意義,因爲那麼您每個用戶都會在內存中反覆存儲相同的文本。更好地實現數據庫緩存或者爲轉換表包含PHP文件,而不是將其存儲在會話中。

您應該使用屬於HTML規範一部分的標準字母縮寫,而不是編寫語言的數字代碼。瀏覽器按優先順序將首選語言作爲名爲Accept-Language的標頭髮送。爲了避免讓用戶點擊語言選擇,您可以從標題中讀取該列表並遍歷它,直到找到您支持的第一種語言。但總是很好給用戶一些手動方式來改變它。

Zend框架有處理語言的一些功能,但我從來沒有使用它。

+1

如果您的網站返回英語並且需要進行其他語言的會話,那麼Google-bot如何獲取您的其他語言的網頁? – Mike

+0

加一個,因爲這是Facebook通過會話進行的操作。 –

+0

關於搜索引擎優化,你說得很好,邁克。但是兩者可以一起使用。您可以按照您的建議在網址中包含該語言,並將其保留在會話中。這樣,如果以後我只是去了域名,它會記住我已經選擇的語言,並且不會讓我再次選擇。 – developerwjk