SlideShare a Scribd company logo
1 of 158
Modern javascript
localization with good old
gettext
https://c-3po.js.org/
Mostovenko Alexander
Company: EVO company
Twitter: @MostovenkoA
Github: github.com/AlexMost
Me
About this talk
About this talk
Localization process in general and more
about gettext format.
About this talk
Localization process in general and more
about gettext format.
What is c-3po and how it helped us to
improve existing process?
About this talk
Localization process in general and more
about gettext format.
What is c-3po and how it helped us to
improve existing process?
Continuous translations.
Our initial tasks
Our initial tasks
1. Localize frontend on several projects:
(cabinet, company sites)
Bigl.ua
others...
Our initial tasks
1. Localize frontend on several projects:
(cabinet, company sites)
Bigl.ua
others ...
1. Setup translation process when devs and translators
can work independently.
Gettext (.po)
ICU
...
Localization
formats
ICU - International Components for Unicode
http://userguide.icu-project.org/
ICU - International Components for Unicode
http://userguide.icu-project.org/
ICU features >>> gettext features
ICU is cool, but ...
ICU is cool, but ...
1. Poor tooling (editors for translators e.t.c).
ICU is cool, but ...
1. Poor tooling (editors for translators e.t.c).
2. Our backend already used gettext.
ICU - cool but ...
"{gender_of_host, select, "
"female {"
"{num_guests, plural, offset:1 "
"=0 {{host} does not give a party.}"
"=1 {{host} invites {guest} to her party.}"
"=2 {{host} invites {guest} and one other person to her party.}"
"other {{host} invites {guest} and # other people to her party.}}}"
"male {"
"{num_guests, plural, offset:1 "
"=0 {{host} does not give a party.}"
"=1 {{host} invites {guest} to his party.}"
"=2 {{host} invites {guest} and one other person to his party.}"
"other {{host} invites {guest} and # other people to his party.}}}"
"other {"
"{num_guests, plural, offset:1 "
"=0 {{host} does not give a party.}"
"=1 {{host} invites {guest} to their party.}"
"=2 {{host} invites {guest} and one other person to their party.}"
"other {{host} invites {guest} and # other people to their party.}}}}"
GNU gettext
https://www.gnu.org/software/gettext/
GNU gettext
https://www.gnu.org/software/gettext/
1. Simple format.
GNU gettext
https://www.gnu.org/software/gettext/
1. Simple format.
2. Has good ecosystem for translation process.
gettext idea
‘Hello world’
Source code
gettext idea
gettext(‘Hello world’)
Source code
gettext idea
gettext(‘Hello world’)
Source code
‘Hello world’
.pot file
gettext idea
gettext(‘Hello world’)
Source code
msgid: ‘Hello world’
msgstr: ‘’
.po file
‘Hello world’
.pot file
gettext idea
gettext(‘Hello world’)
Source code
msgid: ‘Hello world’
msgstr: ‘Здоровеньки були’
.po file
‘Hello world’
.pot file
gettext idea
gettext(‘Hello world’)
Source code
msgid: ‘Hello world’
msgstr: ‘Здоровеньки були’
.po file
‘Hello world’
.pot file
gettext idea
gettext workflow
Code .pot Extracting translation strings from code (AST
traverse)extract
gettext workflow
Code .pot Extracting translation strings from code (AST
traverse)
.pot .po Merge new extracted translations from .pot file
with existing. msgmerge
extract
merge .po.po
gettext workflow
Code .pot Extracting translation strings from code (AST
traverse)
.pot .po Merge new extracted translations from .pot file
with existing. msgmerge
extract
merge
Translator adds translations
translation
.po.po
.po.po.po
.po.po.po
gettext workflow
Code .pot Extracting translation strings from code (AST
traverse)
.pot .po Merge new extracted translations from .pot file
with existing. msgmerge
extract
merge
Translator adds translations
translation
.po.po
.po.po.po
.po.po.po
resolve Code
Placing translations back to the code (by locale).po.po.po
.po file structure
Example .po file
msgid ""
msgstr ""
"Project-Id-Version: c 3po-webpack-startn"
"PO-Revision-Date: 2017-02-01 22:22+0200n"
"Language-Team: Ukrainiann"
"Language: ukn"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=2; plural=(n!=1);n"
#: app.js:6
msgid "Choose locale"
msgstr "Оберіть локаль"
#: app.js:10
msgid "${ 0 } second"
msgid_plural "${ 0 } seconds"
msgstr[0] "${ 0 } секунда"
msgstr[1] "${ 0 } секунди"
msgstr[2] "${ 0 } секунд"
#: app.js:14
msgid "webpack with c-3po localization demo"
msgstr "Демо локалізації з c-3po та webpack"
msgid ""
msgstr ""
"Project-Id-Version: c 3po-webpack-startn"
"PO-Revision-Date: 2017-02-01 22:22+0200n"
"Language-Team: Ukrainiann"
"Language: ukn"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=2; plural=(n!=1);n"
#: app.js:6
msgid "Choose locale"
msgstr "Оберіть локаль"
#: app.js:10
msgid "${ 0 } second"
msgid_plural "${ 0 } seconds"
msgstr[0] "${ 0 } секунда"
msgstr[1] "${ 0 } секунди"
msgstr[2] "${ 0 } секунд"
#: app.js:14
msgid "webpack with c-3po localization demo"
msgstr "Демо локалізації з c-3po та webpack"
Headers
msgid ""
msgstr ""
"Project-Id-Version: c 3po-webpack-startn"
"PO-Revision-Date: 2017-02-01 22:22+0200n"
"Language-Team: Ukrainiann"
"Language: ukn"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=2; plural=(n!=1);n"
#: app.js:6
msgid "Choose locale"
msgstr "Оберіть локаль"
#: app.js:10
msgid "${ 0 } second"
msgid_plural "${ 0 } seconds"
msgstr[0] "${ 0 } секунда"
msgstr[1] "${ 0 } секунди"
msgstr[2] "${ 0 } секунд"
#: app.js:14
msgid "webpack with c-3po localization demo"
msgstr "Демо локалізації з c-3po та webpack"
Translations
"Plural-Forms:
nplurals=2;
plural=(n!=1);n"
Plural-forms header
"Plural-Forms:
nplurals=2;
plural=(n!=1);n"
Plural-forms header
Plurals count
"Plural-Forms:
nplurals=2;
plural=(n!=1);n"
Plural-forms header
Plurals formula
#: app.js:6
msgid "Choose locale"
msgstr "Оберіть локаль"
1 to 1 translations
#: app.js:10
msgid "${ n } second"
msgid_plural "${ n } seconds"
msgstr[0] "${ n } секунда"
msgstr[1] "${ n } секунди"
msgstr[2] "${ n } секунд"
Plural forms example
#. Notes for the translator
#: app.js:6
#, flag
msgid "Choose locale"
msgstr "Оберіть локаль"
Comments
msgctx "email"
msgid "Hello"
msgstr "Привіт"
msgctx "main page"
msgid "Hello"
msgstr "Вітаємо"
Context example
c-3po
https://c-3po.js.org/
c-3po
Code .pot Extracting translation strings from code (AST
traverse)extract
resolve Code
Placing translations back to the code (by locale).po.po.po
Library:
https://github.com/c-3po-org/c-3po
Core functionality.
Translation functions (tags):
t, ngettext, gettext, jt
Babel-plugin:
https://github.com/c-3po-org/babel-plugin-c-3po
Extract, Resolve, Validation
Key ideas
Key idea 1.
Tagged template strings for formatting
c-3po translations are based on tagged template
strings
import { t } from 'c-3po'
const name = 'Mike';
console.log(t`Hello ${name}`);
What is a template string?
What is template string?
console.log('Hello ' + name)
console.log(`Hello ${name}`)
What is a tagged template string?
const name = ‘Mike’
t`Hello ${name}`
function t(strs, ...exprs) {
// strs -> [‘Hello’, ‘’]
// exprs -> [‘Mike’]
}
Valid javascript
t `Hello ${name}`
t(5)`Hello ${name}`
t(5) `Hello ${name}`
Why just not simple functions but tags?
Why just not simple functions but tags?
c-3po must work without transpilation
Why just not simple functions but tags?
// Without babel transpile !!!
const name = ‘Mike’
t(`Hello ${name}`)
function t(str) {
// strs -> ‘Hello Mike’
// no chance to get ‘Hello ${name}’ msgid here :(
}
Existing solutions
Force you to use sprintf formatting
(i18next, jed e.t.c)
sprintf
gettext("Hello %s", user)
gettext("%2$s %3$s a %1$s", "cracker", "Polly", "wants")
gettext("Current timestamp: %d", Date.now)
sprintf
● Alien formatting for js
sprintf
● Alien formatting for js
● No reason to use es6 template strings
sprintf
● Alien formatting for js
● No reason to use es6 template literals
● Extra CPU work on the client (sprintf parsing)
Key idea 2.
Precompile translation on a build step
Traditional translations resolve flow
Traditional translations resolve flow
Load assets to the client
(browser)
Traditional translations resolve flow
Load assets to the client
(browser)
Resolve locale (from
cookie, params e.t.c)
Traditional translations resolve flow
Load assets to the client
(browser)
Resolve locale (from
cookie, params e.t.c)
Fetch locale data
Traditional translations resolve flow
Load assets to the client
(browser)
Resolve locale (from
cookie, params e.t.c)
Fetch locale data
Apply translations
Wanted translations resolve flow
Wanted translations resolve flow
Load assets to the client
(browser)
Wanted translations resolve flow
Load assets to the client
(browser)
That’s it, they are already
localized !!!
Benefits of precompiled translations:
Benefits of precompiled translations:
● Smaller bundle size
Benefits of precompiled translations:
● Smaller bundle size
● Less work on the client
Benefits of precompiled translations:
● Smaller bundle size
● Less work on the client
● No wait until translations are loaded and applied
Key idea 3.
Works with and without babel
Demo on jsfiddle
Key idea 4.
Can extract and resolve translations from
everything that works with babel (jsx)
Extract and resolve translations with simple
config
Extract:
{ "extract": { "output": "extract.pot" } }
Resolve:
{ "resolve": { "translations": "uk.po" } }
https://c-3po.js.org/quick-start.html
Key idea 5.
Efficient dev and prod setup
Requirements for the dev setup
Requirements for the dev setup
● Faster builds
Requirements for the dev setup
● Faster builds
● Simple integration
Dev setup with c-3po
Dev setup with c-3po
● Use whole c-3po lib (import c-3po).
Dev setup with c-3po
● Use whole c-3po lib (import c-3po).
● Babel plugin only for extraction translations
Requirements for the prod setup
Requirements for the prod setup
● Smaller result assets
Requirements for the prod setup
● Smaller result assets
● Faster locale load
Prod setup with c-3po
Prod setup with c-3po
● Use c-3po mock lib (alias in webpack e.t.c).
Prod setup with c-3po
● Use c-3po mock lib (alias in webpack e.t.c).
● Babel plugin for transformations.
Prod setup with c-3po
● Use c-3po mock lib (alias in webpack e.t.c).
● Babel plugin for transformations.
● Separate build for each locale.
Key idea 6.
Validate translation strings
Validation problem
msgid "http://some.random.domain.link"
msgstr ?
msgid ""
msgstr ?
msgid "translate ${ test ? result1() : result2() }"
msgstr ?
msgid "5"
msgstr ?
c-3po validation (empty str)
t``
Module build failed: SyntaxError: Can not translate empty string
5 |
6 |
> 7 | t``
| ^
c-3po validation (only numbers)
t`3243243`
ERROR in Error: Module build failed: SyntaxError: Can not translate '3243243'
2 |
3 |
> 4 | t`3243243`
| ^
c-3po validation (programs inside translations)
t`Translate ${someVar ? callFn1() : callFn2()}`
ERROR in Error: Module build failed: SyntaxError: You can not use
ConditionalExpression '${someVar ? callFn1() : callFn2()}' in localized strings
2 |
3 |
> 4 | t`Translate ${someVar ? callFn1() : callFn2()}`;
| ^
5 |
c-3po validation (only var wrap)
t`${someVar}`
ERROR in Error: Module build failed: SyntaxError: Can not translate '${ someVar }'
2 |
3 |
> 4 | t`${someVar}`;
| ^
msgid:’${someVar}’
Validate not translated strings
Validation (no translated str)
t`non translated str`
ERROR in Error: Module build failed: SyntaxError: No "non translated str" in "uk.po"
file
2 |
> 3 | t`non translated str`;
https://c-3po.js.org/configuration.html#configresolveunresolved-string-one-of-fail-warn-skip
Key idea 7.
Can use any default locale in sources
(standard gettext uses only English locale)
The problem
Standard ngettext accepts only 2 plural forms
char * ngettext(const char * msgid1, const char * msgid2, unsigned long int n);
Ukrainian/Russian strings in sources
How to be with plurals?
Ukrainian/Russian strings in sources
How to be with plurals? Standard ngettext accepts only 2
plural forms?
Ukrainian/Russian strings in sources
How to be with plurals? Standard ngettext accepts only 2
plural forms? What if we have more or less than 2 plural
forms?
Ukrainian/Russian strings in sources
How to be with plurals? Standard ngettext accepts only 2
plural forms? What if we have more or less than 2 plural
forms?
ngettext for other locales ( plural forms > 2 )
ngettext for other locales ( plural forms > 2 )
Doc - https://c-3po.js.org/ngettext.html
Change defaultHeaders setting to:
'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);'
ngettext for other locales ( plural forms > 2 )
Demo on jsfiddle
Doc - https://c-3po.js.org/ngettext.html
Change defaultHeaders setting to:
'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);'
ngettext(msgid`${n} банан`, `${n} банана`, `${n} бананів`, n)
c-3po tags and functions
t - tag gettext
Demo on jsfiddle
Doc - https://c-3po.js.org/tag-gettext--t-.html
t - tag gettext
t`Hello ${name}` < Usage
Demo on jsfiddle
Doc - https://c-3po.js.org/tag-gettext--t-.html
t - tag gettext
t`Hello ${name}`
msgid "Hello ${ name }"
msgstr "Привіт ${ name }"
< Usage
< Extract
Demo on jsfiddle
Doc - https://c-3po.js.org/tag-gettext--t-.html
t - tag gettext
t`Hello ${name}`
msgid "Hello ${ name }"
msgstr "Привіт ${ name }"
< Usage
< Extract
`Привіт ${name}` < Resolve
Demo on jsfiddle
Doc - https://c-3po.js.org/tag-gettext--t-.html
ngettext - plural forms
ngettext - plural forms
ngettext(msgid`${n} time clicked`, `${n} times clicked`, n) < Usage
ngettext - plural forms
ngettext(msgid`${n} time clicked`, `${n} times clicked`, n)
msgid "${ n } time clicked"
msgid_plural "${ n } times clicked"
msgstr[0] "${ n } time clicked [translated]"
msgstr[1] "${ n } times clicked [translated]"
< Usage
< Extract
Forgot msgid ?
ERROR in Error: Module build failed: SyntaxError: First argument must be tagged
template expression. You should use 'msgid' tag
2 |
3 |
> 4 | ngettext(`${hours} hour`, `${hours} hours`, hours);
| ^
5 |
Demo on jsfiddle
Doc - https://c-3po.js.org/ngettext.html
ngettext - resolve
function _tag_ngettext(n, args) {
return args[+(n != 1)];
}
_tag_ngettext(n,
[n + " time clicked [translated]", n + " times clicked [translated]"]));
Demo on jsfiddle
Doc - https://c-3po.js.org/ngettext.html
First contribution !!! jt (jsx-gettext)
First contribution !!! jt (jsx-gettext)
jt - jsx gettext
jt - jsx gettext
const btn = <button key="btn">{ t`me` }</button>;
<span>{jt`Click ${ btn }`}</span>
< Usage
jt - jsx gettext
const btn = <button key="btn">{ t`me` }</button>;
<span>{jt`Click ${ btn }`}</span>
< Usage
< Extractmsgid "Click ${ btn }"
msgstr "Click ${ btn } [translated]"
jt - jsx gettext
const btn = <button key="btn">{ t`me` }</button>;
<span>{jt`Click ${ btn }`}</span>
< Usage
< Extractmsgid "Click ${ btn }"
msgstr "Click ${ btn } [translated]"
['Click ', btn, ' [translated]']
< Resolve
gettext
gettext
gettext('simple gettext'); < Usage
gettext
gettext('simple gettext'); < Usage
< Extract
msgid "simple gettext"
msgstr "simple gettext [translated]"
gettext
gettext('simple gettext'); < Usage
< Extract
msgid "simple gettext"
msgstr "simple gettext [translated]"
'simple gettext [translated]' < Resolve
Why add gettext func if we have ‘t’ tag?
Legacy - *.coffee *.eco (100 K+ LOC)
1. Wrap string in gettext inside *.coffee *.eco
2. Add babel loader after coffee loader to the
webpack pipeline
3. Profit !!!
Even more features
Aliasing
https://c-3po.js.org/aliasing.html
Babel plugin will extract aliased translation
import { t as i18n } from 'c-3po'
i18n`this translation will work`
Multiline
https://c-3po.js.org/multiline-strings.html
import { t } from 'c-3po';
function test(name) {
return t`multi line string
with multiple line breaks and
with formatting ${name}`
}
Multiline (auto dedent)
Translator comments
Translator comments
// translator: some description for the extracted string.
t`some string`
Translator comments
// translator: some description for the extracted string.
t`some string`
#. some description for the extracted string
msgid "some string"
msgstr ""
Summary
Summary
● Native js tagged template strings for formatting
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
● Works with and without babel
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
● Works with and without babel
● Extracts and resolves translations from everything
that works with babel (jsx)
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
● Works with and without babel
● Extracts and resolves translations from everything
that works with babel (jsx)
● Efficient dev and prod setup
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
● Works with and without babel
● Extracts and resolves translations from everything
that works with babel (jsx)
● Efficient dev and prod setup
● Validation for translated strings
Summary
● Native js tagged template strings for formatting
● Can precompile translation on a build step
● Works with and without babel
● Extracts and resolves translations from everything
that works with babel (jsx)
● Efficient dev and prod setup
● Validation for translated strings
● Can use any default locale in sources (not only
English)
Continuous translations process
Devs
VCS
repo
Continuous translation process
Translator
Devs
VCS
repo
Continuous translation process
push
Translator
Devs
VCS
repo
Continuous translation process
push notify
Translator
Devs
VCS
repo
Continuous translation process
push
translate
notify
Translator
Devs
VCS
repo
Continuous translation process
push
translate
notify
update Translator
Tools for translators
Poeditor - https://poeditor.com/
Transifex - https://www.transifex.com/
Weblate - https://weblate.org
Devs
VCS
repo
Continuous translation process
push
push
pull
update
Translator
notify
translate
Weblate example
Weblate example
Weblate - https://docs.weblate.org/en/latest/
Links
● c-3po doc - https://c-3po.js.org/
● c-3po quick start - https://c-3po.js.org/quick-start.html
● gettext - https://www.gnu.org/software/gettext/
● ICU - http://userguide.icu-project.org/
● Weblate - https://weblate.org
Thx :)

