2015-08-14 19 views
6

Tôi đang làm việc trên trang web GUI có thể sử dụng một số ngôn ngữ. Các tệp HTML gốc mà tôi đã làm việc hoàn toàn tĩnh. Vì vậy, nếu dịch là cần thiết tôi đã phải phân tích thông qua các tập tin, lưu ý nơi một số từ hoặc thuật ngữ được, thu thập tất cả chúng tay cho bộ phận dịch thuật và nhập những bản dịch trong các tập tin ngôn ngữ mới.Sử dụng Javascript để thay đổi ngôn ngữ trang web

Vì các tệp đó hoàn toàn tĩnh nên có nghĩa là phải dịch toàn bộ các phần nhiều lần. Không phải là rất hiệu quả.

Vì vậy, bây giờ tôi đang làm việc trên một số loại từ điển trong Javascript, để chỉ trao đổi các điều khoản trong các trang web đó. Chủ yếu hoạt động theo cách này:

var dicEnglish = { 
term 1: "This is the English text" 
Ref: "Another English text" 
} 
var dicFrench = { 
term 1: "This is the French text" 
Ref: "Another French text" 
} 

Trong đó có tất cả nội dung có thể cần thay đổi. Mỗi ứng cử viên trong mã HTML được một class="dicRef" id="l_dicTag_#" như nhận dạng, mà tôi cắt xuống thẻ từ điển và trao đổi với đoạn mã sau:

var imgSrc = "en"; 
var ActiveDic; 
var langSel; 
if(window.name){ 
    langSel=window.name; 
    } 
else{langSel="English"; 
} 

function LangChange(){ 
langClass = document.getElementsByClassName("dicRef"); 
var i = langClass.length; 
var Start, Stop, idSrc, idDic; 
var navText; 

switch(langSel){ 
    case "French": 
     langSel="French"; 
     imgSrc = "en"; 
     navText="Anglais"; 
     break; 
    case "English": 
    case "Anglais": 
    default: 
     langSel="English"; 
     imgSrc = "fr"; 
     navText="French"; 
     break; 
    } 
ActiveDic="dic"+langSel; 
window.name=langSel; 

while(i--){ 
    idSrc = langClass[i].id; 
    Start=idSrc.indexOf("_")+1; 
    Stop=idSrc.lastIndexOf("_"); 
    idDic=idSrc.slice(Start,Stop); 
    if(window[ActiveDic][idDic]){ 
     document.getElementById(idSrc).innerHTML=window[ActiveDic][idDic];} 
    else{ 
     document.getElementById(idSrc).innerHTML="N/A"; 
    } 
} 
if(document.getElementById("imgSel")){ 
    document.getElementById("imgSel").src="../../img/"+imgSrc+".gif"; 
} 
if (document.getElementById("l_SelLang1_1")){ 
    document.getElementById("l_SelLang1_1").innerHTML=navText; 
} 
} 

Vấn đề nằm ở sự độc đáo của id-tag. Vì một số cụm từ có thể xảy ra nhiều lần và một số từ khóa được tạo nên cần thiết. Tôi muốn ommit truy cập, nhưng không thể tìm thấy bất kỳ định danh khác để sắp xếp tất cả các điều khoản mục tiêu và thay đổi nội dung của họ.

Vì tôi muốn an toàn cho tương lai, tôi thích giải pháp giúp bạn có thể xử lý ngôn ngữ thứ ba có thể. Làm việc với HTML bên trong sẽ cần phải gắn thẻ cùng một cụm từ nhiều lần, một lần cho mỗi ngôn ngữ.

Vì vậy, có cách nào để nhắm mục tiêu tất cả các cụm từ được trao đổi hiệu quả hơn và dễ dàng hơn hoặc cách tốt hơn để làm điều đó không? Tôi chỉ có thể làm việc với các giải pháp phía máy khách, vì vậy không có PHP và như vậy.

Xin cảm ơn trước và hy vọng điều này không quá dài để đọc.

+0

Tôi phải thừa nhận, kể từ khi tôi mới HTML sâu hơn và hoàn toàn sang Javascript Tôi không biết điều đó, bởi vì các trường W3C bắt đầu bằng HTML 4.;) Về khả năng tương thích ngược. Thông số kỹ thuật nói rằng nó phải làm việc với IE 7 hoặc Firefox 3.5 (và sau đó tất nhiên). Tôi tìm thấy thông tin mâu thuẫn trên HTML 5 và các trình duyệt cũ. –

