Multilanguage: Deutsch / English, umschaltbar in Einstellungen
- i18n.js: Übersetzungsmodul mit t(), setLang(), applyLang() + vollst. DE/EN Wörterbuch - Backend: language-Feld in UserSettings, Migration, Settings-API - calendar.js: alle deutschen Strings auf t()-Aufrufe umgestellt, setLang() beim Start - app.js, api.js, color-picker.js, views/*.js: alle UI-Strings übersetzt - Sprach-Dropdown in Einstellungen > Darstellung, data-i18n-Attribute in index.html
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
import { isPast } from '../utils.js';
|
||||
|
||||
const DOW = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'];
|
||||
const MON = ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
|
||||
import { t, getLang } from '../i18n.js';
|
||||
|
||||
export function renderAgenda(container, currentDate, events, onEventClick) {
|
||||
if (!events.length) {
|
||||
container.innerHTML = `<div class="agenda-view"><div class="agenda-empty">Keine Termine im angezeigten Zeitraum</div></div>`;
|
||||
container.innerHTML = `<div class="agenda-view"><div class="agenda-empty">${t('no_events')}</div></div>`;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -35,7 +33,7 @@ export function renderAgenda(container, currentDate, events, onEventClick) {
|
||||
.map(ev => {
|
||||
const color = ev.color || ev.calendarColor || '#4285f4';
|
||||
const pastCls = isPast(ev) ? 'past' : '';
|
||||
let timeStr = 'Ganztägig';
|
||||
let timeStr = t('allday_cap');
|
||||
if (!ev.allDay) {
|
||||
const s = new Date(ev.start);
|
||||
const e = new Date(ev.end);
|
||||
@@ -57,8 +55,8 @@ export function renderAgenda(container, currentDate, events, onEventClick) {
|
||||
<div class="agenda-date ${todayCls}">
|
||||
<div class="agenda-date-num">${date.getDate()}</div>
|
||||
<div class="agenda-date-label">
|
||||
<span class="wd">${DOW[date.getDay()]}</span>
|
||||
<span class="mo">${MON[date.getMonth()]} ${date.getFullYear()}</span>
|
||||
<span class="wd">${t('days_long')[date.getDay()]}</span>
|
||||
<span class="mo">${t('months_short')[date.getMonth()]} ${date.getFullYear()}</span>
|
||||
</div>
|
||||
</div>
|
||||
${evHtml}
|
||||
@@ -83,7 +81,7 @@ function isTodayDate(d) {
|
||||
}
|
||||
|
||||
function fmtTime(d) {
|
||||
return d.toLocaleTimeString('de', { hour: '2-digit', minute: '2-digit' });
|
||||
return d.toLocaleTimeString(getLang(), { hour: '2-digit', minute: '2-digit' });
|
||||
}
|
||||
|
||||
function escHtml(s) {
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import { formatDate, isSameDay, isToday, isPast, dayOfWeek, getISOWeekNumber } from '../utils.js';
|
||||
|
||||
const DOW_MONDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
|
||||
const DOW_SUNDAY = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'];
|
||||
import { t } from '../i18n.js';
|
||||
|
||||
export function renderMonth(container, currentDate, events, onDayClick, onEventClick, weekStartDay = 'monday') {
|
||||
const year = currentDate.getFullYear();
|
||||
const month = currentDate.getMonth();
|
||||
const DOW = weekStartDay === 'sunday' ? DOW_SUNDAY : DOW_MONDAY;
|
||||
const DOW = weekStartDay === 'sunday' ? t('dow_sunday') : t('dow_monday');
|
||||
|
||||
const firstDay = new Date(year, month, 1);
|
||||
const lastDay = new Date(year, month + 1, 0);
|
||||
@@ -82,7 +80,7 @@ export function renderMonth(container, currentDate, events, onDayClick, onEventC
|
||||
}).join('');
|
||||
|
||||
const moreHtml = hiddenCount > 0
|
||||
? `<div class="month-more" data-date="${key}">+${hiddenCount} weitere</div>`
|
||||
? `<div class="month-more" data-date="${key}">${t('more_events', {n: hiddenCount})}</div>`
|
||||
: '';
|
||||
|
||||
cellsHtml += `<div class="month-cell ${todayClass} ${otherClass}" data-date="${key}">
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { isToday, isPast, dayOfWeek, weekStart, getISOWeekNumber } from '../utils.js';
|
||||
|
||||
const DOW_SHORT = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'];
|
||||
import { t } from '../i18n.js';
|
||||
|
||||
export function renderWeek(container, currentDate, events, onSlotClick, onEventClick, isSingleDay = false, weekStartDay = 'monday', hourH = 60) {
|
||||
// Build the days array (7 days for week, 1 for day)
|
||||
@@ -23,14 +22,14 @@ export function renderWeek(container, currentDate, events, onSlotClick, onEventC
|
||||
// ── KW Badge ──────────────────────────────────────────
|
||||
const kwNum = getISOWeekNumber(days[0]);
|
||||
const kwBadge = !isSingleDay
|
||||
? `<div class="week-kw-badge">KW ${kwNum}</div>`
|
||||
? `<div class="week-kw-badge">${t('week_abbr')} ${kwNum}</div>`
|
||||
: '';
|
||||
|
||||
// ── Header ────────────────────────────────────────────
|
||||
const headerCols = days.map(day => {
|
||||
const todayCls = isToday(day) ? 'today' : '';
|
||||
return `<div class="week-day-header ${todayCls}" data-date="${dayKey(day)}">
|
||||
<div class="day-name">${DOW_SHORT[day.getDay()]}</div>
|
||||
<div class="day-name">${t('dow_index')[day.getDay()]}</div>
|
||||
<div class="day-num">${day.getDate()}</div>
|
||||
</div>`;
|
||||
}).join('');
|
||||
@@ -105,7 +104,7 @@ export function renderWeek(container, currentDate, events, onSlotClick, onEventC
|
||||
${headerCols}
|
||||
</div>
|
||||
<div class="week-allday-row">
|
||||
<div class="allday-gutter">ganztägig</div>
|
||||
<div class="allday-gutter">${t('allday')}</div>
|
||||
<div class="allday-cols">${alldayCols}</div>
|
||||
</div>
|
||||
<div class="week-body">
|
||||
|
||||
Reference in New Issue
Block a user