More Related Content

What's hot

Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Takayuki Shimizukawa
 
Apache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemApache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemKostas Saidis
 
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...Redis Labs
 
Everybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with ErlangEverybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with ErlangRusty Klophaus
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf Conference
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking systemJesse Vincent
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構Bo-Yi Wu
 
Redis as Job Cache in an Auto-Scaling Video Rendering Pipeline
Redis as Job Cache in an Auto-Scaling Video Rendering PipelineRedis as Job Cache in an Auto-Scaling Video Rendering Pipeline
Redis as Job Cache in an Auto-Scaling Video Rendering PipelinePeter Karp
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf Conference
 
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊Po-Jen Lai
 
Modern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic  Perl ProgrammerModern Perl for the Unfrozen Paleolithic  Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl ProgrammerJohn Anderson
 
Http2.0 Guide 2013-08-14 #http2study
Http2.0 Guide 2013-08-14 #http2studyHttp2.0 Guide 2013-08-14 #http2study
Http2.0 Guide 2013-08-14 #http2studyJxck Jxck
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceJesse Vincent
 
PHP to Python with No Regrets
PHP to Python with No RegretsPHP to Python with No Regrets
PHP to Python with No RegretsAlex Ezell
 
Working with core dump
Working with core dumpWorking with core dump
Working with core dumpThierry Gayet
 
