40

Tôi hiện đang sử dụng Handlebars.js (liên kết với Backbone và jQuery) để tạo một ứng dụng web gần như hoàn toàn phía máy khách, và tôi đang gặp vấn đề với việc quốc tế hóa ứng dụng này.Làm thế nào để tạo i18n với Handlebars.js (mẫu ria mép)?

Tôi làm cách nào để thực hiện công việc này?

Có plugin nào không?

+3

bạn có thể sử dụng http://i18next.com cho i18n-> đi kèm với trình trợ giúp thanh tác vụ: http://i18next.com/pages/doc_templates.html – jamuhl

Trả lời

79

Tôi biết điều này đã được trả lời, nhưng tôi muốn chia sẻ giải pháp đơn giản của tôi. Để xây dựng dựa trên giải pháp Gazler bằng cách sử dụng I18n.js (mà chúng tôi sử dụng với dự án của chúng tôi tại nơi làm việc), tôi chỉ sử dụng một helper tay lái rất đơn giản để tạo điều kiện cho quá trình này để thực hiện nội địa hóa một cách nhanh chóng:

Handler

Handlebars.registerHelper('I18n', 
    function(str){ 
    return (I18n != undefined ? I18n.t(str) : str); 
    } 
); 

Template

<script id="my_template" type="x-handlebars-template"> 
    <div>{{I18n myVar}}</div> 
</script> 

Ưu điểm chính của việc này là không có đắt trước/sau xử lý trên toàn bộ đối tượng json. Chưa kể nếu json đến có các đối tượng lồng nhau/mảng, thời gian dành cho tìm kiếm và phân tích cú pháp cho chúng có thể tốn kém nếu đối tượng là rất lớn.

Chúc mừng!

+0

Tôi thích giải pháp này hơn so với @Gazler –

+0

Giải pháp tốt. Tôi đã làm điều này một https://gist.github.com/1589125. Nhưng @ poweratom của một trong những có vẻ sạch hơn. –

+1

Tôi nhận được lỗi này: 'LoạiError: I18n.t không phải là một hàm'. Bất kì lời đề nghị nào? – slackmart

4

https://github.com/fnando/i18n-js là đá quý ruby ​​sẽ tạo tệp quốc tế từ thư mục cấu hình/ngôn ngữ của bạn. Tuy nhiên nếu bạn không sử dụng đường ray, bạn có thể tìm thấy javascript được sử dụng trên riêng của mình here.

Sau đó bạn chỉ đơn giản là lưu trữ các bản dịch trong một đối tượng lồng nhau ..

I18n.translations = {"en":{"date":{"formats":{"default":"%Y-%m-%d","short":"%b %d","long":"%B %d, %Y"}}}}; 

Cái gì đó cũng có thể sử dụng cho bạn mà tôi sử dụng cho các dự án của tôi là một bản vá để Ria mép tự động chuyển chuỗi trong định dạng @@ translation_key @@

i18nize = function (result) { 
    if (I18n) { 
     var toBeTranslated = result.match(/@@([^@]*)@@/gm); 
     if (!toBeTranslated) return result; 
     for(var i = 0; i < toBeTranslated.length; i++) { 
     result = result.replace(toBeTranslated[i], I18n.t(toBeTranslated[i].replace(/@/g, ""))); 
     } 
    } 
    return result; 
}; 

bạn sau đó gọi i18nize sau trả cho phép bạn đặt các bản dịch trong các mẫu của bạn thay vì cho chúng đi qua.

Hãy coi chừng ria mép vá vì bạn sẽ không thể chuyển mẫu của mình sang triển khai bộ ria mép chuẩn. Tuy nhiên trong trường hợp của tôi, các lợi ích được cung cấp lớn hơn vấn đề này.

Hy vọng điều này sẽ hữu ích.

+0

Điều đó thực sự tuyệt vời, tôi hoàn toàn bỏ lỡ thực tế là tôi có thể "phân tích lại" mẫu một khi được hiển thị với chức năng của tôi, đó chính là điều tôi sẽ làm, có thể với R.js hoặc một thứ gì đó. Cảm ơn bạn rất nhiều =) – mdcarter

3

Dựa trên câu trả lời @poweratom 's:

Chỉ với ember.js, cùng với các tùy chọn truyền cho I18n.js.

Nó sẽ tải lại một cách kỳ diệu nếu các thuộc tính tính được sử dụng.

Ember.Handlebars.helper "t", (str, options) -> 
    if I18n? then I18n.t(str, options.hash) else str 

mẫu:

{{t 'sharings.index.title' count=length}} 

YML:

en: 
    sharings: 
    index: 
     title: To listen (%{count}) 
1

Với NodeJs/tốc:

  • nginx Proxy cấu hình

    server { 
        listen 80; 
        server_name fr.domain.com; 
        client_max_body_size 20m; 
        proxy_set_header Accept-Language fr 
    
        location/{ 
         proxy_pass http://127.0.0.1:3000; 
         proxy_set_header Host $host; 
         proxy_buffering off; 
        } 
    } 
    
  • node-i18n (phát hiện header Accept-Language)

    app.use(i18n.init); 
    
  • Mẫu tập tin dịch

    { 
    "hello": "hello", 
    "home-page": { 
        "home": "Home", 
        "signup": "Sign Up" 
    } 
    } 
    
  • Trong điều khiển tốc

    ... 
    data.tr = req.__('home-page'); 
    var template = Handlebars.compile(source); 
    var result = template(data); 
    
  • tay lái Template

    <li class="active"><a href="/">{{tr.home}}</a></li> 
    
0

Câu hỏi đặt ra là đã trả lời nhưng họ có thể là một trường hợp bạn không muốn phụ thuộc vào bất kỳ i8n lib và sử dụng hoàn toàn của riêng bạn. Tôi đang sử dụng cảm hứng của riêng mình từ https://gist.github.com/tracend/3261055

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