Rrule: toText . рдХреЗ i18n рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдкреНрд░реИрд▓ 2013  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jakubroztocil/rrule

рдХреГрдкрдпрд╛ toText() рдкрджреНрдзрддрд┐ рдХреЗ i18n рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

  1. today рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
  2. рдХреМрди рд╕реЗ рдорд╛рди gettext ?
  3. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реВрдВ? рдореИрдВ dayNames рдФрд░ monthNames рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдЗрд╕ lib рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдХреЛрдИ рдЕрдкрдбреЗрдЯреНрд╕? рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдЬ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдмрд╕ null рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреМрди рд╕реЗ рдорд╛рди рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реВрдВ? рдореИрдВ рджрд┐рди рдХреЗ рдирд╛рдо рдФрд░ рдорд╣реАрдиреЗ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреЛ рддрд╛рд░реАрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд╛рд▓рд╛ рдпрд╣рд╛рдБ рд╣реИ ред tokens рдХреЗрд╡рд▓ RRule.fromText рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

gettext рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИ (рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдПрдХ рдХрдЪреНрдЪрд╛ рдЙрджрд╛рд╣рд░рдг (рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ toText рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рд╣реИ):

// Date-related translations
var portuguese = {
    dayNames: [
        "Domingo",
        "Segunda-Feira",
        "Ter├зa-feira",
        "Quarta-feira",
        "Quinta-feira",
        "Sexta-feira",
        "S├бbado"
    ],
    monthNames: [
        "Janeiro",
        "Fevereiro",
        // тАж
    ]
    // `tokens` are only needed for `RRule.fromText`

};


// Strings
var portugueseStrings = {
    'every': 'cada',
    'until': 'at├й',
    'day': 'dia',
    'days': 'dias',
    'week': 'semana',
    'weeks': 'semanas',
    'on': 'em'
    // тАж
};

var gettext =  function(id) {
    // Return pt. string, default to english.
    return portugueseStrings[id] || id;
};


var rule = new RRule(RRule.WEEKLY, {
    interval: 5,
    byweekday: [RRule.MO, RRule.FR],
    dtstart: new Date(2012, 1, 1, 10, 30),
    until: new Date(2012, 12, 31)
});

console.log(rule.toText());
// => every 5 weeks on Monday, Friday until January 31, 2013

console.log(rule.toText(null, gettext, portuguese));
// => cada 5 semanas em Segunda-Feira, Sexta-feira at├й Janeiro 31, 2013

TODO: рдПрдкреАрдЖрдИ рдХреЛ Language рдХреНрд▓рд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)ред

рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

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

singular: 'every week on {{dayNames}}',
plural: 'every {{numWeeks}} weeks on {{dayNames}}'

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдореЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдЖрджрд┐ рд╣реИрдВ рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рд╕рд╣реА рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдмрд╕ https://github.com/airbnb/polyglot.js рдкрд░ рдЖрдпрд╛, рд▓реЗрдХрд┐рди i18n рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИрдВ

рдХреБрдЫ рдРрд╕реА рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ:

рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдпрд╣ "рд╣рд░ рд╣рдлреНрддреЗ" рдФрд░ "рд╣рд░ рдорд╣реАрдиреЗ" рд╣реИред рдЬрд░реНрдорди рдореЗрдВ рдпрд╣ "рдЬреЗрдбреЗ рд╡реЛрдЪреЗ" рдФрд░ "рдЬреЗрдбрди рдореЛрдирд╛рдЯ" рд╣реИред "рдПрди" рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдореИрдВ рдХреЗрд╡рд▓ "рдкреНрд░рддреНрдпреЗрдХ" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ "рд╕реЗрдВрдЯ" рдпрд╛ "рдЖрд░рдбреА" рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдмрд╛рддред рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдХреЛрдИ рдЦрдмрд░ рдпрд╛ рдпреЛрдЬрдирд╛? рдЕрдм рдЬрдм рдореИрдВрдиреЗ DTSTART рдФрд░ UNTIL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рддреЛ рдореИрдВ рдЕрдм toText рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд╛рдд: рджрд┐рдирд╛рдВрдХ рд╕реНрд╡рд░реВрдкред рдореБрдЭреЗ DD.MM.YYYY рди рдХрд┐ MMMM DD, YYYY ред

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдПрдХ html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ (2.0) рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдб рд╣реИред

[рдХреЛрдб]

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкрд░реАрдХреНрд╖рдг

[/ рдХреЛрдб]
рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: _ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ
рд╡рд░ рдЪреВрдХ = _.рдХреНрд▓реЛрди (RRule.DEFAULT_OPTIONS);
рд▓рд╛рдЗрди 463 рдкрд░ рдирд┐рдпрдо рдореЗрдВред

рдореИрдВ рдХрд╣рд╛рдБ рдЧрд▓рдд рд╣реВрдБ?

рдЖрдкрдХреЛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░рдЬ рдирд╛рдордХ рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдлреЛрди рдкрд░ рд╣реВрдВ рдирд╣реАрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд▓рд┐рдВрдХ рджреЗ рджреЗрддрд╛ред

рдЕрдХреНрдЯреВ 30, 2013 рдкрд░ 11:54 pm рдкрд░, elecoest [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдПрдХ html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ (2.0) рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдб рд╣реИред

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкрд░реАрдХреНрд╖рдг
рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: _ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ

рд╡рд░ рдЪреВрдХ = .рдХреНрд▓реЛрди (RRule.DEFAULTOPTIONS);
рд▓рд╛рдЗрди 463 рдкрд░ рдирд┐рдпрдо рдореЗрдВред

рдореИрдВ рдХрд╣рд╛рдБ рдЧрд▓рдд рд╣реВрдБ?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рдареАрдХ рд╣реИ, рдореИрдВ undesrcore.js рдХреЛ рддреАрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦреВрдВрдЧрд╛...
рдореИрдВрдиреЗ рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗрдПрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрд╛ рд╣реИред
рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐ рд╣реИ
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: 2 рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ
рд╡рд╛рдкрд╕реА рдкрд░рд┐рдгрд╛рдоред рдХреЙрд▓ (рдпрд╣, func.apply (_, args));
рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗрдПрд╕ . рдореЗрдВ

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рддрд░реАрдХрд╛ рд╣рд░ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреИрд╕рд╛ рд╣реИ?

рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ?

рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЖрдЬ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдмрд╕ null рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреМрди рд╕реЗ рдорд╛рди рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реВрдВ? рдореИрдВ рджрд┐рди рдХреЗ рдирд╛рдо рдФрд░ рдорд╣реАрдиреЗ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреЛ рддрд╛рд░реАрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд╛рд▓рд╛ рдпрд╣рд╛рдБ рд╣реИ ред tokens рдХреЗрд╡рд▓ RRule.fromText рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

gettext рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИ (рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдПрдХ рдХрдЪреНрдЪрд╛ рдЙрджрд╛рд╣рд░рдг (рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ toText рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рд╣реИ):

// Date-related translations
var portuguese = {
    dayNames: [
        "Domingo",
        "Segunda-Feira",
        "Ter├зa-feira",
        "Quarta-feira",
        "Quinta-feira",
        "Sexta-feira",
        "S├бbado"
    ],
    monthNames: [
        "Janeiro",
        "Fevereiro",
        // тАж
    ]
    // `tokens` are only needed for `RRule.fromText`

};


// Strings
var portugueseStrings = {
    'every': 'cada',
    'until': 'at├й',
    'day': 'dia',
    'days': 'dias',
    'week': 'semana',
    'weeks': 'semanas',
    'on': 'em'
    // тАж
};

var gettext =  function(id) {
    // Return pt. string, default to english.
    return portugueseStrings[id] || id;
};


var rule = new RRule(RRule.WEEKLY, {
    interval: 5,
    byweekday: [RRule.MO, RRule.FR],
    dtstart: new Date(2012, 1, 1, 10, 30),
    until: new Date(2012, 12, 31)
});

console.log(rule.toText());
// => every 5 weeks on Monday, Friday until January 31, 2013

console.log(rule.toText(null, gettext, portuguese));
// => cada 5 semanas em Segunda-Feira, Sexta-feira at├й Janeiro 31, 2013

TODO: рдПрдкреАрдЖрдИ рдХреЛ Language рдХреНрд▓рд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)ред

рдирдорд╕реНрддреЗ, рдореИрдВ рдЬрд░реНрдорди рдХреЗ рд▓рд┐рдП i18n рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдЯреВрдЯрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдореБрдЭреЗ "рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ" рдореЗрдВ рдХреМрди рд╕реЗ рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рднреА рдорд┐рд▓ рдЧрдпрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

рдЖрдЬ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдмрд╕ null рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреМрди рд╕реЗ рдорд╛рди рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реВрдВ? рдореИрдВ рджрд┐рди рдХреЗ рдирд╛рдо рдФрд░ рдорд╣реАрдиреЗ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдкрдХреЛ рддрд╛рд░реАрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд╛рд▓рд╛ рдпрд╣рд╛рдБ рд╣реИ ред tokens рдХреЗрд╡рд▓ RRule.fromText рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
gettext рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИ (рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛
рдПрдХ рдХрдЪреНрдЪрд╛ рдЙрджрд╛рд╣рд░рдг (рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ toText рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рд╣реИ):

// Date-related translations
var portuguese = {
    dayNames: [
        "Domingo",
        "Segunda-Feira",
        "Ter├зa-feira",
        "Quarta-feira",
        "Quinta-feira",
        "Sexta-feira",
        "S├бbado"
    ],
    monthNames: [
        "Janeiro",
        "Fevereiro",
        // тАж
    ]
    // `tokens` are only needed for `RRule.fromText`

};


// Strings
var portugueseStrings = {
    'every': 'cada',
    'until': 'at├й',
    'day': 'dia',
    'days': 'dias',
    'week': 'semana',
    'weeks': 'semanas',
    'on': 'em'
    // тАж
};

var gettext =  function(id) {
    // Return pt. string, default to english.
    return portugueseStrings[id] || id;
};


var rule = new RRule(RRule.WEEKLY, {
    interval: 5,
    byweekday: [RRule.MO, RRule.FR],
    dtstart: new Date(2012, 1, 1, 10, 30),
    until: new Date(2012, 12, 31)
});

console.log(rule.toText());
// => every 5 weeks on Monday, Friday until January 31, 2013

console.log(rule.toText(null, gettext, portuguese));
// => cada 5 semanas em Segunda-Feira, Sexta-feira at├й Janeiro 31, 2013

TODO: рдПрдкреАрдЖрдИ рдХреЛ Language рдХреНрд▓рд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛)ред

рдирдорд╕реНрддреЗ, рдореИрдВ рдЬрд░реНрдорди рдХреЗ рд▓рд┐рдП i18n рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдЯреВрдЯрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдореБрдЭреЗ "рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ" рдореЗрдВ рдХреМрди рд╕реЗ рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рднреА рдорд┐рд▓ рдЧрдпрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

https://github.com/jakubroztocil/rrule/tree/master/src/nlp

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

const germanStrings = {
    every: 'jedes',
    until: 'bis',
    day: 'Tag',
    days: 'Tage',
    week: 'Woche',
    weeks: 'Wochen',
    on: 'ein',
    in: 'in',
    'on the': 'auf dem',
    for: 'f├╝r',
    and: 'und',
    or: 'oder',
    at: 'bei',
    last: 'zuletzt',
    '(~ approximate)': '(~ approximativ)',
    times: 'Zeiten',
    time: 'Zeit',
    minutes: 'Minuten',
    hours: 'Stunden',
    weekdays: 'Wochentage',
    weekday: 'Wochentag',
    months: 'Monate',
    month: 'Monat',
    years: 'Jahre',
    year: 'Jahr'
  };
const RRULE_GERMAN = {
  dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
  monthNames: [
    'Januar',
    'Februar',
    'M├дrz',
    'April',
    'Mai',
    'Juni',
    'Juli',
    'August',
    'September',
    'Oktober',
    'November',
    'Dezember'
  ]
};
const gettext = id => {
    return germanStrings[id] || id;
};

const rruleText = rule.toText(id => {
    gettext(id);
}, RRULE_GERMAN);

рдХреЛрдИ рдЕрдкрдбреЗрдЯреНрд╕? рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ i18n, рдЕрднреА рддрдХ, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реИред рдЪреАрдЬреЗрдВ рдЬреИрд╕реЗ рдХреА

nth_monthday' => array(
        '1' => 'the 1st',
        '2' => 'the 2nd',
        '3' => 'the 3rd',
        '21' => 'the 21st',
        '22' => 'the 22nd',
        '23' => 'the 23rd',
        '31' => 'the 31st',
        'else' => 'the %{n}th'
    ),

рдХреБрдЫ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рддрд╛рдВрдд рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ @wakirin рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИ)ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдКрдкрд░ рд▓рд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдордп, рдХреБрдЫ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп i18n рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░реНрдХ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрджреНрдпрддрди: рдХреЛрдб рдХреЛ рдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд╡рд╣ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рдореЗрд░реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ "рд╣рд▓" рдХрд░ рджрд┐рдпрд╛ред рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣рд╛рдВ рдЙрди рд╕рднреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд getText рд╡рд┐рдзрд┐ рдкрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 '(~ approximate)'
 'and'
 'at'
 'day'
 'days'
 'every'
 'for'
 'hour'
 'hours'
 'in'
 'last'
 'minutes'
 'month'
 'months'
 'nd'
 'on the'
 'on'
 'or'
 'rd'
 'st'
 'th'
 'the'
 'time'
 'times'
 'until'
 'week'
 'weekday'
 'weekdays'
 'weeks'
 'weeks'
 'year'
 'years'
 'RRule error: Unable to fully convert this rrule to text'

@gongAll рдзрдиреНрдпрд╡рд╛рдж,
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ i18n рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

export const RRuleToText = ({ strRRule }) => {
  const language = {
    dayNames: moment.weekdays(),
    monthNames: moment.months()
  };

  const getText = id => {
    return i18n.t(`vendor.rrule.${id}`, id);
  };

  const dateFormat = (year, month, day) =>
    moment()
      .date(day)
      .year(year)
      .month(month)
      .format("LL");

  return strRRule
    ? capitalize(
        RRule.fromString(strRRule).toText(getText, language, dateFormat)
      )
    : "";
};

рдХреНрдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реЛрдЧрд╛? рдореБрдЭреЗ рдЬрд╛рдкрд╛рдиреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИ; рд╢рдмреНрдж рдХреНрд░рдо рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ ...

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

spurreiter picture spurreiter  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

berardo picture berardo  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shorlbeck picture shorlbeck  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jimmywarting picture jimmywarting  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shavenwalrus picture shavenwalrus  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