This commit is contained in:
the-djmaze 2022-12-12 13:03:41 +01:00
parent c27e231f53
commit d0db7f5ce3
47 changed files with 95 additions and 18 deletions

View file

@ -4,6 +4,7 @@ import { langLink } from 'Common/Links';
import { doc, createElement } from 'Common/Globals'; import { doc, createElement } from 'Common/Globals';
import { getKeyByValue, forEachObjectEntry } from 'Common/Utils'; import { getKeyByValue, forEachObjectEntry } from 'Common/Utils';
import { pInt } from 'Common/Utils'; import { pInt } from 'Common/Utils';
import { LanguageStore } from 'Stores/Language';
let I18N_DATA = {}; let I18N_DATA = {};
@ -87,17 +88,17 @@ export const
const mt = m.getTime(), date = new Date, const mt = m.getTime(), date = new Date,
dt = date.setHours(0,0,0,0); dt = date.setHours(0,0,0,0);
if (mt > dt) if (mt > dt)
return i18n('MESSAGE_LIST/TODAY_AT', {TIME: m.format('LT')}); return i18n('MESSAGE_LIST/TODAY_AT', {TIME: m.format('LT',0,LanguageStore.hourCycle())});
if (mt > dt - 86400000) if (mt > dt - 86400000)
return i18n('MESSAGE_LIST/YESTERDAY_AT', {TIME: m.format('LT')}); return i18n('MESSAGE_LIST/YESTERDAY_AT', {TIME: m.format('LT',0,LanguageStore.hourCycle())});
if (date.getFullYear() === m.getFullYear()) if (date.getFullYear() === m.getFullYear())
return m.format('d M'); return m.format('d M');
return m.format('LL'); return m.format('LL',0,LanguageStore.hourCycle());
} }
case 'FULL': case 'FULL':
return m.format('LLL'); return m.format('LLL',0,LanguageStore.hourCycle());
default: default:
return m.format(formatStr); return m.format(formatStr,0,LanguageStore.hourCycle());
} }
} }

View file

@ -19,6 +19,8 @@ import { AbstractModel } from 'Knoin/AbstractModel';
import PreviewHTML from 'Html/PreviewMessage.html'; import PreviewHTML from 'Html/PreviewMessage.html';
import { LanguageStore } from 'Stores/Language';
//import { MessageFlagsCache } from 'Common/Cache'; //import { MessageFlagsCache } from 'Common/Cache';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -456,7 +458,7 @@ export class MessageModel extends AbstractModel {
sdoc.write(PreviewHTML sdoc.write(PreviewHTML
.replace('<title>', '<title>'+subject) .replace('<title>', '<title>'+subject)
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
.replace('<body>', `<body style="background-color:${prop('background-color')};color:${prop('color')}"><header><h1>${subject}</h1><time>${encodeHtml(m ? m.format('LLL') : '')}</time><div>${encodeHtml(this.fromToLine())}</div><div>${encodeHtml(i18n('GLOBAL/TO'))}: ${encodeHtml(this.toToLine())}</div>${cc}</header><${mode}>${this.bodyAsHTML()}</${mode}>`) .replace('<body>', `<body style="background-color:${prop('background-color')};color:${prop('color')}"><header><h1>${subject}</h1><time>${encodeHtml(m ? m.format('LLL',0,LanguageStore.hourCycle()) : '')}</time><div>${encodeHtml(this.fromToLine())}</div><div>${encodeHtml(i18n('GLOBAL/TO'))}: ${encodeHtml(this.toToLine())}</div>${cc}</header><${mode}>${this.bodyAsHTML()}</${mode}>`)
); );
sdoc.close(); sdoc.close();

View file