Voxxed Banff 2018 : Containers & Integration tests
Voxxed Banff 2018 : Containers & Integration testsVoxxed Banff 2018 : Containers & Integration tests
Voxxed Banff 2018 : Containers & Integration testsIxchel Ruiz
 
Happy porting x86 application to android
Happy porting x86 application to androidHappy porting x86 application to android
Happy porting x86 application to androidOwen Hsu
 

What's hot (20)

Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015
 
Apache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemApache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystem
 
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...
Redis As Job Cache In An Auto-Scaling Distributed Video Rendering Pipeline: P...
 
Everybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with ErlangEverybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with Erlang
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
Gpars 5-minutes
Gpars 5-minutesGpars 5-minutes
Gpars 5-minutes
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking system
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
 
Redis as Job Cache in an Auto-Scaling Video Rendering Pipeline
Redis as Job Cache in an Auto-Scaling Video Rendering PipelineRedis as Job Cache in an Auto-Scaling Video Rendering Pipeline
Redis as Job Cache in an Auto-Scaling Video Rendering Pipeline
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
 
Modern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic  Perl ProgrammerModern Perl for the Unfrozen Paleolithic  Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl Programmer
 
Everything as a code
Everything as a codeEverything as a code
Everything as a code
 
CL-NLP
CL-NLPCL-NLP
CL-NLP
 
