2014-01-07 97 views
2

我正在嘗試創建一個網站,在第一次訪問時顯示所選語言頁面。單擊語言名稱時,語言名稱字符串(例如法語)將存儲在Web /本地存儲中。當用戶下次訪問網站時,將檢查語言字符串並顯示特定的語言頁面。 我寫了12個函數來存儲每種語言的錨點標籤點擊時的語言字符串。像這樣:用於網站本地化的網絡存儲

function english() 
{ 
if(typeof(Storage)!=="undefined") 
    { 
    localStorage.clear(); 
    localStorage.language="English"; 
window.location.reload(); 
    } 
} 

function french() 
{ 
if(typeof(Storage)!=="undefined") 
    { 
    localStorage.clear(); 
    localStorage.language="French"; 
    window.location.href = "french.html"; 
    } 
} 

這種方法真的有效嗎?我認爲爲多種語言創建多個頁面對搜索引擎優化很有用,而不是隨時更改文本字符串。 直到我在查看Chrome開發者控制檯時,字符串的值才被保存。但是,當我關閉標籤頁或瀏覽器窗口時,存儲的值將消失,下次它不記得語言時。

我使用這個代碼檢查語言(我必須做的12種語言):

window.onload = function() { 
if (localStorage.language="Language") 
    { 
    window.location.href = "language.html"; 
    } 
else if (localStorage.language="English") 
    { 
    window.location.href = "eng.html"; 
    } 
else if (localStorage.language="French") 
    { 
    window.location.href = "french.html"; 
    } 
else if (localStorage.language="Spanish") 
    { 
    window.location.href = "spanish.html"; 
    } 

的代碼檢查後還挺停止第一「如果」的條件,真的還是假的,它只是停在那裏除此之外,不檢查'else if'條件。

有人可以幫助我嗎?即使在瀏覽器關閉後,示例代碼似乎仍將值存儲在Web存儲中,但我無法將其複製到我的瀏覽器中。

回答

8

您遇到的問題是使用=而不是===來比較(正如wonko79所解釋的那樣)。至於如何改進你所做的代碼 - 這裏有很多問題,最重要的是很多重複的信息是什麼檢查和應用什麼,這是一個危險,因爲它使維護困難。我放在一起解決您的問題用一個對象來存儲所有關於語言的信息,並創建接口挑選來自同一數據集的語言:

var locales = { 
    'us': {label: 'English',location:'english.html'}, 
    'de': {label: 'German',location: 'german.html'}, 
    'fr': {label: 'Français',location: 'french.html'}, 
    'nl': {label: 'Nederlands',location: 'dutch.html'}  
}; 

http://jsfiddle.net/codepo8/KzNUM/

我也寫了一個較長的博客文章更多的細節http://christianheilmann.com/2014/01/08/this-developer-wanted-to-create-a-language-selector-and-asked-for-help-on-twitter-you-wont-believe-what-happened-next/

+0

難道你不是指'德意志'? – Neil

0

據我可以看到你做assignements而不是比較。

下面的代碼應該工作:

window.onload = function() { 
    if (localStorage.language=="Language") 
     { 
     window.location.href = "language.html"; 
     } 
    else if (localStorage.language=="English") 
     { 
     window.location.href = "eng.html"; 
     } 
    else if (localStorage.language=="French") 
     { 
     window.location.href = "french.html"; 
     } 
    else if (localStorage.language=="Spanish") 
     { 
     window.location.href = "spanish.html"; 
     } 

更多信息請參見JavaScript Comparison and Logical Operators

1

正如wonko79已經指出的,問題是,你的if檢查裏面你居然重新分配的變量,而不是檢查其內容。要真正檢查字符串內容是否相等,您需要使用兩個等號==(或者如果您想檢查類型是否相等,則爲三個)。此外,每當你不斷重複自己的想法,這是一個很好的跡象,你可以改善你的代碼。在這種情況下,您總是檢查localStorage.language是否等於某種語言,如果是這種情況,那麼您將位置更改爲該語言的URL。因此,本質上,您是查找存儲在本地存儲中的語言的URL。

JavaScript具有高效的查找數據結構:對象。因此,要改善你的情況,我們可以首先將數據存儲在一個對象:

var languageUrls = { 
    'language': 'language.html', 
    'english': 'eng.html', 
    'french': 'french.html', 
    'spanish': 'spanish.html' 
}; 

後,我們已經做了,我們可以簡單地查找立即基礎上,localStorage.language值的值:

window.onload = function() { 
    // we can perform the lookup by providing the *key* in brackets: 
    var url = languageUrls[localStorage.language]; 

    // in case the key did not exist in our object, url will be null 
    if (!url) { 
     // so we might want to provide a fallback value here 
     url = 'eng.html'; 
    } 

    // now we have a valid URL in our `url` variable 
    window.location.href = url; 
} 

這就是你需要做的一切;不需要重複檢查if語句,只需簡單查找即可。而當你想添加另一種語言時,只需要向languageUrls對象添加另一個條目。

一個類似的想法可以應用於你的語言功能,它改變本地存儲中存儲的語言。相反,有多個不同的功能,它的足有一個函數,它接受的語言作爲一個參數,然後再次使用查找更改URL:

function changeLanguage (language) { 
    // it’s always a good idea to normalize input; 
    // in this case, keep everything lower-case 
    language = language.toLowerCase(); 

    // this time, we might want to make sure first that the language is 
    // valid – all valid languages are stored in our `languageUrls` object, 
    // so we can use that 
    var url = languageUrl[language]; 

    if (!url) { 
     // There was no entry for the language—it’s not a valid language—so 
     // we just return from the function here, not doing anything. We could 
     // show an error though. 
     return; 
    } 

    // so the language is valid, and the target URL is stored in `url` 

    if (typeof(Storage) !== 'undefined') { 
     // update the stored language; note that I’m not calling `clear` 
     // because we might want to store other information in the future 
     // too. It’s enough to just overwrite the stored language. 
     localStorage.language = language; 
    } 

    // we still want to redirect, even if the storage was not available 
    window.location.href = url; 
} 

這就是你需要設置已經一切。剩下的就是將電話從english()更改爲changeLanguage('english')