การทำให้เป็นสากลด้วยไวยากรณ์ที่ง่ายสำหรับ node.js และเบราว์เซอร์
โซลูชันแบบคลาสสิกใช้หลายวลีสำหรับพหูพจน์ Babelfish
ให้นิยามคำพหูพจน์แบบอินไลน์แทน ซึ่งมีขนาดกะทัดรัดและง่ายกว่าสำหรับโปรแกรมเมอร์ นอกจากนี้ วลียังถูกจัดกลุ่มเป็นขอบเขตที่ซ้อนกัน เช่นเดียวกับใน Ruby
BabelFish
รองรับกฎพหูพจน์ทั้งหมดจาก Unicode CLDR (ผ่าน plurals-cldr)
node.js:
$ npm install babelfish
เบราว์เซอร์:
$ bower install babelfish
ใช้ es5-shim สำหรับความเข้ากันได้ของเบราว์เซอร์รุ่นเก่า
#{varname}
สะท้อนค่าของตัวแปร((Singular|Plural1|Plural2)):count
รูปแบบพหูพจน์ตัวอย่าง:
А у меня в кармане #{nails_count} ((гвоздь|гвоздя|гвоздей)):nails_count
คุณยังสามารถละเว้นตัวแปรจุดยึดสำหรับพหูพจน์ได้ โดยค่าเริ่มต้นจะถูก count
ดังนั้นตัวแปรต่อไปนี้จึงเท่ากัน:
I have #{count} ((nail|nails))
I have #{count} ((nail|nails)):count
นอกจากนี้ คุณยังสามารถใช้ตัวแปรในส่วนพหูพจน์ได้:
I have ((#{count} nail|#{count} nails))
ต้องการรูปแบบศูนย์พิเศษหรือเขียนทับค่าเฉพาะใดๆ หรือไม่ ไม่มีปัญหา:
I have ((=0 no nails|#{count} nail|#{count} nails))
หากคุณต้องการ #{
, ((
, |
หรือ ))
ที่ไหนสักแห่งในข้อความซึ่งถือได้ว่าเป็นส่วนมาร์กอัป - เพียงแค่หลีกหนีด้วย
เนื่องจาก BabelFish ปรับขอบเขตให้เรียบขึ้น การเก็บคำแปลในไฟล์ YAML จึงเป็นเรื่องสนุกและดี:
---
ru-RU :
profile : Профиль
forums : Форумы
apps :
forums :
new_topic : Новая тема
last_post :
title : Последнее сообщение
by : от
demo :
apples : " На столе лежит #{count} ((яблоко|яблока|яблок)) "
// 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 ) ;
ดูไฟล์ลิขสิทธิ์ (MIT)