Http2.0 Guide 2013-08-14 #http2study
Http2.0 Guide 2013-08-14 #http2studyHttp2.0 Guide 2013-08-14 #http2study
Http2.0 Guide 2013-08-14 #http2study
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
 
PHP to Python with No Regrets
PHP to Python with No RegretsPHP to Python with No Regrets
PHP to Python with No Regrets
 
Working with core dump
Working with core dumpWorking with core dump
Working with core dump
 
Voxxed Banff 2018 : Containers & Integration tests
Voxxed Banff 2018 : Containers & Integration testsVoxxed Banff 2018 : Containers & Integration tests
Voxxed Banff 2018 : Containers & Integration tests
 
Happy porting x86 application to android
Happy porting x86 application to androidHappy porting x86 application to android
Happy porting x86 application to android
 

Viewers also liked

rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simplerAlexander Mostovenko
 
Deploying NPM packages with the Nix package manager
Deploying NPM packages with the Nix package managerDeploying NPM packages with the Nix package manager
Deploying NPM packages with the Nix package managerSander van der Burg
 
Looking into the Future of Wealth Management - A Sawtooth Solutions White Paper
Looking into the Future of Wealth Management - A Sawtooth Solutions White PaperLooking into the Future of Wealth Management - A Sawtooth Solutions White Paper
Looking into the Future of Wealth Management - A Sawtooth Solutions White PaperRich Conley
 
