2012-04-22 37 views
5

Được ghi là here mà Babel có thể trích xuất các tin nhắn gettext cho các tệp Python và Javascript.Trích xuất các tin nhắn gettext Javascript bằng cách sử dụng bộ nén Babel CLI

Babel đi kèm với một vài nhổ BUILTIN: python (được chiết xuất tin nhắn từ file nguồn Python), javascript, và bỏ qua (mà chiết xuất không có gì).

Trình giải mã dòng lệnh được ghi thành tài liệu here - nhưng không có ví dụ về cách sử dụng.

Cũng trong số same pointer ở trên, có một số đề cập đến tệp cấu hình được sử dụng khi trích xuất nhưng không được mở rộng nhiều.

Khi tôi chạy lệnh cơ bản cho trình trích xuất trên một thư mục có tệp js, tôi chỉ nhận được tiêu đề .PO được tạo nhưng không có thư.

$ pybabel extract /path/to/js-dir 

# Translations template for PROJECT. 
# Copyright (C) 2012 ORGANIZATION 
# This file is distributed under the same license as the PROJECT project. 
# FIRST AUTHOR <[email protected]>, 2012. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PROJECT VERSION\n" 
"Report-Msgid-Bugs-To: [email protected]\n" 
"POT-Creation-Date: 2012-04-22 19:39+1000\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME <[email protected]>\n" 
"Language-Team: LANGUAGE <[email protected]>\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=utf-8\n" 
"Content-Transfer-Encoding: 8bit\n" 
"Generated-By: Babel 0.9.6\n" 

$ 

Dưới đây là một đoạn mẫu trong tệp js Tôi đang cố gắng để trích xuất các thông điệp cho:

else if(data.status == "1"){ 
    var follow_html = gettext('Follow'); 
    object.attr("class", 'button follow'); 
    object.html(follow_html); 
    var fav = getFavoriteNumber(); 
    fav.removeClass("my-favorite-number"); 
    if(data.count === 0){ 
     data.count = ''; 
     fav.text(''); 
    }else{ 
     var fmts = ngettext('%s follower', '%s followers', data.count); 
     fav.text(interpolate(fmts, [data.count])); 
    } 
} 

tôi sẽ đánh giá cao nếu ai đó có thể cung cấp tùy chọn CLI chính xác và các thiết lập cấu hình để làm cho quá trình chiết làm việc, hoặc một con trỏ đến đó.

+3

các chức năng gettext/ngettext bạn đang sử dụng trong js của mình là gì? Tôi đang ở cùng một giai đoạn bây giờ - Tôi có babel làm việc cho html & python nhưng không js – fastmultiplication

+0

Thực ra đó là một dự án OS (Askbot) - bạn có thể kiểm tra tại đây https://github.com/ASKBOT/askbot-devel –

+0

I đã tìm ra vấn đề của tôi, bằng cách này: http://stackoverflow.com/questions/10647449/serving-i18n-js-using-babel-django-jinja2 – fastmultiplication

Trả lời

6

Tạo một tập tin (babel.cfg) với nội dung sau:

[javascript:*.js] 
encoding = utf-8 

Sau đó, làm:

pybabel extract -F babel.cfg /path/to/js-dir 

Đó nên là đủ để bạn có thể có một số chuỗi tin nhắn.

BTW, bạn có thể tham khảo sự giúp đỡ cho các lệnh extract bằng cách thực hiện:

pybabel extract --help 
+0

Xin lỗi vì đã trả lời muộn. Tôi đang làm chính xác những gì bạn đã vạch ra và nhận được kết quả chính xác như được hiển thị trong câu hỏi của tôi. Bạn đã thử nghiệm lệnh trên các ví dụ khá lớn chưa. –

+1

Tôi đã có cùng một vấn đề. Sau đó, tôi tạo một tệp babel.cfg có chứa: '' ' [javascript: **. Js] extract_messages = _ ' '' ' và bây giờ nó đang hoạt động! –

+0

Và để định nghĩa một từ khóa số nhiều như sau: '-k" ngettext: 1,2 "'. –

3

Tôi đã có một vấn đề tương tự và đã có thể để có được xung quanh nó bằng cách tắt các từ khoá mặc định với babel.

pybabel extract -k __ -F babel.cfg --no-default-keywords /path/to/js-dir 

Bạn phải chỉ định ít nhất một từ khóa trong lệnh khi bạn tắt mặc định (-k [từ khóa]). Tôi đã chọn -k __ vì "__" là mẫu tôi đang tìm kiếm.

Chỉ cần sử dụng lệnh này và thay thế "__" sau -k bằng một từ tệp babel.cfg của bạn.

Chỉnh sửa: điều này cho phép bạn sử dụng các từ khóa của riêng bạn chứ không phải là gettext()

0

Bạn có thể tạo một đối tượng trong như bình toàn cầu và dịch nó với gettext

g.i18n = { 
    'Casa' : lazy_gettext('Home'), 
    'Auto' : lazy_gettext('Car'), 
    'Persona' : lazy_gettext('Person') 
} 

Sau đó thêm nó như là một biến

<script> 
    var i18n = {{ g.i18n | tojson }} 
</script> 

và sử dụng nó trong JS:

var labelTranslate = { 
        Casa: i18n.Casa, 
        Persona: i18n.Persona, 
        Auto: i18n.Auto 
       }; 
0

Bạn thực sự có thể sử dụng trực tiếp gettext trong Javascript.

Xem: jsgettext. Nó cho phép bạn sử dụng các hàm gettext chuẩn *, bao gồm cả hàm sử dụng ngữ cảnh và/hoặc dạng số nhiều.

Nó có thể đọc tệp PO/MO hoặc bạn có thể nhập tệp JSON được tạo tùy chỉnh thay thế.

Xem this file trong số this project để có ví dụ hoàn chỉnh.

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