ruby-gettext
- 2007.05.09
- Ruby/Rails, åå¼·ä¼è³æ
GNU gettextã¨ã¯ã¡ãã»ã¼ã¸ã®å½éåã®ããã®Cã©ã¤ãã©ãªã¨å種ã³ãã³ãã®ã»ããã
Ruby-GetText-Packageã¯ãã®Rubyçãgettextã®rubyãã¤ã³ãã£ã³ã°ã§ã¯ãªããåå®è£ ã
- URL
- http://www.yotabanana.com/hiki/ja/ruby-gettext.html
- ä½è
- Masao Mutoh <mailto:[email protected]>
åºç¤ç¥è
GNU gettextã¨ã¯ã¡ãã»ã¼ã¸ã®å½éåã®ããã®Cã©ã¤ãã©ãªã¨å種ã³ãã³ãã®ã»ããã
Ruby-GetText-Packageã¯ãã®Rubyçãgettextã®rubyãã¤ã³ãã£ã³ã°ã§ã¯ãªããåå®è£ ã
- URL
- http://www.yotabanana.com/hiki/ja/ruby-gettext.html
- ä½è
- Masao Mutoh <mailto:[email protected]>
ã¤ã³ã¹ãã¼ã«ã¯
# gem install gettext
ããã㯠http://rubyforge.org/frs/?group_id=855 ãããã¦ã³ãã¼ãã
ææ°ã¯1.9.0ã ããRails 1.1.6ã®å ´åã¯gettext 1.8.0ã§ãªãã¨ãã¾ãåããªã模æ§ã
使ç¨(çæ)ããããã¡ã¤ã«
- POTãã¡ã¤ã«
- POãã¡ã¤ã«ã®ã²ãªå½¢ã¨ãªããã¡ã¤ã«ã(PO Template)
- POãã¡ã¤ã«
- ãã¼ã¨ç¿»è¨³ã¡ãã»ã¼ã¸ã®ãã¢ãå®ç¾©ãããã¡ã¤ã«ã(Portable Object)
- MOãã¡ã¤ã«
- POãã¡ã¤ã«ããã¤ããªåãããã®ã(Machine Object)
ã½ã¼ã¹ã³ã¼ãä¸ã«æå®ããããã¼ã«å¯¾å¿ãã翻訳ã¡ãã»ã¼ã¸ãMOãã¡ã¤ã«ããæ½åºãã¦ãã¼ãç½®ãæããã¨ããã®ãåºæ¬åä½ã
Railsã¢ããªã±ã¼ã·ã§ã³ã®gettextå¯¾å¿æé
config/environment.rb
$KCODE = 'u' #Rails 1.2æªæºã®å ´å
require 'gettext/rails'
app/controllers/application.rb
class ApplicationController
init_gettext 'myapp'
end
ãã¨ã¯ã翻訳対象ã¨ãªãã¡ãã»ã¼ã¸ã
render :text => _('Not Found.')
ã
<%= _('Welcome!') %>
ã®ããã« _ ã¡ã½ããã§å²ãã
ãã¼ãã«(ã¢ãã«)åãã«ã©ã åãããã©ã«ãã§ç¿»è¨³å¯¾è±¡ã¨ãªãã(夿´å¯)
ã¡ãã»ã¼ã¸ã®ç¿»è¨³
対象æååã®æ½åº
$ rake updatepo
updatepoã¿ã¹ã¯ã¯ä»¥ä¸ã®ããã«å®ç¾©ããã
task :updatepo => :environment do
require 'gettext/utils'
files = Dir['{app,lib}/**/*.{rb,rhtml}']
GetText.update_pofiles(PACKAGE, files, VERSION)
end
POTãã¡ã¤ã«ãçæããããçæã®éãDBæ¥ç¶ãè¡ãã®ã§ãå¿ è¦ãªè¨å®ã»åæåãè¡ã£ã¦ãããã¨ã
po/myapp.potã«ã¯ãããã¤ãã®ãããè¡ã«ã¤ã¥ãã¦ã
# åºç¾ã½ã¼ã¹ä½ç½®
msgid "Welcome!"
msgstr ""
ã®ãããªã翻訳対象ãã¼æååã¨ç©ºæååã®ãã¢ã並ã¶ã
ååã®å¦ç以é
- 追å ãããæååã¯ãæ½åºãããã
- 夿´ãããæååã¯ããã¼ãå·®ãæ¿ããããã
- åé¤ãããæååã¯ãã³ã¡ã³ãã«ãªã£ã¦ãã¡ã¤ã«æ«å°¾ã«ç§»åããã
翻訳
POTãã¡ã¤ã«ããPOãã¡ã¤ã«ãçæããã
$ mkdir -p po/ja
$ msginit -i po/myapp.pot -o po/ja/myapp.po -l ja
åã«POTãã¡ã¤ã«ãã³ãã¼ãã¦ãããããä¸ã®ã³ãã³ã(GNU gettextã«å«ã¾ãã)ã使ãã¨ãä¸é¨ã®ã¡ã¿æ å ±ã«é©åãªåæå¤ãå ¥ãã
msgstrã®ç©ºæ¬ã«ç¿»è¨³ãããã¡ãã»ã¼ã¸ãæ¸ãè¾¼ãã
ã³ã¡ã³ãã« fuzzy ã¨ä»ããããã¨ã³ããªã¼ã¯ä»ã«è¦ãããä¼¼ã¦ããããã«ééã£ã¦ããå¯è½æ§ãããç®æãææãã¦ããã fuzzy ã³ã¡ã³ããã¤ããã¨ã³ããªã¼ãæ®ã£ã¦ããã¨MOãã¡ã¤ã«ã®çæã¯è¡ããªãã é©å®ä¿®æ£ããããåé¡ããªããã° fuzzy ã³ã¡ã³ãèªä½ãåé¤ããã°ããã
MOã«å¤æ
$ rake makemo
makemoã¿ã¹ã¯ã¯ä»¥ä¸ã®ããã«å®ç¾©ããã
task :makemo do
require 'gettext/utils'
GetText.create_mofiles(true, 'po', 'locale')
end
å®éã«ç¿»è¨³ã«å©ç¨ãããã¤ããªãã¼ã¿ã¯ãlocale/ja/LC_MESSAGES/myapp.mo ã¨ãã¦çæãããã
ãã¢
ttyrec/ttyplayã«ãããµã³ãã«ã»ãã·ã§ã³ã(ç´10å)
$ telnet 192.168.1.18 12345
é»å°ã«ç½æ¨å¥¨ã
è¨èªã®é¸æ
åªå 度ã®ä½ãã»ããã
HTTPãããã®Accept-Language
ã¯ããã¼ã«ä¿æããã lang ã¨ããå¤
QUERY_STRINGã® lang ã¨ãããã©ã¡ã¼ã¿ã®å¤
GetText.locale=ã§æå®ããè¨èª
ãã¨ãã°ããã©ã¦ã¶ã
Accept-Language: ja, en
ã¨éã£ã¦ãURLã
...?lang=en
ãªãæ¥æ¬èªãã¼ã¸ã§ã¯ãªãè±èªãã¼ã¸ã«ãªãã
å¯å¤é¨ãå«ãæååã®ç¿»è¨³
"Hello #{h(user.name)}!"
ã翻訳ããå ´åã« #{...} ã使ãã¨ãæ½åºæ(POT使æ)ã«ãè©ä¾¡ããã¦ãã¾ãããã æ£ããæ½åºãããªãã
以ä¸ã®ããã«ããã
- 翻訳対象æååèªèº«ã¯ '' ã使ã£ãåºå®æååã¨ããã
- #{...}ã¯å¤ã«åºãã¦sprintf(ãããã¯String#%)ã«ç½®ãæããã
ããªãã¡
sprintf(_('Hello %s!'), h(user.name))
ã¾ãã¯
_('Hello %s!') % h(user.name)
èªé ã®éãã¸ã®å¯¾å¿
ãã¨ãã°
_('Wrong value "%s" specified in field "%s".') % [h(value), h(field)]
ã¨ããè±èªã®ã¡ãã»ã¼ã¸ã«å¯¾å¿ããæ¥æ¬èªç¿»è¨³ãã¼ã¿ãç´ ç´ã«ä½ãã¨
msgid "Wrong value ?"%s?" specified in ?"%s?"."
msgstr "ãã£ã¼ã«ã?"%s?"ã«èª¤ã£ãå¤?"%s?"ãæå®ããã¾ããã"
ã®ããã«ãªãããèªé ãéãã®ã§ããã§ã¯ä¸ååã
ãã®å ´åã¯printfæ¸å¼ã®æ¡å¼µå½¢å¼ã使ãã
msgstr "ãã£ã¼ã«ã?"%2$s?"ã«èª¤ã£ãå¤?"%1$s?"ãæå®ããã¾ããã"
ã¨æ¸ãã¨ã%2$sã«ã¯ç¬¬2弿°ãã%1$sã«ã¯ç¬¬1弿°ãé©ç¨ãããã
Ruby-GetTextã§ã¯ String#%ã«Arrayã ãã§ãªãHashãä¸ãããã¨ãã§ããããã奿³ã¨ãã¦ã
_('Wrong value "%{value}" specified in field "%{field}".') %
{ :value => h(value), :field => h(field) }
ã¨æ¸ãã¦ããæ¹æ³ãããããã®å ´åã¯èªé ã«å½±é¿ããããã¨ã¯ãªããã¾ããã¬ã¼ã¹ãã«ãã«æå³ã®ããååã使ããã¨ãã§ããã®ã§ã翻訳ããããããªãã
è¤æ°å½¢ã¸ã®å¯¾å¦
æ¥æ¬èªã ãã使ã£ã¦ããã¨æèããå¿ è¦ã¯ãªãããæ°ã«å¾ã£ã¦ã¡ãã»ã¼ã¸ãå¤ããå¿ è¦ã®ããè¨èªãããã ãã®ãããªè¨èªã«å¯¾å¿ãããããæ°ã«ãã£ã¦å¤åããå¯è½æ§ãããã¡ãã»ã¼ã¸ã«ã¯ã_ ã¡ã½ããã®ä»£ããã« n_ ã¡ã½ããã使ãã
<%= n_('%d file was uploaded.', '%d files were uploaded.', count) % count %>
2ååºç¾ããæ°å¤ã®ãã¡ã1ã¤ãã¯n_ ã®å¼æ°ã§ã2ã¤ãã¯å¾ãããã¡ãã»ã¼ã¸æ¸å¼ã«å®éã«åãè¾¼ã¾ããå¤ã
翻訳é¨åã¯
n_(msgid, msgid_plural, n)
ã¨ããå½¢å¼ã
msgidã¯é常ã©ãã翻訳å ãæ¢ãããã®ãã¼ã¨ãªãã
ãã®ç¨®ã®ç¿»è¨³ã§ã¯ãmsgstrã¯è¤æ°(0ããæ°ãã)ãããnã®å¤ã¯POãã¡ã¤ã«ä¸ã®Plural-formsã®å¼ã«æ¸¡ãããããã«ãã£ã¦ã©ã®å½¢å¼ã使ãããæ±ºã¾ãã ãã¼ã«å¯¾å¿ããmsgstrãè¦ã¤ãããªãå ´åã¯ãnã1ãªãmsgidããnã1ã§ãªããªãmsgid_pluralããã®ã¾ã¾ä½¿ãããã
è±èªã®å ´å
"Plural-Forms: nplurals=2; plural=(n != 1);"
msgid '%d file was uploaded.'
msgid_plural '%d file were uploaded.'
msgstr[0] '%d file was uploaded.'
msgstr[1] '%d files were uploaded.'
nã1ã®ã¨ãã®ã¿0çªã使ãããã以å¤ã¯1çªã使ãã
æ¥æ¬èªã®å ´å
"Plural-Forms: nplurals=1; plural=0;"
msgid '%d file was uploaded.'
msgid_plural '%d file were uploaded.'
msgstr[0] '%dåã®ãã¡ã¤ã«ãã¢ãããã¼ãããã¾ããã'
常ã«åãã¡ãã»ã¼ã¸ã使ãã
ãã¾ã
ãã©ã³ã¹èªã®å ´å
"Plural-Forms: nplurals=2; plural=n>1;"
è±èªã¨ã»ã¼åãã ããã¼ãã®ã¨ãã¯åæ°ã¨åã表è¨ã使ãã
ãã·ã¢èªã®å ´å
"Plural-Forms: nplurals=3; ?
plural=(n%10==1 && n%100!=11 ? 0 : ?
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
ä¸ä¸æ¡ã1ã®ã¨ã(ä¸äºæ¡ã11ã®ã¨ããé¤ã)ãä¸ä¸æ¡ã2ã4(ä¸äºæ¡ã12ã14ã®ã¨ããé¤ã)ããã以å¤(ä¸äºæ¡ã11ã14ã®ã¨ããå«ã)ã
- 1,21,31,...
- 2-4,22-24,32-34,...
- 5-20,25-30,35-40,...
ã¹ãããã¢èªã®å ´å
"Plural-Forms: nplurals=4; ?
plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;"
ä¸äºæ¡ã01ã®ã¨ããä¸äºæ¡ã02ã®ã¨ããä¸äºæ¡ã03ã¾ãã¯04ã®ã¨ãããã以å¤ã
- 1,101,201,...
- 2,102,202,...
- 3-4,103-104,203-204,...
- 5-110,105-200,...
å®éã®å½éåã¯ã¡ãã»ã¼ã¸ã翻訳ããã°æ¸ãããã§ã¯ãªãã®ãé£ããã¨ããã
- æ°å¤(å°æ°ç¹ã»æ¡åºåãè¨å·ã»è² æ°ã®æ¸å¼)
- åä½(éé¡ã»æ¸©åº¦ã»è·é¢)
- æ¥ä»(æ¸å¼ã»ç¥æ¥ã»æå·®ã»å¤æéã»æ¦æ³)
- æ£æ¸æ³(ä½¿ç¨æåã»æ¹åã»ç©ºç½ã®æ±ãã»å¥èªç¹ãè¨å·é¡)
- ãã®ä»ã®ç¿æ
£(ååã使ã®å½¢å¼ã»æ´åé )
