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);

demo