2013-12-07 45 views
0

在今年,我寫了一個非常大的網站,沒有CMS。我從頭開始寫它。今天我開始實施翻譯系統。將語言添加到所有網站URL的智能方式?

這個想法基本上是在URL內部添加/language/。這意味着,如果索引頁,當我瀏覽的默認語言,具有URL

http://www.racebooking.net/index.php 

一旦以查看該網站的英文版英國國旗用戶點擊,該網址將成爲

http://www.racebooking.net/en/index.php 

in .htaccess,那麼,我有一個規則,將/en/轉換爲?lang=en

問題

每個頁面都有噸的鏈接,這意味着我有千千萬萬的<a href=".."></a>標籤在我的網站。

例如,我的index.php頁面上,我有這樣一個

<a href="http://www.racebooking.net/forum">Forum</a> 

一個鏈接,如果我目前瀏覽英文版本,應該指向

http://www.racebooking.net/en/forum 

在乍一看,這個想法是將其更改爲

<a href="http://www.racebooking.net/<?php echo $_GET['lang'] . '/';?>forum">Forum</a> 

其作品不錯!但是,問題是我的網站上有數千個<a>標籤!將它們全部改爲完全是瘋狂的,只需在其中添加<?php echo $_GET['lang'] . '/';?>!這需要幾天,幾天和幾天的工作。

那麼,有沒有一種巧妙的方法將/language/添加到我的所有網站的URL?

編輯

我不會使用任何JS喜歡。所有禁用js的用戶在瀏覽我的網站時都會遇到問題!

+0

您是否使用_any_類框架?如果是這樣,響應過濾器可能會解決這個問題。 –

+0

不,我沒有使用任何框架:( –

+1

你使用的是Apache嗎?也許你可以用mod_rewrite來做到這一點?http://tech-blog.borychowski.com/index.php/2009/03/htaccess/redirect-根據瀏覽器語言的mod-rewrite-and-http_accept_language/ –

回答

3

HTTP permanent redirect status code (301)正好適合您的情況。指向您網站的所有鏈接仍然有效,並且任何書籤都將更新爲新的網址路徑結構。

您可以在Apache中使用mod_rewrite設置它:

RewriteRule /(?!en|es|de|fr|it)(/?.*)$ http://www.mydomain.com/en/$1 [R=301,L] 

這將重定向所有的URL路徑,不都可以啓動enesdefriten(默認)子路徑。

編輯點評:

上述解決方案將使您的所有環節的工作(除舊換新)。

如果您還需要更改頁面上的所有鏈接,以便搜索引擎能夠看到它們,那麼您唯一的選擇就是在您的PHP/HTML代碼中重寫它們(使用JavaScript對於許多人來說是個壞主意原因)。

在這種情況下,最好的選擇是編寫一個輔助函數,它根據當前的語言爲您生成鏈接。這樣,您將擁有一個單一的點,您可以在其中更改鏈接,以便將來再次更改。

不幸的是,您將無法一次更改所有鏈接。如果你有成千上萬的人,而且沒有生成它們的普通代碼,那麼你必須一個接一個地完成這個任務。好消息是,你不是第一個遇到這個問題的人,而專業IDE的開發人員已經實施了一些工具來幫助你。我個人的選擇是商業軟件,但其他開源IDE也有很好的查找/替換選項。你可以寫一個正則表達式,它會找到你的鏈接,並根據你提供的規則來替換它們。編寫一個好的正則表達式替換器可能證明是非常有益的,而不是一個接一個地檢查所有鏈接。

這是可能實現的URL幫手之一:

class UrlHelper 
{ 
    public static function make($base, $lang = null) 
    { 
     if ($lang === null) { 
      $lang = 'en'; 
      if (isset($_GET['lang'])) { 
       $lang = $_GET['lang']; 
      } 
     } 
     $url = "http://www.racebooking.net/{$lang}/{$base}"; 
     return $url; 
    } 
} 

現在,你必須找到在哪裏鏈接outputed所有地方和使用助手:

<a href="<?php echo UrlHelper::make('/old/url'); ?>">Link</a> 

注意,這是隻是它如何工作的一個例子。我實際上不建議將這個幫手作爲靜態方法來實施,因爲static is pure evil。對於你真正的實施,你可能會考慮幫助對象,而不是幫手方法

+0

但是,如果他在'URL/es/index'上並鏈接到'URL/forum',他將被重定向到'URL/en/forum',贏得' – kero

+0

不可以,開始處的'es'被上面的正則表達式所識別,因此重定向不會發生。 –

+0

與'URL'在開始時它不起作用,但它可以通過更新上面的正則表達式或者添加一個新的具有更高優先級的'RewriteRule',但是我不能爲他寫整個配置,對吧? –

-1

您可以嘗試在會話中存儲語言,然後在您的頁面上檢查它,如果找不到,您可以默認爲英語。

<? 
start_sesssion(); 
$_SESSION["lang"]="en"; 

Other File 
/*****************\ 
start_session(); 
if($_SESSION["lang"]=="en") 
    english(); 
+0

我認爲你已經錯過了這個問題的要點 –

+0

是的,他錯過了,我已經知道何翻譯的內容。 ..我需要知道的是如何添加/語言/每個網址,而不會改變我的網站的每個網址! –

0

寫Java小程序(或您最喜歡的任何其他語言),超過所有的網站文件和變更迭代:

<a href="http://www.racebooking.net/ ...> 

<a href="http://www.racebooking.net/<?php echo $_GET['lang'] . '/';?> 

或使用jQuery並在每個頁面中包含一個像這樣的函數:

$('a').click(function() { 
    var oldhref = $(this).attr('href'); 
    // change href string here, e.g. insert /language/ 
    $(this).attr('href', newhref); 
}); 

該函數將更改頁面上每個錨點標籤的href。

0

警告,這只是一個想法......別人能改善這樣的回答:

你可以使用jQuery修改客戶端的鏈接。所以你會有一個JS函數來使用jquery在現有標記上重建URL。您只需將變量發送到每頁頂部的JS。我假設你在每個頁面上都有某種包含功能,所以你可以在不修改每一頁的情況下添加一些代碼。

如(未測試)...

//top of page 
var lang = <?php echo $lang?>; //this is the language 

//this function takes a url and adds a language variable to the end 
function updateurl(url) { 
url = url + '?lang=' + lang; 
} 

//this loops through each anchor on the page and adds the language to the querystring 
$("a").each(function(index) { 
    jquery(this).attr('href') = update(jQuery(this).attr('href')) 
}); 
0

如果你不想挑出的每一個環節,你可以用我的JS代碼。

JavaScript是目前沒有任何內置的可能性輸出GET價值,所以你首先需要把郎值在一個小的HTML元素,從JS然後採取內容:

<div class="current-lang"><?php echo $_GET['lang']; ?></div> 

如果你喜歡,你可以在CSS的幫助下隱藏元素。 (如圖的例子中)

JS-示例:http://jsfiddle.net/leo/BH9nf/(jQuery的需要)

這是一個大量的工作,所以我將不勝感激正表決。

+0

這是一個不錯的解決方案,但如果用戶禁用了js,它將無法工作!我不希望發生這種情況.. –