KEMBAR78
I18nize Scala programs à la gettext | PPTX
i18nize Scala programs
à la gettext
Episode 39, Wed, Aug 12, 2015
Ngoc 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 if
Scala =
Java (performance, libs eco) +
Ruby (human oriented) +
Erlang (functional)
● Don’t know Scalaz/Haskell (yet)
↑↑↑
Struggling with
monadic 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 to
key → value
data 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 rule
Special key
Demo
I’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 into
key → value
data 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

I18nize Scala programs à la gettext

  • 1.
    i18nize Scala programs àla gettext Episode 39, Wed, Aug 12, 2015 Ngoc Dao
  • 2.
    About the speaker ●Ngoc Dao ● Joined Atlassian since May
  • 3.
  • 4.
    ● Favorite languages: Ruby,Erlang, Scala ● My Scala style: Using Scala as if Scala = Java (performance, libs eco) + Ruby (human oriented) + Erlang (functional)
  • 5.
    ● Don’t knowScalaz/Haskell (yet) ↑↑↑ Struggling with monadic talks at ScalaSyd
  • 6.
    English is notmy native language ● From Viet Nam ● 15 years in Japan ↑↑↑ i18n is important to me
  • 7.
    Given this program: printf("Myname is %s.", myName)
  • 8.
    Given this program: printf("Myname is %s.", myName) Let’s i18nize it in gettext style! (I won’t go into details of .properties style vs gettext style)
  • 9.
    (1) Mark thestrings we want to translate printf(t("My name is %s."), myName)
  • 10.
    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)
  • 11.
    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)
  • 12.
    When strings inthe program change, how to update (add, remove, modify) language files efficiently?
  • 13.
    When strings inthe 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)
  • 14.
    When strings inthe 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
  • 15.
    When strings inthe 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
  • 16.
    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 to key → value data structure vi.po language file: msgid "My name is %s." msgstr "Tôi tên là %s."
  • 17.
    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
  • 18.
    gettext is quiteadvanced ● Allow specifying context (one string may be translated to different strings, depending on context)
  • 19.
    print(t("Hello")) print(tc("Casual", "Hello")) fr.po languagefile: msgid "Hello" msgstr "Bonjour" msgctxt "Casual" msgid "Hello" msgstr "Salut"
  • 20.
    gettext is quiteadvanced ● Allow specifying singular/plural rules (different languages may have different singular/plural rules)
  • 21.
    print(tn( "I have oneapple", "I have %d apples", numApples )) Singular Plural Depending on this value
  • 22.
    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 rule Special key
  • 23.
  • 24.
  • 25.
    Mark and extracti18n strings
  • 26.
    Mark and extracti18n strings Tool: https://github.com/xitrum-framework/scala-xgettext It’s a Scala compiler plugin, to extract i18n strings at compile time.
  • 27.
    Mark and extracti18n 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
  • 28.
    ● scala-xgettext canalso extracts i18n strings from view templates ● as long as the templates are converted to Scala source code and compiled Mark and extract i18n strings
  • 29.
    ● scala-xgettext canalso 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
  • 30.
  • 31.
    Translate language templatefile Tool: Any text editor
  • 32.
    Translate language templatefile Tool: Any text editor Very convenient GUI editor: https://poedit.net/
  • 33.
    Load language file Tool: https://github.com/xitrum-framework/scaposer It’sa Scala parser to transform .po text file into key → value data structure
  • 34.
    Poedit demo: Updatei18n 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
  • 35.
    Demo source code: https://github.com/xitrum-framework/scala-xgettext-presentation Ifyou use Play framework: https://github.com/georgeOsdDev/play-xgettext