E book introducing_microsoft_social_engagement_source
E book  introducing_microsoft_social_engagement_sourceE book  introducing_microsoft_social_engagement_source
E book introducing_microsoft_social_engagement_sourceImix Colombia
 
Technology Vision 2017 - Tendencia 4
Technology Vision 2017 - Tendencia 4Technology Vision 2017 - Tendencia 4
Technology Vision 2017 - Tendencia 4AccentureChile
 
Diversity and Recruitment for the City of Boulder
Diversity and Recruitment for the City of BoulderDiversity and Recruitment for the City of Boulder
Diversity and Recruitment for the City of BoulderAlan Murdock
 
Grafike - Graphics and digital print
Grafike - Graphics and digital print Grafike - Graphics and digital print
Grafike - Graphics and digital print Branko Jovanović
 
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDS
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDSSECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDS
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDSGyan Prakash
 

Viewers also liked (19)

Elm kyivfprog 2015
Elm kyivfprog 2015Elm kyivfprog 2015
Elm kyivfprog 2015
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simpler
 
Deploying NPM packages with the Nix package manager
Deploying NPM packages with the Nix package managerDeploying NPM packages with the Nix package manager
Deploying NPM packages with the Nix package manager
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
 
UX metrics
UX metricsUX metrics
UX metrics
 
структура It компании
структура It компанииструктура It компании
структура It компании
 
Agile UX & OOUX
Agile UX & OOUXAgile UX & OOUX
Agile UX & OOUX
 
Looking into the Future of Wealth Management - A Sawtooth Solutions White Paper
Looking into the Future of Wealth Management - A Sawtooth Solutions White PaperLooking into the Future of Wealth Management - A Sawtooth Solutions White Paper
Looking into the Future of Wealth Management - A Sawtooth Solutions White Paper
 
E book introducing_microsoft_social_engagement_source
E book  introducing_microsoft_social_engagement_sourceE book  introducing_microsoft_social_engagement_source
E book introducing_microsoft_social_engagement_source
 
Juhlat spring
Juhlat  springJuhlat  spring
Juhlat spring
 
Technology Vision 2017 - Tendencia 4
Technology Vision 2017 - Tendencia 4Technology Vision 2017 - Tendencia 4
Technology Vision 2017 - Tendencia 4
 
Plan palomino de pelicula
Plan palomino de peliculaPlan palomino de pelicula
Plan palomino de pelicula
 
UI testing in Xcode 7
UI testing in Xcode 7UI testing in Xcode 7
UI testing in Xcode 7
 
II World War
II World WarII World War
II World War
 
Phenq coupon
Phenq couponPhenq coupon
Phenq coupon
 
