View
149
Download
1
Category
Preview:
Citation preview
i18nize Scala programsà la gettext
Episode 39, Wed, Aug 12, 2015Ngoc Dao
About the speaker
● Ngoc Dao● Joined Atlassian since May
● Favorite languages:Ruby, Erlang, Scala
● Favorite languages:Ruby, Erlang, Scala
● My Scala style:Using Scala as ifScala = Java (performance, libs eco) + Ruby (human oriented) + Erlang (functional)
● Don’t know Scalaz/Haskell (yet)
↑↑↑
Struggling withmonadic talks at ScalaSyd
English is not my native language● From Viet Nam● 15 years in Japan
↑↑↑
i18n is important to me
Given this program:printf("My name is %s.", myName)
Given this program:printf("My name is %s.", myName)
Let’s i18nize it in gettext style!
(I won’t go into details of .properties style vs gettext style)
(1) Mark the strings we want to translate
printf(t("My name is %s."), myName)
i18n.pot template file:
msgid "My name is %s."
msgstr ""
(2) Extract to a template file
(1) Mark the strings we want to translate
printf(t("My name is %s."), myName)
i18n.pot template file:
msgid "My name is %s."
msgstr ""
fr.po language file:
msgid "My name is %s."
msgstr "Je m'appelle %s."
(2) Extract to a template file
(3) Give it to translators
(1) Mark the strings we want to translate
printf(t("My name is %s."), myName)
When strings in the program change, how to update (add, remove, modify) language files efficiently?
When strings in the program change, how to update (add, remove, modify) language files efficiently?● Automatically copy similar existing
translation to make new translation (marked as “fuzzy” to be modified by a human later)
When strings in the program change, how to update (add, remove, modify) language files efficiently?● Automatically copy similar existing
translation to make new translation (marked as “fuzzy” to be modified by a human later)
● Don’t delete, just comment out dated translations for future references
When strings in the program change, how to update (add, remove, modify) language files efficiently?● Automatically copy similar existing
translation to make new translation (marked as “fuzzy” to be modified by a human later)
● Don’t delete, just comment out dated translations for future references
● In translation files, sort by msgid so that it’s easier to diff versions
fr.po language file:
msgid "My name is %s."
msgstr "Je m'appelle %s."
ja.po language file:
msgid "My name is %s."
msgstr "%sと申します。 "
(4) Load language files to program,basically parse the files tokey → valuedata structure
vi.po language file:
msgid "My name is %s."
msgstr "Tôi tên là %s."
printf(t("My name is %s."), myName)
printf("Je m’appelle %s.", myName)
(5) At run time, the marker acts as a function to replace the given key with its value
gettext is quite advanced
● Allow specifying context(one string may be translated to different strings, depending on context)
print(t("Hello"))print(tc("Casual", "Hello"))
fr.po language file:
msgid "Hello"msgstr "Bonjour"
msgctxt "Casual"msgid "Hello"
msgstr "Salut"
gettext is quite advanced
● Allow specifying singular/plural rules(different languages may have different singular/plural rules)
print(tn( "I have one apple", "I have %d apples", numApples))
Singular
Plural
Depending on this value
fr.po language file:
msgid ""msgstr "Plural-Forms: nplurals=2; plural=n>1;"
msgid "I have one apple"msgid_plural "I have %d apples"msgstr[0] "J'ai une pomme"msgstr[1] "J'ai %d pommes"
Singular/plural ruleSpecial key
DemoI’ll introduce some tools
Hello.scala
println("Hello world")
Mark and extract i18n strings
Mark and extract i18n strings
Tool:https://github.com/xitrum-framework/scala-xgettext
It’s a Scala compiler plugin, to extract i18n strings at compile time.
Mark and extract i18n strings
Tool:https://github.com/xitrum-framework/scala-xgettext
It’s a Scala compiler plugin, to extract i18n strings at compile time.
↑↑↑Neat! Just compile Scala source code and get the strings.
Scala is powerful
● scala-xgettext can also extracts i18n strings from view templates
● as long as the templates are converted to Scala source code and compiled
Mark and extract i18n strings
● scala-xgettext can also extracts i18n strings from view templates
● as long as the templates are converted to Scala source code and compiled
↑↑↑It works for all popular Scala template engines like Scalate, Scalatags, Twirl (Play framework template engine)
Mark and extract i18n strings
Translate language template file
Translate language template file
Tool:Any text editor
Translate language template file
Tool:Any text editor
Very convenient GUI editor:
https://poedit.net/
Load language file
Tool:https://github.com/xitrum-framework/scaposer
It’s a Scala parser to transform .po text file intokey → valuedata structure
Poedit demo: Update i18n strings
● Add, modify, remove i18n strings in program● Regenerate i18n.pot file● Use Poedit to update existing .po files with
the new i18n.pot file● Poedit can give translation hints for similar
strings
Demo source code:https://github.com/xitrum-framework/scala-xgettext-presentation
If you use Play framework:https://github.com/georgeOsdDev/play-xgettext
Recommended