рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдЯреАрдо рд╕реЗ Node.js рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЧреНрдпрд╛рд░рд╣рд╡рд╛рдВ рд▓реЗрдЦ рд╣реИ, рдЬреЛ рдкрд░реНрд╕реЛрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ:
рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рддреЛ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ i18n-abide рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓рдкреЗрдЯрд╛ред рддрдм рд╣рдорд╛рд░реА рдЕрдиреБрд╡рд╛рдж рдЯреАрдо рдиреЗ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдЕрдиреБрд╡рд╛рдж рд╣реИред
рдЕрдм рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рд╣рдорд╛рд░рд╛ Node.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдкреЛ-рдлрд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реИрдВ:
locale en LC_MESSAGES messages.po de LC_MESSAGES messages.po es LC_MESSAGES messages.po
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- i18n-abide рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рд╣реА рдЧреЗрдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░;
- gettext.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдкрд░, рдЬреЛ рдХрд┐ i18n-abide рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рддрд╛рд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдВред рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдЫреЛрдЯрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдгрд╛рд▓реА GNU рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рддреАрд╕рд░рд╛ рддрд░реАрдХрд╛ рднреА рд╣реИ -
рдиреЛрдб-рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓ред рдпрд╣ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдореЗрдВ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рд╣реИред
рдЖрдЧреЗ рд╣рдо рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ i18n-abide рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИред
рд╕рдВрдХрд▓рди json
рд╣рдо рдкреЛ рдлрд╛рдЗрд▓реНрд╕ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ JSON рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рди-рдЬреЛрдВрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рдЕрдиреБрд╡рд╛рдж рдлрд╛рдЗрд▓реЗрдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВ, рдФрд░ JSON рдлрд╛рдЗрд▓реЗрдВ рд╕реНрдерд┐рд░ / i18 рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
$ mkdir -p static/i18n $ ./node_modules/.bin/compile-json locale static/i18n
рд╣рдореЗрдВ рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ:
static i18n en messages.json messages.js de messages.json messages.js es messages.json messages.js
compile-json рд╕рднреА po-files рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП po2json.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд .json рдФрд░ .js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдкреЗрдирд┐рд╢ рдЕрдиреБрд╡рд╛рдж рд▓реЗрдВ:
рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
"messages": { "": { "Project-Id-Version": " PACKAGE VERSION\nReport-Msgid-Bugs-To: \nPOT-Creation-Date: 2012-06-24 09:50+0200\nPO-Revision-Date: 2013-04-24 16:42-0700\nLast-Translator: Austin King <ozten@nutria.localdomain>\nLanguage-Team: German\nLanguage: de\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, "Mozilla Persona": [ null, "Mozilla Personidada" ] } }
рд╣рдо рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, Node.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░, рдЗрд╕реЗ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪ рдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЦреБрд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкреЗрдирд┐рд╢ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ /i18n/es/messages.json рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реНрдерд┐рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭреМрддрд╛ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк Node.js рдФрд░ рдХрд┐рд╕реА рднреА рд╡реЗрдм рд╕рд░реНрд╡рд░, рдЬреИрд╕реЗ рдХрд┐ Nginx, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рдж рдлрд╛рдЗрд▓реЗрдВ рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреАрдУ рдлрд╛рдЗрд▓реЗрдВ рд╕реНрд╡рдпрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рд╡рд┐рдиреНрдпрд╛рд╕
i18n-abide рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рднрд╛рд╖рд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдХрд╣рд╛рдВ рдЕрдиреБрд╡рд╛рдж рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
app.use(i18n.abide({ supported_languages: ['en-US', 'de', 'es', 'zh-TW'], default_lang: 'en-US', translation_directory: 'static/i18n' }));
- support_languages тАЛтАЛрдпрд╣рд╛рдВ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрдЧреНрд░реЗрдЬреА, рдЬрд░реНрдорди, рд╕реНрдкреЗрдирд┐рд╢ рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЪреАрдиреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рд╣реИрдВред
- translation_directory рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде json рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реНрдерд┐рд░ / i18n рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди_рдирд┐рд░реНрджреЗрд╢рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
i18n-abide рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдЙрдкрдпреБрдХреНрдд support_languages тАЛтАЛрдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдЪреБрдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред
рд╣рдо рдореЛрдЯрд░реНрд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдЗрд╕рд▓рд┐рдП, рдЬрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рд╣рдо рдЙрд╕ рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

рд╣рдо рдЖрд╡реЗрджрди рдХреЗ рдкрдиреНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реНрд╕рди рдХрд╛ рдЧреНрд░реАрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

рдЧреЙрдмрд▓реНрдбреАрдЧреБрдХ
рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдбреЗрд╡рд┐рдб рдмреЙрд╡реА рдХреА рдХреНрд▓рд┐рдк "
рд▓реИрдмреНрд░рд┐рдиреНрде " рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рд▓реЛрдХреЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдЕрднреА рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд░реНрдерд┐рдд-languages тАЛтАЛрдФрд░ debug_lang рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ CH рд╣реИ:
app.use(i18n.abide({ supported_languages: ['en-US', 'de', 'es', 'zh-TW', 'it-CH'], debug_lang: 'it-CH', ...
рдЕрдм, рдпрджрд┐ рдЖрдк рд╕реНрд╡рд┐рд╕ рдЗрддрд╛рд▓рд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ i18n-abide рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП gobbledygook рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╛рдИрдВ рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рд╡рд░реНрддрдиреА рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд┐рдмреНрд░реВ:

рдЧрд╣рд░рд╛ рдЬрд╛рдУ
рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рд╕рддрд╣ рдХреЛ рдЫреБрдЖ рд╣реИред Node.js рдкрд░ рдПрдХ рдмрд╣реБрднрд╛рд╖реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЬрд╛рд▓ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди
I18n-abide рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- % s - рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- % (рдирд╛рдо) s - рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдлреЙрд░реНрдореЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ HTML рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдкреАрдУрдПрд▓-рдлрд╛рдЗрд▓ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреАрди рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:
<%= gettext('<p>Buy <a href="/buy?prod=blue&type=ticket">Blue Tickets</a> Now!</p>') %> <p><%= format(gettext('Buy <a href="%s">Blue Tickets</a> Now!'), ['/buy?prod=blue&type=ticket']) %></p> <p><%= format(gettext('Buy <a href="%(url)s">Blue Tickets</a> Now!'), {url: '/buy?prod=blue&type=ticket'}) %></p>
рдкреЛ-рдлрд╛рдЗрд▓ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА:
msgid "<p>Buy <a href=\"/buy?prod=blue&type=ticket\">Blue Tickets</a> Now!</p>" msgid "Buy <a href="%s">Blue Tickets</a> Now!" msgid "Buy <a href="%(url)s">Blue Tickets</a> Now!"
рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "
. ! - , . URL.
format , , HTML, , .
, . , URL. - .
- , :
<p><%= format(gettext('Welcome back, %(user_name)s'), {user_name: user.name}) %></p>
, .
. CSS, .
CSS. . , .
. , 100%- , , .
, . .
, .
: " Node.js " " Node " " , " " . 1 тАФ , , " " , " " . 2 тАФ etagify " " - node-convict " " . 3 тАФ " " Node.js. 1 " " Node.js. 2: " " Node.js. 3: " " Awsbox - PaaS- Node.js Amazon "