рд╢реБрдн рджрд┐рди, рд╣рднрд╡реЗрдВ!
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрд╛рда рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдк рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдЕрдиреБрднрд╡реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ ... рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкрд╛рда рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛: рдмреЛрдЭрд┐рд▓, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдмрдврд╝рдиреЗ рдХреА рдкреНрд░рд╡реГрддреНрддрд┐ (рдпрд╣ рддрдм рд╣реИ рдЬрдм рд╣рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЬрд┐рд╕ рдХрдВрдкрдиреА рдореЗрдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдФрд░ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред
рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓, рдЖрд╕рд╛рди, рд╕рдордЭрдиреЗ рдФрд░ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╛ рдирд╣реАрдВ? рдЖрдЗрдП рд╕реЛрдЪреЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдЧреНрд░рдВрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧреНрд░рдВрдереЛрдВ рдореЗрдВ рдЪрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЪрд░реЛрдВ рдХрд╛ рднреА рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?! рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рд╛рдБред рдФрд░ рдЕрдЧрд░ рдЪрд░ рдПрдХ рддрд╛рд░реАрдЦ рдпрд╛ рд╕рдВрдЦреНрдпрд╛ рд╣реИ?! рдкреНрд▓рд╕ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рдорд░реНрдердиред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╛рда рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рдзрд╛рдиред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдзрд╛рд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдкрд╛рда рдХрд╛ рдХреЛрдб рд╣реИ, рдФрд░ рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╛рда рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:
const textsBundle = { 'button.open': 'Open', 'button.save': 'Save', }; function TextManager(texts) { this.getText = function(code) { return texts[code]; }; } const textManager = new TextManager(textsBundle); textManager.getText('button.open');
рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд░ рддреБрд░рдВрдд рд╕рд╣рдордд рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреБрдВрдЬрд┐рдпрд╛рдБ "рд╣рд▓рдЪрд▓" рдХрд░реЗрдВрдЧреА :)ред рдХреЛрдИ рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдкрд╕рдВрдж рд╣реИ:
'button.open.label'
'button.open.help_text'
рдпрд╛
'button.label.open'
'button.help_text.open'
рдпрд╛
'label.button.open'
'help_text.button.open'
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рда рдХреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрд░рд╛рдореАрдЯрд░ рдбрд╛рд▓реЗрдВред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдРрд╕реЗ рдлреИрд╕рд▓реЗ рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВ ... рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдореИрдВрдиреЗ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рд╣реИ :)
рд╣рдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ: рдЗрдирдкреБрдЯ рдкрд░, рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкрд╛рда рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЗрд░рдлреЗрд░ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдореА рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдЧрд╛ред
рдкрд╣рд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдореВрд▓ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдкрд┐рдЫрд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд▓рд╛рдкрддрд╛ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
function TextManager(texts, middleware) { function applyMiddleware(text, parameters, code) { if (!middleware) return text; return middleware.reduce((prevText, middlewareItem) => middlewareItem(prevText, parameters, code), text); } this.getText = function(code, parameters) { return applyMiddleware(texts[code], parameters, code); }; }
TextManager рдЕрдкрдиреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрдИ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рдкрд╛рда рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
- рдкрд╛рда рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
- рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг
- рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- рдкрд╛рда рдкрд░рд┐рд░рдХреНрд╖рдг, рдЖрджрд┐ред
рдЕрднреНрдпрд╛рд╕
рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЖрдкрдХреЛ рдЙрдирдХреА 100% рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
InsertParams
рдЧреНрд░рдВрдереЛрдВ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ "рд╣реИрд▓реЛ {{рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо}}" рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:
function InsertParams(text, parameters) { if (!text) return text; if (!parameters) return text; let nextText = text; for (let key in parameters) { if (parameters.hasOwnProperty(key)) { nextText = text.replace('{{' + key + '}}', parameters[key]); } } return nextText; }
UseCodeIfNoText
рдпрджрд┐ рдкрд╛рда рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдЖрдкрдХреЛ undefined
рдмрдЬрд╛рдп рдкрд╛рда рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
function UseCodeIfNoText(text, parameters, code) { return text ? text : code; }
рдХреБрд▓ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
const textsBundle = { 'text.hello': 'Hello', 'text.hello_with_numeric_parameter': 'Hello {{0}}', 'text.hello_with_named_parameter': 'Hello {{username}}', }; const textManager = new TextManager(textsBundle, [InsertParams, UseCodeIfNoText]); textManager.getText('nonexistent.code')
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реАрд░реНрд╖ рд╕реНрддрд░ TextManager
рдкрд░ TextManager
рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
const textsBundle = { 'text.hello': 'Hello {{username}}' } function TextManagerProvider({ children }) { const textManager = new TextManager(textsBundle, [InsertParams, UseCodeIfNoText]); return ( <TextManagerContext.Provider value={textManager}> {children} </TextManagerContext.Provider> ) }
рдЕрдЧрд▓рд╛, рдШрдЯрдХ рдореЗрдВ, textManager
рдЙрдкрдпреЛрдЧ textManager
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рд╣рдореЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рдкрд╛рда рдорд┐рд▓рддрд╛ рд╣реИред
function SayHello({ username }) { const textManager = useContext(TextManagerContext); return ( <div> {textManager.getText('text.hello', { username })} </div> ) }
рд╕реНрдерд╛рдиреАрдпрдХрд░рдг
рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ, "рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ?"
рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рднрд╛рд╖рд╛ рдмрджрд▓рддреЗ рд╕рдордп, TextManager
рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг TextManager
, рдкрд╛рда рдЬреЛрдбрд╝реЗрдВ рдФрд░ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рддрдкрд╕реНрдпрд╛ рдЕрдзреНрдпрд╛рдп :)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЖрдк рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреАрдердм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдкрд╛рда-рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╕реБрдзрд╛рд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! :)
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рджрд╛рдПрд╡рдиреА рдЗрдЪреНрдЫрд╛ рдкреВрд░реА рдХреА - рд╣реИрдмрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рд╕рдореБрджрд╛рдп рдХреЛ рдЦреБрд╢ рдХрд░реЗрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред