рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдЯреАрдо рд╕реЗ Node.js рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдиреМрд╡рд╛рдБ рд▓реЗрдЦ рд╣реИ, рдЬреЛ рдкрд░реНрд╕реЛрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ:

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЙрддреНрдкрд╛рдж рдФрд░ рд╕реЗрд╡рд╛рдПрдБ 90 рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ? рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдФрд░ рднрд╛рд╖рд╛рдУрдВ рдХреА рдмреЛрд▓рд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдкрд╛рда;
- рджрд╛рд╣рд┐рдиреЗ рд╕реЗ рдмрд╛рдПрдВ рдУрд░ рдХреА рд╡рд░реНрддрдиреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди;
- рдмреБрд▓реЗрдЯрдкреНрд░реВрдл рдбрд┐рдЬрд╛рдЗрди рдЬреЛ рдХрд┐рд╕реА рднреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ;
- рд╣реЗрдбрд░, рдЯреИрдЧ рдФрд░ рдмрдЯрди рдкрд╛рда рд╕реНрдерд╛рдиреАрдп рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд▓рд╡рд╛рдпрд╛ рдЧрдпрд╛ред
рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд░ рддреАрди рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рдПрдХ рдмрд╣реБрднрд╛рд╖реА Node.js. рдмрдирд╛рдиреЗ рдХреЗ рддрдХрдиреАрдХреА рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╢рдмреНрджреЛрдВ "рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг" (i18n) рдФрд░ "рд╕реНрдерд╛рдиреАрдпрдХрд░рдг" (l10n) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдмрд╛рдж рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг, рдЕрд░реНрдерд╛рддреН, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
Mozilla Persona рдПрдХ Node.js рд╡реЗрдм рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╣реИред рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рдереЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдп
рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдП рд╣реИрдВ:
- рд╕реНрдерд╛рдиреАрдп рд╕рдореБрджрд╛рдп рдФрд░ рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЗ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рдХреЗ рдореМрдЬреВрджрд╛ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдПрдХреАрдХрд░рдг;
- рд╕рднреА рдЙрдкрдХрд░рдг рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- i18n-рдкрд╛рд▓рди
- jsxgettext
- po2json.js
- рдЧреЙрдмрд▓реНрдбреАрдЧреБрдХ
i18n-abide рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдИрдЬреЗрдПрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рддреИрдпрд╛рд░реА
i18n-abide npm рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддрд╛ рд╣реИ:
npm install i18n-abide
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
var i18n = require('i18n-abide'); app.use(i18n.abide({ supported_languages: ['en-US', 'de', 'es', 'zh-TW'], default_lang: 'en-US', translation_directory: 'static/i18n' }));
рд╣рдо рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рддреАрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред i18n-abide рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ
req
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдЪрд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдкрд╛рда рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
<title></title>
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рд╡рд╣
gettext()
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░
lang
рдФрд░
lang_dir
ред
lang
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реАрдпрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рднрд╛рд╖рд╛ рдХреЛрдб рд╣реИ;lang_dir
- рдкрд╛рда рдХреА рджрд┐рд╢рд╛, рдмрд╛рдПрдБ рд╕реЗ рджрд╛рдПрдБ ( ltr
) рдпрд╛ рджрд╛рдПрдБ рд╕реЗ рдмрд╛рдПрдБ ( rtl
);gettext
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреБрд╡рд╛рдж рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдорддрд▓рдм
gettext
рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдирд╣реАрдВред рдпреЗ рдкрд╛рда рдХреЗ рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ - рд▓реЗрдмрд▓, рдкреИрд░рд╛рдЧреНрд░рд╛рдл, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рддреЛ
gettext
рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ,
gettext
рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
gettext
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
app.get('/', function(req, res) { res.render('homepage.ejs', { title: req.gettext('Hello, World!') }); });
рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
gettext
рдХреЙрд▓ рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рднрд╛рд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
рд╣рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ? рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд░рдирд╡реЗ рдкрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдкрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
I18n-abide рдореЙрдбреНрдпреВрд▓ HTTP рдЕрдиреБрд░реЛрдз рдХреЗ
Accept-language
рдХреНрд╖реЗрддреНрд░ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред рдпрд╣ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реАрдпрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реИред
abide рдЗрд╕ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдЪ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкреЗрдЬ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рд╕реАрдзреЗ
gettext
рдХреЙрд▓ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдареАрдХ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рддрд╛рд░ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рддреАрд╕рд░реЗ рдореЗрдВ, рд╣рдо рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ: