рдореВрд▓ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЧреЛ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг

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


рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ рджрд╕ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЬрдм рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рд┐рд░реНрдл рдЖрдо рдЬрдирддрд╛ рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЖрдЬ рдХреЗ рдХрдИ рдЖрдИрдЯреА рджрд┐рдЧреНрдЧрдЬ рдПрдХ рджрд░реНрдЬрди рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдмреМрдиреЛрдВ рдХреЗ рдЪрд░рдг рдореЗрдВ рдереЗ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдПрдХ рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдерд╛ред рдФрд░ рдпреВрдЬрд░реНрд╕ рдХреЛ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдереАред рдЖрдЬ, рдЬрдм рд╕рдм рдХреБрдЫ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдорд╛рдереЗ рдореЗрдВ рд╕рд╛рдд рд╕реНрдкреИрди рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрдЪреНрдЪ рд╢рд┐рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдЧреНрд░реЗрдЬреА рдЬрд╛рдиреЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ, рд╕рднреА рдпреВрдЖрдИ рдЧреНрд░рдВрдереЛрдВ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 20 рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣реА рд╣реИред


Go рдореЗрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдпреБрд╡рд╛ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рднреА рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреНрд░реЗрдВрдбреНрд╕ рдХреЛ рдореВрд▓ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд "рдбрд╛рдВрд╕рд┐рдВрдЧ рд╡рд┐рдж рдЯреИрдордмреЛрд░рд╛рдЗрди" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред (рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЧреЛ рдХреЛ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА "рдЦреЛрдЬреЗ рдЧрдП рд╕реБрдкрд░рдкрд╛рд╡рд░" рдХреА рднрд╛рд╡рдирд╛ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рджрд┐рдиреЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЕрдм рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдХрд░ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред)


рдмреЗрд╢рдХ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╛ рддреЛ рдЧреЛ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдмреБрдирд┐рдпрд╛рджреА рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдЙрдкрд▓рдмреНрдз рд╣реИ: golang.org/x/text/language , golang.org/x/text/message рдФрд░ golang.org/x/text/feature/plural ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ рдЧреЛ рдореЗрдВ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрди рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рдВрджреЗрд╢ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдЬреИрд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреЛ рдХреА рд╢рдХреНрддрд┐ рдФрд░ рд╕реБрдВрджрд░рддрд╛ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рд╕рдВрдХреБрд▓ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЙрддреНрдкрд╛рджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдмреЗрд╣рддрд░ рдСрдл -рд╢реЗрд▓реНрдл рд╣реЛрдЯрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЧреЛ-рдЖрдИ 18 рдПрди рдХреЗ рдлрд╛рдпрджреЗ рдЧрд┐рдердм рдкрд░ рдХрдИ рд╕рд┐рддрд╛рд░реЗ рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рдореЗрд░рд╛ рднреА рд╣реИ) рдФрд░ рдорд╣рд╛рди рд▓рдЪреАрд▓рд╛рдкрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рд╣реИрдВ: рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ; рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдЬрдм рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛ; рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ, рддреЛ рдпрд╣ "рдЬреИрд╕рд╛ рд╣реИ" рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдФрд░, рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЦреБрдж рдХреБрдЫ рдХрд░рдирд╛ рд╣реИред


рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрдорд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдП: рд▓реЗрдмрд▓ рд╣реИрдВ: "рд▓реЗрдмрд▓_рдирд╛рдо: рдЕрдиреБрд╡рд╛рдж рдкрд╛рда" ; рдЕрдиреБрд╡рд╛рдж рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ru.yml; b) html рдореЗрдВ рдИрдореЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░: рд╕реНрдерд╛рдиреАрдп рдФрд░ рдбреЗрдЯрд╛ рд╕рд░рдгреА, рд╕рдВрджреЗрд╢ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдкрд╛рда рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рдФрд░ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрджреЗрд╢ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╢рдмреНрдж (golang.org/x/text/message)ред рдпрд╣ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рддрд╛рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдорд╛рдирдХ fmt рдкреИрдХреЗрдЬ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

message.SetString(language.Russian, "toxic", "") message.SetString(language.Japanese, "toxic", "цпТцАз") message.NewPrinter(language.Russian).Println(тАЬtoxicтАЭ) message.NewPrinter(language.Japanese).Println(тАЬtoxicтАЭ) //: // //цпТцАз 

рд▓реЗрдмрд▓ рдХреЛ "рджреЗрдЦрдиреЗ" рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЪрдпрдирд┐рдд рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд┐рдВрдЯрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рдЯреИрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЛ-рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рдирдП рдЯреИрдЧреНрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЯреИрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд▓реЗрдмрд▓ рдЦреЛрдЬ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк (рдХреБрдВрдЬреА рд╕реНрдЯреНрд░рд┐рдВрдЧ) (рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдУрдХреЗ рдмреВрд▓) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ ред

рд╢рдмреНрджрдХреЛрд╢ рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓реБрдХрдЕрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 type dictionary struct { Data map[string]string } func (d *dictionary) Lookup(key string) (data string, ok bool) { if value, ok := d.Data[key]; ok { return "\x02" + value, true } return "", false } 

рдпрд╛рд░рд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рднреА рд▓реЗрдмрд▓ рдХреЛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ, рдЬреЛ рдХрд┐ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ [рд▓реИрдВрдЧ] * рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╛рд░реВрдк рдирдХреНрд╢рд╛ , рдЬрд╣рд╛рдБ рд▓реИрдВрдЧ BCP47 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рднрд╛рд╖рд╛ рдЯреИрдЧ рд╣реИред

 func parseYAMLDict() (map[string]catalog.Dictionary, error) { dir := "./translations" files, err := ioutil.ReadDir(dir) if err != nil { return nil, err } translations := map[string]catalog.Dictionary{} for _, f := range files { yamlFile, err := ioutil.ReadFile(dir + "/" + f.Name()) if err != nil { return nil, err } data := map[string]string{} err = yaml.Unmarshal(yamlFile, &data) if err != nil { return nil, err } lang := strings.Split(f.Name(), ".")[0] translations[lang] = &dictionary{Data: data} } return translations, nil } 

рд╣рдо рдЗрдирд┐рдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕рдВрджреЗрд╢ рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

 func init() { dict, err := parseYAMLDict() if err != nil { panic(err) } cat, err := catalog.NewFromMap(dict) if err != nil { panic(err) } message.DefaultCatalog = cat } 

рдЗрд╕рд▓рд┐рдП, рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдордиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд╣реАрдВ рднреА рдЕрдкрдиреА рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд▓реЗрдмрд▓ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ:

 message.NewPrinter(language.Russian).Println(тАЬlabel_nameтАЭ) 

рдпрд╣ рдХрд╛рд░реНрдп рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рд▓реЗрдмрд▓ рдХреЛ рдИрдореЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрджреЗрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдкрддреНрд░:
рд╣реИрд▓реЛ, рдмрд┐рд▓ рд╕реНрдорд┐рде!


рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдорд╛рдирдХ рдкреИрдХреЗрдЬ - html / рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдЬрдм рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рдореЛрдВ рдХреЛ .Funcs () рдХреЗ рдЬрд░рд┐рдП рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 template.New(tplName).Funcs(fmap).ParseFiles(tplName) 

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЙрди рдореЗрдВ рд▓реЗрдмрд▓ рдФрд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдЪрд░ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд╣реЗрдЧрд╛ ред рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛрдб:

 //  lang:=language.Russian //  tplName:=тАЭ./templates/hello.htmlтАЭ //   data := &struct { Name string LastName string }{Name: "Bill", LastName: "Smith"} fmap := template.FuncMap{ //   "translate": message.NewPrinter(lang).Sprintf, } t, err := template.New(tplName).Funcs(fmap).ParseFiles(tplName) if err != nil { panic(err) } buf := bytes.NewBuffer([]byte{}) if err := t.Execute(buf, data); err != nil { panic(err) } fmt.Println(buf.String()) 

рдкрд░рд┐рдгрд╛рдореА рдкрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ ред/templates/hello.html:

 <!DOCTYPE html> <head> <title>{{translate "hello_subject"}}</title> </head> <body> {{translate "hello_msg" .Name .LastName}} </body> </html> 

рдЪреВрдВрдХрд┐ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рд╣рдо рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЯрдл рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдмрд▓ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЪрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, % s рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, % d рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред
рдЯреИрдЧ рдХреА рдЧрдИрдВ рдлрд╛рдЗрд▓реЗрдВ
en.yml

 hello_subject: Greeting mail hello_msg: Hello, %s %s! 

ru.yml

 hello_subject:   hello_msg: , %s %s! 

рдЗрд╕ рдкрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдм рд╣реИ, рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рддреИрдпрд╛рд░ рд╣реИ! рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рдХреБрдЫ рджрд░реНрдЬрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд┐рд▓реА, рдЬрд┐рд╕рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ, рддреЛ рдЖрдк % s рдХреЗ рдмрдЬрд╛рдп рд▓реЗрдмрд▓ рдореЗрдВ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЪрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рд▓реЗрдмрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдЧреЗ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрд╣реБрд╡рдЪрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдЫреЛрдбрд╝ рджреВрдВред


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЛрдб рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢ рдкреИрдХреЗрдЬ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрджрд░реНрд╢ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/hi431604/


All Articles