BabelFish – i18n thân thiện với con người cho JS
Quốc tế hóa với cú pháp dễ dàng cho node.js và trình duyệt.
Các giải pháp cổ điển sử dụng nhiều cụm từ cho số nhiều. Babelfish
xác định số nhiều ngay tại chỗ thay vì – điều đó còn gọn gàng hơn và dễ dàng cho các lập trình viên. Hơn nữa, các cụm từ được nhóm lại thành các phạm vi lồng nhau, giống như trong Ruby.
BabelFish
hỗ trợ tất cả các quy tắc số nhiều từ unicode CLDR (thông qua plurals-cldr).
Cài đặt
node.js:
$ npm install babelfish
trình duyệt:
$ bower install babelfish
Sử dụng es5-shim cho tính tương thích với các trình duyệt cũ.
Cú pháp Cụm từ
#{varname}
Hiển thị giá trị của biến((Singular|Plural1|Plural2)):count
Hình thức số nhiều
Ví dụ:
А у меня в кармане #{nails_count} ((гвоздь|гвоздя|gvozdey)):nails_count
Bạn cũng có thể bỏ qua biến mục tiêu cho số nhiều, mặc định sẽ là count
. Do đó, các biến thể sau là bằng nhau:
Tôi có #{count} ((móng tay|móng tay))
Tôi có #{count} ((móng tay|móng tay)):count
Bạn cũng có thể sử dụng biến trong các phần số nhiều:
Tôi có ((#{count} móng tay|#{count} móng tay))
Cần biểu thức số không đặc biệt hoặc ghi đè lên bất kỳ giá trị cụ thể nào? Không có vấn đề gì:
Tôi có ((=0 không móng tay|#{count} móng tay|#{count} móng tay))
Ký tự thoát
Nếu bạn cần #{
, ((
, |
hoặc ))
ở bất kỳ đâu trong văn bản, nơi nó có thể được coi là phần đánh dấu – chỉ cần thoát chúng bằng \
.
Ví dụ với YAML
Khi BabelFish làm phẳng phạm vi, việc lưu trữ các bản dịch trong tệp YAML thực sự thú vị và dễ thương:
---
ru-RU:
profile: Профиль
forums: Форумы
apps:
forums:
new_topic: Новая тема
last_post:
title : Последнее сообщение
by : от
demo:
apples: "На столе лежит #{count} ((яблоко|яблока|яблок))"
Sử dụng
// Create new instance of BabelFish with default language/locale: 'en-GB'
var BabelFish = require('babelfish');
var i18n = new BabelFish('en-GB');
// Fill in some phrases
i18n.addPhrase('en-GB', 'demo.hello', 'Hello, #{user.name}.');
i18n.addPhrase('en-GB', 'demo.conv.wazup', 'Whats up?');
i18n.addPhrase('en-GB', 'demo.conv.alright', 'Alright, man!');
i18n.addPhrase('en-GB', 'demo.coerce', 'Total: #{count}.');
i18n.addPhrase('ru-RU', 'demo.hello', 'Привет, #{user.name}.');
i18n.addPhrase('ru-RU', 'demo.conv.wazup', 'Как дела?');
i18n.addPhrase('uk-UA', 'demo.hello', 'Здоровенькі були, #{user.name}.');
// Set locale fallback to use the most appropriate translation when possible
i18n.setFallback('uk-UA', 'ru-RU');
// Translate
var params = {user: {name: 'ixti'}};
i18n.t('ru-RU', 'demo.hello', params); // -> 'Привет, ixti.'
i18n.t('ru-RU', 'demo.conv.wazup'); // -> 'Как дела?'
i18n.t('ru-RU', 'demo.conv.alright'); // -> 'Alright, man!'
i18n.t('uk-UA', 'demo.hello', params); // -> 'Здоровенькі були, ixti.'
i18n.t('uk-UA', 'demo.conv.wazup'); // -> 'Как дела?'
i18n.t('uk-UA', 'demo.conv.alright'); // -> 'Alright, man!'
// When params is number or strings, it will be coerced to
// `{ count: XXX, value: XXX }` - use any of those in phrase.
i18n.t('en-GB', 'demo.coerce', 5); // -> 'Total: 5.'
// You may wish to "dump" translations to load in browser later
// Dump will include all fallback translations and fallback rules
var locale_dump = i18n.stringify('ru-RU');
var i18n_new = require('babelfish')('en-GB'); // init without `new` also works
i18n_new.load(locale_dump);
// Use objects instead of strings (object/array/number/boolean) - can be
// useful to prepare bulk data for external libraries.
// Note, only JSON-supported types are ok (no date & regex)
i18n.addPhrase('en-GB', 'demo.boolean', true);
i18n.addPhrase('en-GB', 'demo.number', 123);
i18n.addPhrase('en-GB', 'demo.array', [1, 2, 3]);
// fourth param required for hashes (objects) to disable flattening,
// other types are autodetected
i18n.addPhrase('en-GB', 'demo.array', { foo:1, bar:"2" }, false);
Cài đặt trong các ngôn ngữ khác
- Perl – Locale::Babelfish
- Ruby – https://github.com/regru/babelfish-ruby
Chi tiết Tải về:
Tác giả: nodeca
Mã nguồn: https://github.com/nodeca/babelfish
Giấy phép: MIT license