vue-i18n:错误的日期格式,例如挪威
vue-i18n: Wrong date format for e.g. Norwegian
我在我的应用程序中使用 vue-i18n(版本 8.24.2),一切都按预期工作,除非使用 locale = nb-NO(挪威语)渲染日期.预期格式:dd.MM.yyyy。实际格式:MM/dd/yyyy。将区域设置切换为德语(使用与挪威语相同的日期格式)时,将应用正确的日期格式。
这个悬而未决的问题可能会解决我的问题:
https://github.com/kazupon/vue-i18n/issues/625
我已经花了几个小时调查这个问题,但我目前卡住了,因此非常感谢任何帮助。
我的i18n.ts(我省略了与此问题无关的语言的配置)
import Vue from "vue";
import VueI18n from "vue-i18n";
enum Locales {
NO = "nb-NO"
}
const LOCALES = [
{ value: Locales.NO, caption: "Norsk" }
];
import nb_NO from "./locales/nb-NO.json";
export const messages = {
[Locales.NO]: nb_NO
};
const defaultLocale = Locales.NO;
const dateTimeFormats = {
"nb-NO": {
short: {
year: "numeric",
month: "2-digit",
day: "2-digit",
},
long: {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
hour12: false,
},
},
} as VueI18n.DateTimeFormats;
Vue.use(VueI18n);
// Create VueI18n instance with options
const i18n = new VueI18n({
locale: navigator.language.split('-')[0] || process.env.VUE_APP_I18N_LOCALE || defaultLocale,
fallbackLocale: defaultLocale,
messages,
dateTimeFormats: dateTimeFormats,
silentTranslationWarn: true,
});
const translate = (key: string): string => {
if (!key) {
return "";
}
return i18n.t(key) as string;
};
export { i18n, translate }; //export above method
vue-i18n
只是 forwards the date localization to Intl.DateTimeFormat(locale).format(date)
.
从 v92 开始,似乎只有 Chrome 的结果不正确(问题 1233509)。此错误已在 Chrome Canary v94.
中修复
作为解决方法,您可以修改 vue-i18n
实例的 _dateTimeFormatters
以使用 nb-NO
的丹麦语 (da
) 语言环境格式化程序:
const i18n = new VueI18n({/*...*/});
i18n._dateTimeFormatters[Locales.NO + '__short'] =
new Intl.DateTimeFormat('da', dateTimeFormats[Locales.NO].short);
i18n._dateTimeFormatters[Locales.NO + '__long'] =
new Intl.DateTimeFormat('da', dateTimeFormats[Locales.NO].long);
我在我的应用程序中使用 vue-i18n(版本 8.24.2),一切都按预期工作,除非使用 locale = nb-NO(挪威语)渲染日期.预期格式:dd.MM.yyyy。实际格式:MM/dd/yyyy。将区域设置切换为德语(使用与挪威语相同的日期格式)时,将应用正确的日期格式。
这个悬而未决的问题可能会解决我的问题: https://github.com/kazupon/vue-i18n/issues/625
我已经花了几个小时调查这个问题,但我目前卡住了,因此非常感谢任何帮助。
我的i18n.ts(我省略了与此问题无关的语言的配置)
import Vue from "vue";
import VueI18n from "vue-i18n";
enum Locales {
NO = "nb-NO"
}
const LOCALES = [
{ value: Locales.NO, caption: "Norsk" }
];
import nb_NO from "./locales/nb-NO.json";
export const messages = {
[Locales.NO]: nb_NO
};
const defaultLocale = Locales.NO;
const dateTimeFormats = {
"nb-NO": {
short: {
year: "numeric",
month: "2-digit",
day: "2-digit",
},
long: {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
hour12: false,
},
},
} as VueI18n.DateTimeFormats;
Vue.use(VueI18n);
// Create VueI18n instance with options
const i18n = new VueI18n({
locale: navigator.language.split('-')[0] || process.env.VUE_APP_I18N_LOCALE || defaultLocale,
fallbackLocale: defaultLocale,
messages,
dateTimeFormats: dateTimeFormats,
silentTranslationWarn: true,
});
const translate = (key: string): string => {
if (!key) {
return "";
}
return i18n.t(key) as string;
};
export { i18n, translate }; //export above method
vue-i18n
只是 forwards the date localization to Intl.DateTimeFormat(locale).format(date)
.
从 v92 开始,似乎只有 Chrome 的结果不正确(问题 1233509)。此错误已在 Chrome Canary v94.
中修复作为解决方法,您可以修改 vue-i18n
实例的 _dateTimeFormatters
以使用 nb-NO
的丹麦语 (da
) 语言环境格式化程序:
const i18n = new VueI18n({/*...*/});
i18n._dateTimeFormatters[Locales.NO + '__short'] =
new Intl.DateTimeFormat('da', dateTimeFormats[Locales.NO].short);
i18n._dateTimeFormatters[Locales.NO + '__long'] =
new Intl.DateTimeFormat('da', dateTimeFormats[Locales.NO].long);