Trả lời

4

Bạn có thể sử dụng thuộc tính dữ liệu: thực tế là "Thuộc tính HTML5 không được hỗ trợ trong IE6 và IE7" có nghĩa là bạn không có phương thức getAttribute() hoặc thuộc tính dataset để truy xuất/truy cập chúng. Nhưng bạn vẫn có thể truy xuất chúng như được giải thích trong this post.

<div id="geoff" data-geoff="geoff"> 
var geoff = document.getElementById("geoff"); 
alert(geoff.getAttribute("data-geoff")); 

Thậm chí tốt hơn, bạn có thể sử dụng jQuery .data() để hỗ trợ các phiên bản trước của IE.

cái gì đó dọc những dòng này nên làm việc:

<div data-translate="translation_key"></div> 
$("[data-translate]").each(function(){ 
    var key = $(this).data('translate'); 
    $(this).html(dictionary[key][current_lang] || "N/A"); 
}); 

dụ làm việc: https://jsfiddle.net/x93oLad8/4/

+0

Xin lưu ý rằng 'dữ liệu' của jQuery chỉ hoạt động với các giá trị mã hóa json, vì vậy bạn cần báo giá và thoát khỏi nội dung của thuộc tính dữ liệu trong trường hợp này (không quá thuận tiện khi làm việc với các giá trị vô hướng). –

+0

Cảm ơn bạn đã chỉ ra điều đó, nhưng tôi nghĩ nó sẽ không bị hạn chế trong trường hợp này vì các khóa dịch phải là các chuỗi ký tự chữ và số, có thể với dấu gạch dưới là dấu tách và không cần bất kỳ sự thoát nào đặc biệt. –

+0