Diversity and Recruitment for the City of Boulder
Diversity and Recruitment for the City of BoulderDiversity and Recruitment for the City of Boulder
Diversity and Recruitment for the City of Boulder
 
Grafike - Graphics and digital print
Grafike - Graphics and digital print Grafike - Graphics and digital print
Grafike - Graphics and digital print
 
Impact Investing Nieuws 1 April 2017
Impact Investing Nieuws 1 April 2017Impact Investing Nieuws 1 April 2017
Impact Investing Nieuws 1 April 2017
 
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDS
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDSSECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDS
SECURE & EFFICIENT AUDIT SERVICE OUTSOURCING FOR DATA INTEGRITY IN CLOUDS
 

Similar to Modern javascript localization with c-3po and the good old gettext

Fullstack workshop
Fullstack workshopFullstack workshop
Fullstack workshopAssaf Gannon
 
Django dev-env-my-way
Django dev-env-my-wayDjango dev-env-my-way
Django dev-env-my-wayRobert Lujo
 
Javascript in Linux Desktop
Javascript in Linux DesktopJavascript in Linux Desktop
Javascript in Linux DesktopYuren Ju
 
Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Itzik Kotler
 
Google Back To Front: From Gears to App Engine and Beyond
Google Back To Front: From Gears to App Engine and BeyondGoogle Back To Front: From Gears to App Engine and Beyond
Google Back To Front: From Gears to App Engine and Beyonddion
 
Practical virtual network functions with Snabb (SDN Barcelona VI)
Practical virtual network functions with Snabb (SDN Barcelona VI)Practical virtual network functions with Snabb (SDN Barcelona VI)
Practical virtual network functions with Snabb (SDN Barcelona VI)Igalia
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018Thijs Feryn
 
Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018Thijs Feryn
 
Slides Aquarium Paris 2008
Slides Aquarium Paris 2008Slides Aquarium Paris 2008
Slides Aquarium Paris 2008julien.ponge
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)Fabien Potencier
 
Easy deployment & management of cloud apps
Easy deployment & management of cloud appsEasy deployment & management of cloud apps
Easy deployment & management of cloud appsDavid Cunningham
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13Fred Sauer
 
WCRI 2015 I18N L10N
WCRI 2015 I18N L10NWCRI 2015 I18N L10N
WCRI 2015 I18N L10NDave McHale
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer ToolboxPablo Godel
 
Ai meetup Neural machine translation updated
Ai meetup Neural machine translation updatedAi meetup Neural machine translation updated
Ai meetup Neural machine translation updated2040.io
 
VUG5: Varnish at Opera Software
VUG5: Varnish at Opera SoftwareVUG5: Varnish at Opera Software
VUG5: Varnish at Opera SoftwareCosimo Streppone
 

Similar to Modern javascript localization with c-3po and the good old gettext (20)

Fullstack workshop
Fullstack workshopFullstack workshop
Fullstack workshop
 
Django dev-env-my-way
Django dev-env-my-wayDjango dev-env-my-way
Django dev-env-my-way
 
Javascript in Linux Desktop
Javascript in Linux DesktopJavascript in Linux Desktop
Javascript in Linux Desktop
 
Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)
 
Google Back To Front: From Gears to App Engine and Beyond
Google Back To Front: From Gears to App Engine and BeyondGoogle Back To Front: From Gears to App Engine and Beyond
Google Back To Front: From Gears to App Engine and Beyond
 
Practical virtual network functions with Snabb (SDN Barcelona VI)
Practical virtual network functions with Snabb (SDN Barcelona VI)Practical virtual network functions with Snabb (SDN Barcelona VI)
Practical virtual network functions with Snabb (SDN Barcelona VI)
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018
 
Kubernetes debug like a pro
Kubernetes debug like a proKubernetes debug like a pro
Kubernetes debug like a pro
 
Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018
 
Slides Aquarium Paris 2008
Slides Aquarium Paris 2008Slides Aquarium Paris 2008
Slides Aquarium Paris 2008
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
 
Easy deployment & management of cloud apps
Easy deployment & management of cloud appsEasy deployment & management of cloud apps
Easy deployment & management of cloud apps
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
 
WCRI 2015 I18N L10N
WCRI 2015 I18N L10NWCRI 2015 I18N L10N
WCRI 2015 I18N L10N
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
 
Sprockets
SprocketsSprockets
Sprockets
 
Ai meetup Neural machine translation updated
Ai meetup Neural machine translation updatedAi meetup Neural machine translation updated
Ai meetup Neural machine translation updated
 
VUG5: Varnish at Opera Software
VUG5: Varnish at Opera SoftwareVUG5: Varnish at Opera Software
VUG5: Varnish at Opera Software
 

Recently uploaded

How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
microwave assisted reaction. General introduction
microwave assisted reaction. General introductionmicrowave assisted reaction. General introduction
microwave assisted reaction. General introductionMaksud Ahmed
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting DataJhengPantaleon
 
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxContemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxRoyAbrique
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdfSoniaTolstoy
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
URLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppURLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppCeline George
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxheathfieldcps1
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Celine George
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docxPoojaSen20
 
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptxVS Mahajan Coaching Centre
 
Presiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsPresiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsanshu789521
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
PSYCHIATRIC History collection FORMAT.pptx
PSYCHIATRIC   History collection FORMAT.pptxPSYCHIATRIC   History collection FORMAT.pptx
PSYCHIATRIC History collection FORMAT.pptxPoojaSen20
 
Concept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfConcept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfUmakantAnnand
 

Recently uploaded (20)

How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
microwave assisted reaction. General introduction
microwave assisted reaction. General introductionmicrowave assisted reaction. General introduction
microwave assisted reaction. General introduction
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data_Math 4-Q4 Week 5.pptx Steps in Collecting Data
_Math 4-Q4 Week 5.pptx Steps in Collecting Data
 
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxContemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
URLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppURLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website App
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptx
 
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
Incoming and Outgoing Shipments in 1 STEP Using Odoo 17
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docx
 
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
 
Presiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha electionsPresiding Officer Training module 2024 lok sabha elections
Presiding Officer Training module 2024 lok sabha elections
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
PSYCHIATRIC History collection FORMAT.pptx
PSYCHIATRIC   History collection FORMAT.pptxPSYCHIATRIC   History collection FORMAT.pptx
PSYCHIATRIC History collection FORMAT.pptx
 
Concept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.CompdfConcept of Vouching. B.Com(Hons) /B.Compdf
Concept of Vouching. B.Com(Hons) /B.Compdf
 

Modern javascript localization with c-3po and the good old gettext