@ -30,6 +30,7 @@ export class UserSettingsGeneral extends AbstractViewSettings {
this.language = LanguageStore.language; this.language = LanguageStore.language;
this.languages = LanguageStore.languages; this.languages = LanguageStore.languages;
this.hourCycle = LanguageStore.hourCycle;
this.soundNotification = SMAudio.notifications; this.soundNotification = SMAudio.notifications;
this.notificationSound = ko.observable(SettingsGet('NotificationSound')); this.notificationSound = ko.observable(SettingsGet('NotificationSound'));
@ -115,6 +116,9 @@ export class UserSettingsGeneral extends AbstractViewSettings {
.then(() => Remote.saveSetting('Language', value)); .then(() => Remote.saveSetting('Language', value));
}, },
hourCycle: value =>
Remote.saveSetting('hourCycle', value),
removeColors: value => { removeColors: value => {
let dom = MessageUserStore.bodiesDom(); let dom = MessageUserStore.bodiesDom();
if (dom) { if (dom) {

View file

@ -6,11 +6,13 @@ export const LanguageStore = {
language: ko.observable(''), language: ko.observable(''),
languages: ko.observableArray(), languages: ko.observableArray(),
userLanguage: ko.observable(''), userLanguage: ko.observable(''),
hourCycle: ko.observable(''),
populate: function() { populate: function() {
const aLanguages = Settings.app('languages'); const aLanguages = Settings.app('languages');
this.languages(isArray(aLanguages) ? aLanguages : []); this.languages(isArray(aLanguages) ? aLanguages : []);
this.language(SettingsGet('Language')); this.language(SettingsGet('Language'));
this.userLanguage(SettingsGet('UserLanguage')); this.userLanguage(SettingsGet('UserLanguage'));
this.hourCycle(SettingsGet('hourCycle'));
} }
} }

33
dev/prototype.js vendored
View file

@ -7,12 +7,20 @@
Date.defineRelativeTimeFormat = config => relativeTime = config; Date.defineRelativeTimeFormat = config => relativeTime = config;
// full = Monday, December 12, 2022 at 12:16:21 PM Central European Standard Time
// long = December 12, 2022 at 12:16:21 PM GMT+1
// medium = Dec 12, 2022, 12:16:21 PM
// short = 12/12/22, 12:16 PM
let formats = { let formats = {
LT : {hour: 'numeric', minute: 'numeric'}, LT : {timeStyle: 'short'},
// LT : {hour: 'numeric', minute: 'numeric'},
L : {}, L : {},
LL : {year: 'numeric', month: 'short', day: 'numeric'}, LL : {dateStyle: 'medium'},
LLL : {year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}, // LL : {year: 'numeric', month: 'short', day: 'numeric'},
LLLL : {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}, LLL : {dateStyle: 'long', timeStyle: 'short'},
// LLL : {year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'},
LLLL : {dateStyle: 'full', timeStyle: 'short'},
// LLLL : {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'},
'd M': {day: '2-digit', month: 'short'} 'd M': {day: '2-digit', month: 'short'}
}, },
phpFormats = { phpFormats = {
@ -31,11 +39,15 @@
y: {year: '2-digit'}, y: {year: '2-digit'},
// Time // Time
A: {hour12: true}, A: {hour12: true},
G: {hour: 'numeric'}, // A: {hourCycle: 'h12'}, // h11, h12, h23, h24
H: {hour: '2-digit'}, g: {hour: 'numeric', hourCycle:'h11'},
G: {hour: 'numeric', hourCycle:'h23'},
h: {hour: '2-digit', hourCycle:'h11'},
H: {hour: '2-digit', hourCycle:'h23'},
i: {minute: '2-digit'}, i: {minute: '2-digit'},
s: {second: '2-digit'}, s: {second: '2-digit'},
u: {fractionalSecondDigits: 3}, u: {fractionalSecondDigits: 6},
v: {fractionalSecondDigits: 3},
Z: {timeZone: 'UTC'} Z: {timeZone: 'UTC'}
}, },
relativeTime = { relativeTime = {
@ -45,7 +57,7 @@
// Format momentjs/PHP date formats to Intl.DateTimeFormat // Format momentjs/PHP date formats to Intl.DateTimeFormat
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat
Date.prototype.format = function (options, UTC) { Date.prototype.format = function (options, UTC, hourCycle) {
if (typeof options == 'string') { if (typeof options == 'string') {
if ('Y-m-d\\TH:i:s' == options) { if ('Y-m-d\\TH:i:s' == options) {
return this.getFullYear() + '-' + pad2(1 + this.getMonth()) + '-' + pad2(this.getDate()) return this.getFullYear() + '-' + pad2(1 + this.getMonth()) + '-' + pad2(this.getDate())
@ -58,12 +70,15 @@
console.log('Date.format('+s+')'); console.log('Date.format('+s+')');
options = {}; options = {};
while (i--) { while (i--) {
o = phpFormats[s[i]] || phpFormats[s[i].toUpperCase()]; o = phpFormats[s[i]];
o && Object.entries(o).forEach(([k,v])=>options[k]=v); o && Object.entries(o).forEach(([k,v])=>options[k]=v);
} }
formats[s] = options; formats[s] = options;
} }
} }
if (hourCycle) {
options.hourCycle = hourCycle;
}
return new Intl.DateTimeFormat(doc.documentElement.lang, options).format(this); return new Intl.DateTimeFormat(doc.documentElement.lang, options).format(this);
}; };

View file

@ -778,6 +778,8 @@ class Actions
if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) { if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) {
$sLanguage = (string) $oSettings->GetConf('Language', $sLanguage); $sLanguage = (string) $oSettings->GetConf('Language', $sLanguage);
} }
$aResult['hourCycle'] = $oSettings->GetConf('hourCycle', '');
if (!$oSettings->GetConf('MessagesPerPage')) { if (!$oSettings->GetConf('MessagesPerPage')) {
$oSettings->SetConf('MessagesPerPage', $oSettings->GetConf('MPP', $aResult['MessagesPerPage'])); $oSettings->SetConf('MessagesPerPage', $oSettings->GetConf('MPP', $aResult['MessagesPerPage']));
} }

View file

@ -162,6 +162,7 @@ trait User
{ {
// $oSettings->SetConf('Language', $this->ValidateLanguage($oConfig->Get('webmail', 'language', 'en'))); // $oSettings->SetConf('Language', $this->ValidateLanguage($oConfig->Get('webmail', 'language', 'en')));
} }
$this->setSettingsFromParams($oSettings, 'hourCycle', 'string');
if ($this->GetCapa(Capa::THEMES)) if ($this->GetCapa(Capa::THEMES))
{ {

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "عام", "LEGEND_GENERAL": "عام",
"LANGUAGE": "اللغة", "LANGUAGE": "اللغة",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "الهوية", "IDENTITY": "الهوية",
"LAYOUT": "التصميم", "LAYOUT": "التصميم",
"LAYOUT_NO_SPLIT": "بدون إنقسام", "LAYOUT_NO_SPLIT": "بدون إنقسام",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Общи", "LEGEND_GENERAL": "Общи",
"LANGUAGE": "Език", "LANGUAGE": "Език",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Идентичност", "IDENTITY": "Идентичност",
"LAYOUT": "Стил", "LAYOUT": "Стил",
"LAYOUT_NO_SPLIT": "Не разделяй", "LAYOUT_NO_SPLIT": "Не разделяй",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Všeobecné", "LEGEND_GENERAL": "Všeobecné",
"LANGUAGE": "Jazyk", "LANGUAGE": "Jazyk",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Uživatel", "IDENTITY": "Uživatel",
"LAYOUT": "Rozložení", "LAYOUT": "Rozložení",
"LAYOUT_NO_SPLIT": "Nerozdělovat", "LAYOUT_NO_SPLIT": "Nerozdělovat",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Generelt", "LEGEND_GENERAL": "Generelt",
"LANGUAGE": "Sprog", "LANGUAGE": "Sprog",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identitet", "IDENTITY": "Identitet",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "Del ikke", "LAYOUT_NO_SPLIT": "Del ikke",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Allgemein", "LEGEND_GENERAL": "Allgemein",
"LANGUAGE": "Sprache", "LANGUAGE": "Sprache",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identität", "IDENTITY": "Identität",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "Keine Aufteilung", "LAYOUT_NO_SPLIT": "Keine Aufteilung",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Γενικό", "LEGEND_GENERAL": "Γενικό",
"LANGUAGE": "Γλώσσα", "LANGUAGE": "Γλώσσα",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Ταυτότητα", "IDENTITY": "Ταυτότητα",
"LAYOUT": "Σχέδιο", "LAYOUT": "Σχέδιο",
"LAYOUT_NO_SPLIT": "Χωρίς χώρισμα", "LAYOUT_NO_SPLIT": "Χωρίς χώρισμα",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "General", "LEGEND_GENERAL": "General",
"LANGUAGE": "Language", "LANGUAGE": "Language",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "General", "LEGEND_GENERAL": "General",
"LANGUAGE": "Language", "LANGUAGE": "Language",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "General", "LEGEND_GENERAL": "General",
"LANGUAGE": "Idioma", "LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identidad", "IDENTITY": "Identidad",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "Sin División", "LAYOUT_NO_SPLIT": "Sin División",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Üldine", "LEGEND_GENERAL": "Üldine",
"LANGUAGE": "Keel", "LANGUAGE": "Keel",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identiteet", "IDENTITY": "Identiteet",
"LAYOUT": "Vaade", "LAYOUT": "Vaade",
"LAYOUT_NO_SPLIT": "Jaotuseta", "LAYOUT_NO_SPLIT": "Jaotuseta",

View file

@ -104,7 +104,7 @@
"LABEL_ALL_RIGHTS_RESERVED": "Eskubide guztiak gordeak.", "LABEL_ALL_RIGHTS_RESERVED": "Eskubide guztiak gordeak.",
"HINT_READ_CHANGE_LOG": "Mesedez irakurri aldaketen informea eguneratu aurretik.", "HINT_READ_CHANGE_LOG": "Mesedez irakurri aldaketen informea eguneratu aurretik.",
"HINT_IS_UP_TO_DATE": "SnappyMail eguneratuta dago.", "HINT_IS_UP_TO_DATE": "SnappyMail eguneratuta dago.",
"HTML_NEW_VERSION": "<b>%VERSION%</b> bertsio berria eskuragarri.", "HTML_NEW_VERSION": "<b>%VERSION%<\/b> bertsio berria eskuragarri.",
"LABEL_UPDATING": "Eguneratzen", "LABEL_UPDATING": "Eguneratzen",
"LABEL_CHECKING": "Eguneraketak dauden begiratzen", "LABEL_CHECKING": "Eguneraketak dauden begiratzen",
"BUTTON_RELEASES": "Bertsioak" "BUTTON_RELEASES": "Bertsioak"

View file

@ -259,7 +259,7 @@
"POPUPS_CLEAR_FOLDER": { "POPUPS_CLEAR_FOLDER": {
"TITLE_CLEAR_FOLDER": "Ezabatu karpetako mezu guztiak?", "TITLE_CLEAR_FOLDER": "Ezabatu karpetako mezu guztiak?",
"DANGER_DESC_WARNING": "Kontuz!", "DANGER_DESC_WARNING": "Kontuz!",
"DANGER_DESC_HTML_1": "Ekintza honen bidez <strong>%FOLDER%</strong> karpetako mezu guztiak ezabatuko dira.", "DANGER_DESC_HTML_1": "Ekintza honen bidez <strong>%FOLDER%<\/strong> karpetako mezu guztiak ezabatuko dira.",
"DANGER_DESC_HTML_2": "Behin hasita, ekintza hau ezin da gelditu edo utzi.", "DANGER_DESC_HTML_2": "Behin hasita, ekintza hau ezin da gelditu edo utzi.",
"TITLE_CLEARING_PROCESS": "Karpeta garbitzen..." "TITLE_CLEARING_PROCESS": "Karpeta garbitzen..."
}, },
@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Orokorra", "LEGEND_GENERAL": "Orokorra",
"LANGUAGE": "Hizkuntza", "LANGUAGE": "Hizkuntza",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Nortasuna", "IDENTITY": "Nortasuna",
"LAYOUT": "Diseinua", "LAYOUT": "Diseinua",
"LAYOUT_NO_SPLIT": "Zatitu gabe", "LAYOUT_NO_SPLIT": "Zatitu gabe",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "عمومی", "LEGEND_GENERAL": "عمومی",
"LANGUAGE": "زبان", "LANGUAGE": "زبان",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "شناسه", "IDENTITY": "شناسه",
"LAYOUT": "لایه", "LAYOUT": "لایه",
"LAYOUT_NO_SPLIT": "بدون تقسیم", "LAYOUT_NO_SPLIT": "بدون تقسیم",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Yleiset", "LEGEND_GENERAL": "Yleiset",
"LANGUAGE": "Kieli", "LANGUAGE": "Kieli",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identiteetti", "IDENTITY": "Identiteetti",
"LAYOUT": "Asettelu", "LAYOUT": "Asettelu",
"LAYOUT_NO_SPLIT": "Ei jakoa", "LAYOUT_NO_SPLIT": "Ei jakoa",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Général", "LEGEND_GENERAL": "Général",
"LANGUAGE": "Langue", "LANGUAGE": "Langue",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identité", "IDENTITY": "Identité",
"LAYOUT": "Disposition", "LAYOUT": "Disposition",
"LAYOUT_NO_SPLIT": "Pas de séparation", "LAYOUT_NO_SPLIT": "Pas de séparation",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Általános", "LEGEND_GENERAL": "Általános",
"LANGUAGE": "Nyelv", "LANGUAGE": "Nyelv",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identitás", "IDENTITY": "Identitás",
"LAYOUT": "Elrendezés", "LAYOUT": "Elrendezés",
"LAYOUT_NO_SPLIT": "Felosztás nélkül", "LAYOUT_NO_SPLIT": "Felosztás nélkül",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Umum", "LEGEND_GENERAL": "Umum",
"LANGUAGE": "Bahasa", "LANGUAGE": "Bahasa",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identitas", "IDENTITY": "Identitas",
"LAYOUT": "Tampilan", "LAYOUT": "Tampilan",
"LAYOUT_NO_SPLIT": "Tanpa pemisah", "LAYOUT_NO_SPLIT": "Tanpa pemisah",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Almennt", "LEGEND_GENERAL": "Almennt",
"LANGUAGE": "Tungumál", "LANGUAGE": "Tungumál",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Auðkenni", "IDENTITY": "Auðkenni",
"LAYOUT": "Framsetning", "LAYOUT": "Framsetning",
"LAYOUT_NO_SPLIT": "Ekki klofið", "LAYOUT_NO_SPLIT": "Ekki klofið",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Generali", "LEGEND_GENERAL": "Generali",
"LANGUAGE": "Lingua", "LANGUAGE": "Lingua",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identità", "IDENTITY": "Identità",
"LAYOUT": "Struttura", "LAYOUT": "Struttura",
"LAYOUT_NO_SPLIT": "A pagina intera", "LAYOUT_NO_SPLIT": "A pagina intera",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "全般", "LEGEND_GENERAL": "全般",
"LANGUAGE": "言語", "LANGUAGE": "言語",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "表示名", "IDENTITY": "表示名",
"LAYOUT": "レイアウト", "LAYOUT": "レイアウト",
"LAYOUT_NO_SPLIT": "分割しない", "LAYOUT_NO_SPLIT": "分割しない",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "일반", "LEGEND_GENERAL": "일반",
"LANGUAGE": "언어", "LANGUAGE": "언어",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "신원", "IDENTITY": "신원",
"LAYOUT": "레이아웃", "LAYOUT": "레이아웃",
"LAYOUT_NO_SPLIT": "분할 해제", "LAYOUT_NO_SPLIT": "분할 해제",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Pagrindiniai", "LEGEND_GENERAL": "Pagrindiniai",
"LANGUAGE": "Kalba", "LANGUAGE": "Kalba",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Tapatybė", "IDENTITY": "Tapatybė",
"LAYOUT": "Išdėstymas", "LAYOUT": "Išdėstymas",
"LAYOUT_NO_SPLIT": "Skaidymo nėra", "LAYOUT_NO_SPLIT": "Skaidymo nėra",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Vispārējie", "LEGEND_GENERAL": "Vispārējie",
"LANGUAGE": "Valoda", "LANGUAGE": "Valoda",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Generelt", "LEGEND_GENERAL": "Generelt",
"LANGUAGE": "Språk", "LANGUAGE": "Språk",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identitet", "IDENTITY": "Identitet",
"LAYOUT": "Utforming", "LAYOUT": "Utforming",
"LAYOUT_NO_SPLIT": "Ingen deling", "LAYOUT_NO_SPLIT": "Ingen deling",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Algemeen", "LEGEND_GENERAL": "Algemeen",
"LANGUAGE": "Taal", "LANGUAGE": "Taal",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identiteit", "IDENTITY": "Identiteit",
"LAYOUT": "Indeling", "LAYOUT": "Indeling",
"LAYOUT_NO_SPLIT": "Geen splitsing", "LAYOUT_NO_SPLIT": "Geen splitsing",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Ogólne", "LEGEND_GENERAL": "Ogólne",
"LANGUAGE": "Język", "LANGUAGE": "Język",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Tożsamość", "IDENTITY": "Tożsamość",
"LAYOUT": "Układ", "LAYOUT": "Układ",
"LAYOUT_NO_SPLIT": "bez podziału", "LAYOUT_NO_SPLIT": "bez podziału",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Geral", "LEGEND_GENERAL": "Geral",
"LANGUAGE": "Idioma", "LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identidade", "IDENTITY": "Identidade",
"LAYOUT": "Painel de Leitura", "LAYOUT": "Painel de Leitura",
"LAYOUT_NO_SPLIT": "Sem divisão", "LAYOUT_NO_SPLIT": "Sem divisão",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Geral", "LEGEND_GENERAL": "Geral",
"LANGUAGE": "Idioma", "LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identidade", "IDENTITY": "Identidade",
"LAYOUT": "Apresentação", "LAYOUT": "Apresentação",
"LAYOUT_NO_SPLIT": "Sem separação", "LAYOUT_NO_SPLIT": "Sem separação",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Geral", "LEGEND_GENERAL": "Geral",
"LANGUAGE": "Idioma", "LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identidade", "IDENTITY": "Identidade",
"LAYOUT": "Apresentação", "LAYOUT": "Apresentação",
"LAYOUT_NO_SPLIT": "Sem separação", "LAYOUT_NO_SPLIT": "Sem separação",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Setări de bază", "LEGEND_GENERAL": "Setări de bază",
"LANGUAGE": "Limbă", "LANGUAGE": "Limbă",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Основные Настройки", "LEGEND_GENERAL": "Основные Настройки",
"LANGUAGE": "Язык", "LANGUAGE": "Язык",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Профиль", "IDENTITY": "Профиль",
"LAYOUT": "Разметка", "LAYOUT": "Разметка",
"LAYOUT_NO_SPLIT": "Одна панель", "LAYOUT_NO_SPLIT": "Одна панель",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Všeobecné", "LEGEND_GENERAL": "Všeobecné",
"LANGUAGE": "Jazyk", "LANGUAGE": "Jazyk",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Splošno", "LEGEND_GENERAL": "Splošno",
"LANGUAGE": "Jezik", "LANGUAGE": "Jezik",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identiteta", "IDENTITY": "Identiteta",
"LAYOUT": "Postavitev", "LAYOUT": "Postavitev",
"LAYOUT_NO_SPLIT": "Brez razdelitve", "LAYOUT_NO_SPLIT": "Brez razdelitve",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Allmänt", "LEGEND_GENERAL": "Allmänt",
"LANGUAGE": "Språk", "LANGUAGE": "Språk",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identitet", "IDENTITY": "Identitet",
"LAYOUT": "Stil", "LAYOUT": "Stil",
"LAYOUT_NO_SPLIT": "Utan delad vy", "LAYOUT_NO_SPLIT": "Utan delad vy",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Genel", "LEGEND_GENERAL": "Genel",
"LANGUAGE": "Dil", "LANGUAGE": "Dil",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Основні налаштування", "LEGEND_GENERAL": "Основні налаштування",
"LANGUAGE": "Мова", "LANGUAGE": "Мова",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Tổng quan", "LEGEND_GENERAL": "Tổng quan",
"LANGUAGE": "Ngôn ngữ", "LANGUAGE": "Ngôn ngữ",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Tên gọi", "IDENTITY": "Tên gọi",
"LAYOUT": "Bố cục", "LAYOUT": "Bố cục",
"LAYOUT_NO_SPLIT": "Không phân màn hình", "LAYOUT_NO_SPLIT": "Không phân màn hình",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "常规", "LEGEND_GENERAL": "常规",
"LANGUAGE": "语言", "LANGUAGE": "语言",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "身份", "IDENTITY": "身份",
"LAYOUT": "布局", "LAYOUT": "布局",
"LAYOUT_NO_SPLIT": "不分隔", "LAYOUT_NO_SPLIT": "不分隔",

View file

@ -387,6 +387,7 @@
"SETTINGS_GENERAL": { "SETTINGS_GENERAL": {
"LEGEND_GENERAL": "一般設置", "LEGEND_GENERAL": "一般設置",
"LANGUAGE": "語言", "LANGUAGE": "語言",
"HOUR_FORMAT": "Hour format",
"IDENTITY": "Identity", "IDENTITY": "Identity",
"LAYOUT": "Layout", "LAYOUT": "Layout",
"LAYOUT_NO_SPLIT": "No Split", "LAYOUT_NO_SPLIT": "No Split",

View file

@ -11,6 +11,18 @@
<span data-bind="saveTrigger: languageTrigger"></span> <span data-bind="saveTrigger: languageTrigger"></span>
</div> </div>
</div> </div>
<div class="control-group">
<label data-i18n="SETTINGS_GENERAL/HOUR_FORMAT"></label>
<div>
<select data-bind="value: hourCycle">
<option value="">default</option>
<option value="h11">00:00 AM</option>
<option value="h12">12:00 AM</option>
<option value="h23">00:00 (24 hour)</option>
<option value="h24">24:00 (24 hour)</option>
</select>
</div>
</div>
<div class="control-group"> <div class="control-group">
<label data-i18n="SETTINGS_GENERAL/LAYOUT"></label> <label data-i18n="SETTINGS_GENERAL/LAYOUT"></label>
<div data-bind="component: { <div data-bind="component: {