toText()
๋ฉ์๋์ i18n์ ๋ํ ๋ ๋์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ญ์์ค.
today
๋งค๊ฐ๋ณ์์ ์๋ฏธ๋ ๋ฌด์์
๋๊น?gettext
์ ๋ฌ๋๋ ๊ฐ์ ๋ฌด์์
๋๊น?dayNames
๋ฐ monthNames
๋ณ๊ฒฝํ ์ ์์ง๋ง ์ด๋ ์ผ๋ถ์ผ ๋ฟ์
๋๋ค.์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ค๋ ๋งค๊ฐ๋ณ์์ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?
ํ์ฌ๋ก์๋ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ null
์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
์ด๋ค ๊ฐ์ด gettext์ ์ ๋ฌ๋ฉ๋๊น?
์ค์ ๋ก ์ด๋ป๊ฒ ๋ฒ์ญํฉ๋๊น? ๋๋ dayNames ๋ฐ monthNames๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง ์ด๋ ๊ทธ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค.
API๋ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค.
๋ ์ง ๊ด๋ จ ํญ๋ชฉ์ผ๋ก ์ธ์ด ์ ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ ์์ด๋ ์ฌ๊ธฐ์ ์์ต๋๋ค . 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: API๋ฅผ ๊ฐ์ ํ๊ณ ๋ฌธ์ํํฉ๋๋ค( Language
ํด๋์ค๊ฐ ์ข์ ๊ฒ์
๋๋ค).
API๋ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค.
ํ , ๊ทธ๋. ๋น ์ง ๊ฒ์ด ์์ต๋๋ค. ๋จ์ด๋ง ๋ฒ์ญํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ธ์ด์ ๋ฐ๋ผ ๋ฌธ๋ฒ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์๋ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. ๋์ ๋ค์๊ณผ ๊ฐ์ ํ์ ๋ฌธ์์ด์ด ์์ด์ผ ํฉ๋๋ค.
singular: 'every week on {{dayNames}}',
plural: 'every {{numWeeks}} weeks on {{dayNames}}'
๊ทธ๊ฒ์ ๋จ์ง ๊ฑฐ์น ์์ ๋๋ค. ๋๋ ๋ง์ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ ๋ฑ์ด ์๊ณ ์๋ง๋ ์ฌ๋ฐ๋ฅด๊ฒ ํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฐฉ๊ธ https://github.com/airbnb/polyglot.js ๋ฅผ ์ฐพ์์ง๋ง i18n์ ๋ํ ๋ค๋ฅธ ๋ง์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
๋๋ฅผ ๋ฌผ๋ฆฐ ๊ฒ :
์์ด๋ก "๋งค์ฃผ"์ "๋งค์"์ ๋๋ค. ๋ ์ผ์ด๋ก "jede Woche"์ "jeden Monat"์ ๋๋ค. "n"์ ์ฃผ๋ชฉํ์ญ์์ค. "๋ชจ๋ "์ ๋ฒ์ญํ ์๋ ์์ต๋๋ค. ์๋ํ์ง ์์ต๋๋ค.
gettext์ "st" ๋๋ "rd"๋ฅผ ์ ๋ฌํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค. ์๋ฌด ์๋ฏธ๊ฐ ์์ต๋๋ค.
์์์ด๋ ๊ณํ์ด ์๋์? ์ด์ DTSTART
๋ฐ UNTIL
์ฌ์ฉํ๊ธฐ ์์ํ์ผ๋ฏ๋ก ๋ ์ด์ toText
๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ์ ์๋ ํ์ฌ ๊ตฌํ์ ํดํนํ ์ ์์์ต๋๋ค.
๋ชฉ๋ก์ ๋ํ ํ ๊ฐ์ง ๋: ๋ ์ง ํ์. ๋๋ DD.MM.YYYY
๊ฐ ์๋๋ผ MMMM DD, YYYY
์ํฉ๋๋ค.
์ดํด๊ฐ ์ ๋ผ์. ํ๋์ html ํ์ผ์๋ ์ต์ ๋ฆด๋ฆฌ์ค(2.0)๊ฐ ํฌํจ๋ ์ด ์ฝ๋๊ฐ ์์ต๋๋ค.
[์ํธ]
[/์ํธ]
๋ค์ ์ค๋ฅ์ ํจ๊ป ์๋ํ์ง ์์ต๋๋ค.
TypeError: _์ด(๊ฐ) ์ ์๋์ง ์์์ต๋๋ค.
var ๊ธฐ๋ณธ๊ฐ = _.clone(RRule.DEFAULT_OPTIONS);
463ํ์ ๊ท์น์์.
๋ด๊ฐ ์๋ชปํ ๋ถ๋ถ์ ๋ฌด์์ ๋๊น?
underscorejs๋ผ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋๋ ์ ํ๋ฅผ ๋ฐ๊ณ ์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ด๊ฐ ๋น์ ์๊ฒ ๋งํฌ๋ฅผ ์ฃผ์์ ๊ฒ์ด๋ค.
2013๋ 10์ 30์ผ ์คํ 11์ 54๋ถ์ elecoest [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ดํด๊ฐ ์ ๋ผ์. ํ๋์ html ํ์ผ์๋ ์ต์ ๋ฆด๋ฆฌ์ค(2.0)๊ฐ ํฌํจ๋ ์ด ์ฝ๋๊ฐ ์์ต๋๋ค.
๋ฌด์ญ ํ
์คํธ
์ค๋ฅ์ ํจ๊ป ์๋ํ์ง ์์ต๋๋ค.
TypeError: _์ด(๊ฐ) ์ ์๋์ง ์์์ต๋๋ค.
var ๊ธฐ๋ณธ๊ฐ = .clone(RRule.DEFAULTOPTIONS);
463ํ์ ๊ท์น์์.
๋ด๊ฐ ์๋ชปํ ๋ถ๋ถ์ ๋ฌด์์ ๋๊น?
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
์ข์, ์ธ ๋ฒ์งธ ์์น์ undesrcore.js๋ฅผ ๋ฐฐ์นํ์ต๋๋ค...
๋๋ underscore.js๋ฅผ ์ฒซ ๋ฒ์งธ ์์น์ ๋ฐฐ์นํ์ต๋๋ค.
์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
TypeError: 2๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค.
return result.call(this, func.apply(_, args));
underscore.js์์
์ฃ์กํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ด ๋ชจ๋ ์ ์ฒด์ ์ ํฉํฉ๋๊น?
์๋ฌด๋ ์ ์์ด ์ค๋ฅ๊ฐ ์์ต๋๊น?
๋์ ์ฃผ์ ์ ์ ๋ง๋ก ๊ณ ๋ง์ต๋๋ค.
์ค๋ ๋งค๊ฐ๋ณ์์ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?
ํ์ฌ๋ก์๋ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ
null
์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.์ด๋ค ๊ฐ์ด gettext์ ์ ๋ฌ๋ฉ๋๊น?
์ค์ ๋ก ์ด๋ป๊ฒ ๋ฒ์ญํฉ๋๊น? ๋๋ dayNames ๋ฐ monthNames๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง ์ด๋ ๊ทธ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค.API๋ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค.
๋ ์ง ๊ด๋ จ ํญ๋ชฉ์ผ๋ก ์ธ์ด ์ ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ ์์ด๋ ์ฌ๊ธฐ์ ์์ต๋๋ค .
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: API๋ฅผ ๊ฐ์ ํ๊ณ ๋ฌธ์ํํฉ๋๋ค(
Language
ํด๋์ค๊ฐ ์ข์ ๊ฒ์ ๋๋ค).
์๋ ํ์ธ์, ๋ ์ผ์ด์ฉ i18n์ ๊ตฌํ๋ ค๊ณ ํ๋๋ฐ ๋งํฌ๊ฐ ๋์ด์ ธ "gettext"์ ์ฌ์ฉ๋ ๋ฌธ์์ด์ ์ฐพ์ ์ ์์ต๋๋ค. ์ถ์ฒ๋ฅผ ์ฐพ์๋ณด๋ ค๊ณ ํ์ง๋ง ๋ญ๋ ์ง ์ฐพ์ ์ ์์์ต๋๋ค.
๊ฐ์ฌ ํด์!
์ค๋ ๋งค๊ฐ๋ณ์์ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?
ํ์ฌ๋ก์๋ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ
null
์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.์ด๋ค ๊ฐ์ด gettext์ ์ ๋ฌ๋ฉ๋๊น?
์ค์ ๋ก ์ด๋ป๊ฒ ๋ฒ์ญํฉ๋๊น? ๋๋ dayNames ๋ฐ monthNames๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง ์ด๋ ๊ทธ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค.API๋ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค.
๋ ์ง ๊ด๋ จ ํญ๋ชฉ์ผ๋ก ์ธ์ด ์ ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ ์์ด๋ ์ฌ๊ธฐ์ ์์ต๋๋ค .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: API๋ฅผ ๊ฐ์ ํ๊ณ ๋ฌธ์ํํฉ๋๋ค(
Language
ํด๋์ค๊ฐ ์ข์ ๊ฒ์ ๋๋ค).์๋ ํ์ธ์, ๋ ์ผ์ด์ฉ i18n์ ๊ตฌํ๋ ค๊ณ ํ๋๋ฐ ๋งํฌ๊ฐ ๋์ด์ ธ "gettext"์ ์ฌ์ฉ๋ ๋ฌธ์์ด์ ์ฐพ์ ์ ์์ต๋๋ค. ์ถ์ฒ๋ฅผ ์ฐพ์๋ณด๋ ค๊ณ ํ์ง๋ง ๋ญ๋ ์ง ์ฐพ์ ์ ์์์ต๋๋ค.
๊ฐ์ฌ ํด์!
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋ ์ผ์ด๋ก ๋ฒ์ญํ์ง๋ง ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.
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 ๊ฐ์ฌํฉ๋๋ค.
๊ทํ์ ์๋ฅผ ํตํด ์๋์ ๊ฐ์ด moment.js ๋ฐ 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)
)
: "";
};
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ผ๋ณธ์ด๋ก ๋ฒ์ญํด์ผ ํฉ๋๋ค. ๋จ์ด ์์๊ฐ ํ์ฐํ ๋ฌ๋ผ์ ์ด๋ป๊ฒ ์งํํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค์...
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ํ ์คํธ๋ฅผ ๋ค๋ฅธ ์ธ์ด๋ก ๋ฒ์ญํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?