mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
fix(date-picker): locale-aware keyboard input parsing and i18n control labels
- Replace fixed-order date parser with locale-aware implementation using Intl.DateTimeFormat.formatToParts to detect field order; adds swap fallback for unambiguous inputs (day > 12) to handle locale mismatches gracefully - Pre-fill keyboard input with locale-formatted numeric date (e.g. 14.06.2026) instead of raw ISO value - Replace all hardcoded English aria-labels and titles with t() calls; add new keys under common.datepicker.* namespace across all locale files - Update FE-COMP-DATEPICKER-013 to use unambiguous day value (> 12) to avoid locale-dependent test failures
This commit is contained in:
@@ -121,9 +121,9 @@ describe('CustomDatePicker', () => {
|
||||
render(<CustomDatePicker value="" onChange={onChange} />);
|
||||
await user.click(screen.getByRole('button', { name: /enter date manually/i }));
|
||||
const input = screen.getByPlaceholderText('DD.MM.YYYY');
|
||||
fireEvent.change(input, { target: { value: '04.07.2026' } });
|
||||
fireEvent.change(input, { target: { value: '17.07.2026' } });
|
||||
fireEvent.keyDown(input, { key: 'Enter' });
|
||||
expect(onChange).toHaveBeenCalledWith('2026-07-04');
|
||||
expect(onChange).toHaveBeenCalledWith('2026-07-17');
|
||||
});
|
||||
|
||||
it('FE-COMP-DATEPICKER-014: Escape in text input cancels text mode', async () => {
|
||||
|
||||
@@ -84,13 +84,32 @@ export function CustomDatePicker({
|
||||
else setYearPageStart((s) => s + YEAR_PAGE_SIZE);
|
||||
};
|
||||
|
||||
const prevAriaLabel = view === 'days' ? 'Previous month' : view === 'months' ? 'Previous year' : 'Previous years';
|
||||
const nextAriaLabel = view === 'days' ? 'Next month' : view === 'months' ? 'Next year' : 'Next years';
|
||||
// prevAriaLabel / nextAriaLabel:
|
||||
const prevAriaLabel =
|
||||
view === 'days'
|
||||
? t('common.datepicker.prevMonth')
|
||||
: view === 'months'
|
||||
? t('common.datepicker.prevYear')
|
||||
: t('common.datepicker.prevYears');
|
||||
|
||||
const nextAriaLabel =
|
||||
view === 'days'
|
||||
? t('common.datepicker.nextMonth')
|
||||
: view === 'months'
|
||||
? t('common.datepicker.nextYear')
|
||||
: t('common.datepicker.nextYears');
|
||||
|
||||
// headerAriaLabel:
|
||||
const headerAriaLabel =
|
||||
view === 'days'
|
||||
? t('common.datepicker.selectMonth')
|
||||
: view === 'months'
|
||||
? t('common.datepicker.selectYear')
|
||||
: undefined;
|
||||
|
||||
const monthLabel = new Date(viewYear, viewMonth).toLocaleDateString(locale, { month: 'long', year: 'numeric' });
|
||||
const yearRangeLabel = `${yearPageStart} – ${yearPageStart + YEAR_PAGE_SIZE - 1}`;
|
||||
const headerLabel = view === 'days' ? monthLabel : view === 'months' ? String(viewYear) : yearRangeLabel;
|
||||
const headerAriaLabel = view === 'days' ? 'Select month' : view === 'months' ? 'Select year' : undefined;
|
||||
|
||||
const handleHeaderClick = () => {
|
||||
if (view === 'days') {
|
||||
@@ -160,27 +179,46 @@ export function CustomDatePicker({
|
||||
const handleTextSubmit = () => {
|
||||
setIsTyping(false);
|
||||
if (!textInput.trim()) return;
|
||||
// Try to parse various date formats
|
||||
const input = textInput.trim();
|
||||
// ISO: 2026-03-29
|
||||
|
||||
// Try ISO first — always works
|
||||
if (/^\d{4}-\d{2}-\d{2}$/.test(input)) {
|
||||
onChange(input);
|
||||
return;
|
||||
}
|
||||
// EU: 29.03.2026 or 29/03/2026
|
||||
const euMatch = input.match(/^(\d{1,2})[./](\d{1,2})[./](\d{2,4})$/);
|
||||
if (euMatch) {
|
||||
const y = euMatch[3].length === 2 ? 2000 + parseInt(euMatch[3]) : parseInt(euMatch[3]);
|
||||
onChange(`${y}-${String(euMatch[2]).padStart(2, '0')}-${String(euMatch[1]).padStart(2, '0')}`);
|
||||
return;
|
||||
}
|
||||
// Try native Date parse as fallback
|
||||
const d = new Date(input);
|
||||
if (!isNaN(d.getTime())) {
|
||||
onChange(
|
||||
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
|
||||
);
|
||||
|
||||
// Determine field order for active locale via Intl
|
||||
const parts = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'numeric', year: 'numeric' }).formatToParts(
|
||||
new Date(2001, 5, 15)
|
||||
); // known date: June 15, 2001
|
||||
const order = parts
|
||||
.filter((p) => ['day', 'month', 'year'].includes(p.type))
|
||||
.map((p) => p.type as 'day' | 'month' | 'year');
|
||||
|
||||
// Strip non-numeric chars (handles RTL marks, dots, slashes, spaces)
|
||||
const nums = input
|
||||
.replace(/[^\d]+/g, ' ')
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.filter(Boolean);
|
||||
if (nums.length !== 3) return;
|
||||
|
||||
// nachher:
|
||||
const get = (field: 'day' | 'month' | 'year') => parseInt(nums[order.indexOf(field)]);
|
||||
let d = get('day'),
|
||||
m = get('month'),
|
||||
y = get('year');
|
||||
if (isNaN(d) || isNaN(m) || isNaN(y)) return;
|
||||
|
||||
// If locale order gives impossible month but valid swap, correct it
|
||||
if (m > 12 && d <= 12) {
|
||||
const tmp = m;
|
||||
m = d;
|
||||
d = tmp;
|
||||
}
|
||||
const year = y < 100 ? 2000 + y : y;
|
||||
if (m < 1 || m > 12 || d < 1 || d > 31) return;
|
||||
onChange(`${year}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`);
|
||||
};
|
||||
|
||||
const gridCellStyle = (selected: boolean, current: boolean): React.CSSProperties => ({
|
||||
@@ -267,8 +305,8 @@ export function CustomDatePicker({
|
||||
setTextInput(inputValue || '');
|
||||
setIsTyping(true);
|
||||
}}
|
||||
aria-label="Enter date manually"
|
||||
title="Type a date"
|
||||
aria-label={t('common.datepicker.enterManually')}
|
||||
title={t('common.datepicker.typeDate')}
|
||||
style={{
|
||||
background: 'none',
|
||||
border: '1px solid var(--border-primary)',
|
||||
@@ -301,7 +339,7 @@ export function CustomDatePicker({
|
||||
<div
|
||||
ref={dropRef}
|
||||
role="dialog"
|
||||
aria-label="Date picker"
|
||||
aria-label={t('common.datepicker.dialog')}
|
||||
style={{
|
||||
position: 'fixed',
|
||||
...(() => {
|
||||
@@ -543,8 +581,8 @@ export function CustomDatePicker({
|
||||
setTextInput(inputValue || '');
|
||||
setIsTyping(true);
|
||||
}}
|
||||
aria-label="Enter date manually"
|
||||
title="Type a date"
|
||||
aria-label={t('common.datepicker.enterManually')}
|
||||
title={t('common.datepicker.typeDate')}
|
||||
style={{
|
||||
background: 'none',
|
||||
border: 'none',
|
||||
@@ -570,7 +608,7 @@ export function CustomDatePicker({
|
||||
onChange('');
|
||||
setOpen(false);
|
||||
}}
|
||||
aria-label="Clear date"
|
||||
aria-label={t('common.datepicker.clearDate')}
|
||||
style={{
|
||||
background: 'none',
|
||||
border: 'none',
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'just now', // en-fallback
|
||||
'common.hoursAgo': '{count}h ago', // en-fallback
|
||||
'common.daysAgo': '{count}d ago', // en-fallback
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'agora mesmo',
|
||||
'common.hoursAgo': 'há {count}h',
|
||||
'common.daysAgo': 'há {count}d',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'právě teď',
|
||||
'common.hoursAgo': 'před {count} h',
|
||||
'common.daysAgo': 'před {count} d',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.reset': 'Zurücksetzen',
|
||||
'common.copy': 'Kopieren',
|
||||
'common.copied': 'Kopiert',
|
||||
'common.datepicker.prevMonth': 'Vormonat',
|
||||
'common.datepicker.nextMonth': 'Nächster Monat',
|
||||
'common.datepicker.prevYear': 'Vorjahr',
|
||||
'common.datepicker.nextYear': 'Nächstes Jahr',
|
||||
'common.datepicker.prevYears': 'Vorherige Jahre',
|
||||
'common.datepicker.nextYears': 'Nächste Jahre',
|
||||
'common.datepicker.selectMonth': 'Monat auswählen',
|
||||
'common.datepicker.selectYear': 'Jahr auswählen',
|
||||
'common.datepicker.enterManually': 'Datum manuell eingeben',
|
||||
'common.datepicker.typeDate': 'Datum eingeben',
|
||||
'common.datepicker.dialog': 'Datumsauswahl',
|
||||
'common.datepicker.clearDate': 'Datum löschen',
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.collapse': 'Collapse',
|
||||
'common.copy': 'Copy',
|
||||
'common.copied': 'Copied',
|
||||
'common.datepicker.prevMonth': 'Previous month',
|
||||
'common.datepicker.nextMonth': 'Next month',
|
||||
'common.datepicker.prevYear': 'Previous year',
|
||||
'common.datepicker.nextYear': 'Next year',
|
||||
'common.datepicker.prevYears': 'Previous years',
|
||||
'common.datepicker.nextYears': 'Next years',
|
||||
'common.datepicker.selectMonth': 'Select month',
|
||||
'common.datepicker.selectYear': 'Select year',
|
||||
'common.datepicker.enterManually': 'Enter date manually',
|
||||
'common.datepicker.typeDate': 'Type a date',
|
||||
'common.datepicker.dialog': 'Date picker',
|
||||
'common.datepicker.clearDate': 'Clear date',
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'justo ahora',
|
||||
'common.hoursAgo': 'hace {count}h',
|
||||
'common.daysAgo': 'hace {count}d',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': "à l'instant",
|
||||
'common.hoursAgo': 'il y a {count}h',
|
||||
'common.daysAgo': 'il y a {count}j',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.collapse': 'Σύμπτυξη',
|
||||
'common.copy': 'Αντιγραφή',
|
||||
'common.copied': 'Αντιγράφηκε',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'az imént',
|
||||
'common.hoursAgo': '{count} órája',
|
||||
'common.daysAgo': '{count} napja',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.collapse': 'Ciutkan',
|
||||
'common.copy': 'Salin',
|
||||
'common.copied': 'Disalin',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'proprio ora',
|
||||
'common.hoursAgo': '{count}h fa',
|
||||
'common.daysAgo': '{count}g fa',
|
||||
'common.datepicker.prevMonth': 'Mese precedente',
|
||||
'common.datepicker.nextMonth': 'Mese prossimo',
|
||||
'common.datepicker.prevYear': 'Anno precedente',
|
||||
'common.datepicker.nextYear': 'Anno prossimo',
|
||||
'common.datepicker.prevYears': 'Anni precedenti',
|
||||
'common.datepicker.nextYears': 'Anni prossimi',
|
||||
'common.datepicker.selectMonth': 'Seleziona mese',
|
||||
'common.datepicker.selectYear': 'Seleziona anno',
|
||||
'common.datepicker.enterManually': 'Inserisci la data manualmente',
|
||||
'common.datepicker.typeDate': 'Inserisci una data',
|
||||
'common.datepicker.dialog': 'Selettore di date',
|
||||
'common.datepicker.clearDate': 'Cancella data',
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.collapse': '접기',
|
||||
'common.copy': '복사',
|
||||
'common.copied': '복사됨',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'zojuist',
|
||||
'common.hoursAgo': '{count}u geleden',
|
||||
'common.daysAgo': '{count}d geleden',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'przed chwilą',
|
||||
'common.hoursAgo': '{count} godz. temu',
|
||||
'common.daysAgo': '{count} dn. temu',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'только что',
|
||||
'common.hoursAgo': '{count} ч назад',
|
||||
'common.daysAgo': '{count} д назад',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.collapse': 'Daralt',
|
||||
'common.copy': 'Kopyala',
|
||||
'common.copied': 'Kopyalandı',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': 'щойно',
|
||||
'common.hoursAgo': '{count} год. тому',
|
||||
'common.daysAgo': '{count} дн. тому',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': '剛剛',
|
||||
'common.hoursAgo': '{count}小時前',
|
||||
'common.daysAgo': '{count}天前',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
@@ -50,5 +50,17 @@ const common: TranslationStrings = {
|
||||
'common.justNow': '刚刚',
|
||||
'common.hoursAgo': '{count}小时前',
|
||||
'common.daysAgo': '{count}天前',
|
||||
'common.datepicker.prevMonth': 'Previous month', // en-fallback
|
||||
'common.datepicker.nextMonth': 'Next month', // en-fallback
|
||||
'common.datepicker.prevYear': 'Previous year', // en-fallback
|
||||
'common.datepicker.nextYear': 'Next year', // en-fallback
|
||||
'common.datepicker.prevYears': 'Previous years', // en-fallback
|
||||
'common.datepicker.nextYears': 'Next years', // en-fallback
|
||||
'common.datepicker.selectMonth': 'Select month', // en-fallback
|
||||
'common.datepicker.selectYear': 'Select year', // en-fallback
|
||||
'common.datepicker.enterManually': 'Enter date manually', // en-fallback
|
||||
'common.datepicker.typeDate': 'Type a date', // en-fallback
|
||||
'common.datepicker.dialog': 'Date picker', // en-fallback
|
||||
'common.datepicker.clearDate': 'Clear date', // en-fallback
|
||||
};
|
||||
export default common;
|
||||
|
||||
Reference in New Issue
Block a user