Xin lỗi, tôi đã kiểm tra [tài liệu] (https://api.jquery.com/data/#data-html5) về vấn đề này và tôi gặp lỗi. Các giá trị chuỗi được tải dưới dạng, bạn không cần mã hóa chúng trong JSON. –

2

Một trong những cách xung quanh này có thể sử dụng một số loại hệ thống khuôn mẫu client-side cho giao diện của bạn. Bằng cách đó, bạn không cần tải HTML của mình một cách không cần thiết với một loạt thuộc tính dữ liệu chi tiết các yêu cầu ngôn ngữ, nhưng chỉ mô tả nó một lần trong JavaScript và sử dụng một vài hàm để hỗ trợ dịch. Tôi đã viết mã ví dụ nhanh dưới đây để cho bạn biết ý tôi là gì.

Đây là đối tượng từ điển. Nó chứa tất cả bản dịch theo mã quốc gia.Điều này có nghĩa là bạn không cần riêng biệt từ điển cho từng quốc gia. Điều này rất quan trọng vì nó có nghĩa là chúng ta có thể sử dụng cấu trúc đối tượng đơn lẻ này rất dễ dàng trong chức năng dịch thuật như bạn sẽ thấy trong giây lát. Nó cũng có nghĩa là bạn có thể thêm nhiều ngôn ngữ và bản dịch theo ý muốn.

var dict = { 
    en: { 
     'Hallo': 'Hallo', 
     'Goodbye': 'Goodbye', 
     'castle': 'castle' 
    }, 
    fr: { 
     'Hallo': 'Bonjour', 
     'Goodbye': 'Au revoir', 
     'castle': 'chateau' 
    }, 
    de: { 
     'Hallo': 'Hallo', 
     'Goodbye': 'Auf Wiedersehen', 
     'castle': 'schloss' 
    } 
} 

Đây là mã quốc gia của chúng tôi và nó liên quan trực tiếp đến khóa mã quốc gia trong đối tượng từ điển của chúng tôi:

var lang = 'fr'; 

Việc đầu tiên của hai chức năng của chúng tôi. Điều này có một mẫu và một ngôn ngữ và thực hiện các dịch, trả lại bất cứ điều gì còn lại (thường là một số loại HTML như trong ví dụ của chúng tôi).

function applyTemplate(tmpl, lang) { 

    // find all words within {{word}} a double set of curly braces 
    // (this format is similar to the handlebars templating engine) 
    var regex = /\{\{([a-zA-Z])\w+\}\}/g 

    // for each found word perform the translation and 
    // remove the curly braces 
    return tmpl.replace(regex, function (word) { 
     return translate(dict, lang, word.replace(/[\{\}]/g, '')); 
    }); 
} 

Chức năng dịch có từ điển, ngôn ngữ và từ và trả về từ đã dịch. Lưu ý rằng điều này dễ dàng hơn nhiều với một đối tượng có chứa tất cả các bản dịch của quốc gia.

function translate(dict, lang, word) { 
    return dict[lang][word]; 
} 

Một số HTML. Đây là mẫu của chúng tôi (display: none) và phần tử đầu ra. Lưu ý các từ trong dấu ngoặc nhọn là các từ được dịch.

<div class="template"><div>{{Goodbye}}, {{castle}}</div></div> 
<div id="translation"><div> 

Cuối cùng, đặt nó tất cả cùng nhau:

// grab the template 
var tmpl = document.querySelector('.template').textContent; 
var translation = document.querySelector('#translation'); 

// grab our translated html and add it to the output element 
var html = applyTemplate(tmpl, lang); 
translation.insertAdjacentHTML('afterbegin', html); 

DEMO

Bây giờ, rõ ràng là bạn không cần phải sử dụng phương pháp này (có hàng chục công cụ khuôn mẫu JS trên mạng), nhưng templating là đặc biệt là hữu ích cho các trang web cần sử dụng nhiều ngôn ngữ. Nhiều người làm điều này ở phía sau nhưng, như bạn có thể thấy, nó có thể dễ dàng thực hiện phía máy khách quá.

Hy vọng điều này hữu ích và cung cấp cho bạn một vài ý tưởng khác nhau về cách bạn có thể tiếp cận giải pháp của mình.

11

Không vi phạm đối với người trả lời khác nhưng lưu trữ văn bản trong JavaScript hoặc thuộc tính dữ liệu không tốt cho công cụ tìm kiếm hoặc khách truy cập trang web bị vô hiệu và không có lợi ích khi thêm mã phức tạp không cần thiết. Giải pháp tốt nhất và đơn giản nhất theo ý kiến ​​của tôi là sử dụng thuộc tính HTML lang và sử dụng JavaScript để hiển thị và ẩn ngôn ngữ mong muốn. Giải pháp này cũng giảm xuống một cách duyên dáng vì vậy nếu một khách truy cập trang web đã tắt JavaScript của họ, nó sẽ vẫn hiển thị nội dung. Đây là giải pháp của tôi:

HTML

<button id="switch-lang">Switch Language</button> 

<h1><span lang="en">Hello</span> <span lang="es">Hola</span></h1> 

<p lang="en">I really enjoy coding.</p> 

<p lang="es">Me gusta mucho la codificación.</p> 

jQuery

$('[lang="es"]').hide(); 

$('#switch-lang').click(function() { 
    $('[lang="es"]').toggle(); 
    $('[lang="en"]').toggle(); 
}); 

Sau đó, tôi sẽ khuyên bạn nên thêm HTML5 Định vị để xác định ngôn ngữ để hiển thị ban đầu dựa trên vị trí người dùng trong thế giới.Tôi cũng sẽ sử dụng biểu tượng ngôn ngữ Fontawesome để cho người dùng có thể chuyển đổi ngôn ngữ trong một cách mà là điều dễ hiểu bởi bất cứ ai: http://fontawesome.io/icon/language/

Dưới đây là ví dụ mã làm việc tại CodePen: https://codepen.io/codepajamas/pen/ZejaQz?editors=1010

Dưới đây là một ví dụ thêm về mã bút sử dụng một trình đơn chọn để thay đổi giữa 3 (hoặc nhiều) ngôn ngữ: https://codepen.io/codepajamas/pen/NjGOMV

Cập nhật Ví dụ đầy đủ với Định vị và Cookie

tôi vẫn tiếp tục làm việc về điều này và tạo ra một ví dụ cập nhật chuyển đổi giữa hai ngôn ngữ Trung Quốc và tiếng Anh (nếu bạn cần nhiều hơn hai ngôn ngữ, bạn sẽ phải ẩn tất cả ngôn ngữ và chỉ hiển thị một ngôn ngữ được chọn thay vì sử dụng chuyển đổi theo cách của tôi). Mã này cũng phát hiện nếu một cookie hiện có đã được thiết lập cho ngôn ngữ sử dụng jQuery Cookie. Nó cũng kiểm tra vị trí địa lý của họ nếu trình duyệt của họ hỗ trợ nó sẽ tự động thiết lập ngôn ngữ cho Trung Quốc nếu họ ở Đài Loan hoặc Trung Quốc và mặc định là tiếng Anh ở tất cả các quốc gia khác. Mã dưới đây được nhận xét để bạn có thể thấy những gì từng bước đang làm và hy vọng có thể sửa đổi nó cho phù hợp với nhu cầu của bạn. Ở đây là:

HTML

<button id="switch-lang">Switch Language Icon Here</button> 

<h1><span lang="en">Hello</span> <span lang="zh">你好</span></h1> 

<p lang="en">I really enjoy coding.</p> 

<p lang="zh">我真的很喜歡編碼。</p> 

jQuery Lưu ý: điều này đòi hỏi liên kết đến không chỉ jQuery mà còn jQuery Cookie

$(function() { 
    ///// Language Switching (2 languages: English and Chinese). ///// 

    // Initially disable language switching button. 
    $('#switch-lang').css({'pointer-events':'none', 
    'cursor':'default'}).attr('disabled','disabled'); 

    function langButtonListen() { 
    $('#switch-lang').click(function (event) { 
     event.preventDefault(); 
     $('[lang="zh"]').toggle(); 
     $('[lang="en"]').toggle(); 
     // Switch cookie stored language. 
     if ($.cookie('lang') === 'en') { 
     $.cookie('lang', 'zh', { expires: 7 }); 
     } else { 
     $.cookie('lang', 'en', { expires: 7 }); 
     } 
    }); 
    // Enable lang switching button. 
    $('#switch-lang').css({'pointer-events':'auto', 
    'cursor':'pointer'}).removeAttr('disabled'); 
    } 

    // Check if language cookie already exists. 
    if ($.cookie('lang')) { 
    var lang = $.cookie('lang'); 
    if (lang === 'en') { 
     $('[lang="zh"]').hide(); 
     langButtonListen(); 
    } else { 
     $('[lang="en"]').hide(); 
     langButtonListen(); 
    } 
    } else { 
    // no cookie set, so detect language based on location. 
    if ("geolocation" in navigator) { 
     // geolocation is available 
     navigator.geolocation.getCurrentPosition(function (position) { 
     // accepted geolocation so figure out which country 
     var lat = position.coords.latitude, 
      lng = position.coords.longitude; 
     $.getJSON('http://maps.googleapis.com/maps/api/geocode/json?latlng='+lat+','+lng+'&sensor=true', null, function (response) { 
      var country = response.results[response.results.length-1].formatted_address; 
      if (country === 'Taiwan' || country === 'China') { 
      $('[lang="en"]').hide(); 
      $.cookie('lang', 'zh', { expires: 7 }); 
      langButtonListen(); 
      } else { 
      $('[lang="zh"]').hide(); 
      $.cookie('lang', 'en', { expires: 7 }); 
      langButtonListen(); 
      } 
     }).fail(function (err) { 
      console.log('error: '+err); 
      $('[lang="zh"]').hide(); 
      $.cookie('lang', 'en', { expires: 7 }); 
      langButtonListen(); 
     }); 
     }, 
     function (error) { 
     if (error.code == error.PERMISSION_DENIED) { 
      // denied geolocation 
      $('[lang="zh"]').hide(); 
      $.cookie('lang', 'en', { expires: 7 }); 
      langButtonListen(); 
     } else { 
      console.log('Unknown error. Defaulting to English!'); 
      $('[lang="zh"]').hide(); 
      $.cookie('lang', 'en', { expires: 7 }); 
      langButtonListen(); 
     } 
     }); 
    } else { 
     // geolocation IS NOT available 
     $('[lang="zh"]').hide(); 
     $.cookie('lang', 'en', { expires: 7 }); 
     langButtonListen()); 
    } 
    } 
}); 
+1

Đây là một giải pháp rất tốt đẹp! –

Các vấn đề liên quan