рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдирдпрд╛ рд╕рд╛рд▓ рдЖрдиреЗ рдореЗрдВ рдХреБрдЫ рд╣реА рджрд┐рди рдмрдЪреЗ рд╣реИрдВред рдореБрдЭреЗ рдЕрдкрдиреЗ рдорд╛рдорд▓реЛрдВ рдХреА рд╕реВрдЪреА рдЖрдИ, рдЬреЛ рдореИрдВ 2019 рдореЗрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рдЙрдирдореЗрдВ рд╕реЗ рдпрд╣ рд╣рдмрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ рдерд╛ред рдпрд╣ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдХрд╛рд░ рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ)ред
рдореИрдВ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛, рдореЗрд░реА рдмрд╛рдЗрдХ рдХрд╛ рдкреАрдЖрд░, рдЕрдЧрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрдЦ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреНрдпрд╛ рд╣реИ?
рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рдХреЗ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗред рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗрд╡рд▓ рдкрд╛рда рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд░реАрдЦреЛрдВ, рдореМрджреНрд░рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рдХреЛ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрдХ рднреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░реЗрд░рдгрд╛
рджрд░рдЕрд╕рд▓, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдореЗрдВ рдХреБрдЦреНрдпрд╛рдд рд╡реГрджреНрдзрд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдмрд╛рдд рдХреА рдЧрдИ рд╣реИред рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд▓рдХреНрд╖реНрдп рд╕рдореВрд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛
- ICU рд╡реНрдпрд╛рдХрд░рдг рд╕рдорд░реНрдерди
- рджрд┐рдирд╛рдВрдХ рд╕реНрд╡рд░реВрдкрдг
- рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡рд░реВрдкрдг
рдХреНрдпрд╛ рд╣реБрдЖ?
GitHub рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп (рддрд╛рд░рд╛рдВрдХрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣реБрдб рдХреЗ рддрд╣рдд, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдВрдЯрд▓ рдЗрдВрдЯ-рдореЗрд╕реЗрдлреЛрд░реНрдореИрдЯ-рдкрд╛рд░реНрд╕рд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдмрдирд╛рддрд╛ рд╣реИред рдмрдВрдбрд▓рдлреЛрдмрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдкрд╛рд░реНрд╕рд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рд╣рд╛рде рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди PEG.js. рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдореИрдВрдиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдХрд╛ рд╡рдЬрди 6 рдЧреБрдирд╛ рдХрдо рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭрд╕реЗ рдХрд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдПрдкреАрдЖрдИ рдХреЗ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рддрд┐рдерд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХреЛ рдлрд╝реЙрд░реНрдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдФрд░ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ formatSomething(value, options)
рдХреЗ formatSomething(value, options)
ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреИрдХреЗрдЬ @ рдИрдУ-рд▓реЛрдХреЗрд▓ / рдХреЛрд░ рдерд╛, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдврд╛рдВрдЪреЗ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдШрдЯрдХреЛрдВ рдФрд░ рд╣реБрдХ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
eo-locale
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП eo-locale
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред
import { EOLocale } from 'eo-locale'; const locales = [ { language: 'en', messages: { hello: 'Hello {name}!' } }, ]; <EOLocale.Provider language="en" locales={locales}> <span> <EOLocale.Text id="hello" name="World" /> // Helo World! </span> </EOLocale.Provider>
рдирдВрдмрд░ рд╕реНрд╡рд░реВрдкрдг рдорд╛рдирдХ Intl.NumberFormat рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ
import { EOLocale } from 'eo-locale'; <EOLocale.Number value={1000} /> // 1,000 <EOLocale.Number value={1000} currency="EUR" maximumFractionDigits={2} minimumFractionDigits={2} style="currency" /> // тВм1,000.00
рддрд╛рд░реАрдЦреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
import { EOLocale } from 'eo-locale'; <EOLocale.Date value={new Date(2019, 2, 19)} /> // 3/19/2019 <EOLocale.Date value={new Date(2019, 2, 19)} day="numeric" month="long" year="numeric" weekday="long" /> // Tuesday, March 19, 2019
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП useTranslator
рд╣реБрдХ:
import { useTranslator } from 'eo-locale'; function SomeComponent() { const translator = useTranslator(); return <div>{translator.formatNumber(1000)}</div>; }
рдЕрдиреНрдп рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдкреНрд░реЙрдореНрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ Money
рдХрд╛ рдПрдХ рд╢реИрд▓реАрдЧрдд рдШрдЯрдХ рд╣реИ, рдЬреЛ рдПрдХ рд░рдВрдЧ рдореЗрдВ рдореВрд▓реНрдп рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдореБрджреНрд░рд╛ рджреВрд╕рд░реЗ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рд░рд╛рд╢рд┐ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
import { EOLocale } from 'eo-locale'; import { Money } from '...somewhere'; const locales = [ { language: 'en', messages: { total: 'Total price is {price}' } }, ]; <EOLocale.Text id="total" price={<Money amount={1000} />} /> // Total price is тВм1,000.00
рдмрд╣реБрд╡рдЪрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИред рдпрд╣ Intl.PluralRules
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ Intl.PluralRules
ред
import { EOLocale } from 'eo-locale'; const locales = [ { language: 'en', messages: { items: '{count, plural, one {You have one item} other {You have {count} items}}' } }, ]; <EOLocale.Text id="items" count={3} /> // You have 3 items
Preact
рд╕рднреА рд╕рдорд╛рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЗрд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рдкреНрд░реАрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдХрд░ рдЯреИрдкрд┐рдВрдЧ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдиреАрдп рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреЛрдИ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рджрд╛рддрд╛ рдХреЛ onIdMissing рд╣реИрдВрдбрд▓рд░ рдлреЗрдВрдХрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рд╕реНрд╡рд╕реНрде рдЖрд▓реЛрдЪрдирд╛ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рднрд╛рд╖рд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдмрд╣реБрднрд╛рд╖рд╛рд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрд┐рдЫрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЧреНрд░рдВрдереЛрдВ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред