如何访问位于 Vuei18n 中不同文件夹中的不同语言环境文件?
How to access different locale files situated in different folder in Vuei18n?
我想实施一个针对特定性别的区域设置管理系统,这意味着对于某些语言(例如希伯来语和阿拉伯语),男性和女性的文本会有所不同。所以我所做的是,为男性和女性创建了单独的文件。
这是我的目录结构-
locales
female
he.json
ar.json
male
he.json
ar.json
en.json
现在,我希望对于女性用户,区域设置文件应该从女性文件夹中选择,如果是男性用户,则应该从男性文件夹中选择。对于英语,文件“en.json”对于男性和女性都是相同的。
性别详细信息存储在 Vue 状态中,因此在 i18n.js 文件中,我正在检查用户的性别并更新语言环境文件的路径。这是我的 i18n.js 文件-
import Vue from "vue";
import VueI18n from "vue-i18n";
import { DEFINES } from "@/defines";
import { store } from "@/store";
Vue.use(VueI18n);
function getRelevantLocale() {
if (
!Object.entries(store.state.user.user).length ||
store.state.user.user.user_lang === "en"
) {
return require.context("./locales", true, /[A-Za-z0-9-_,\s]+\.json$/i);
} else if (store.state.user.user.gender === "female") {
return require.context(
"./locales/female",
true,
/[A-Za-z0-9-_,\s]+\.json$/i,
);
} else if (store.state.user.user.gender === "male") {
return require.context("./locales/male", true, /[A-Za-z0-9-_,\s]+\.json$/i);
}
}
export const loadLocaleMessages = () => {
const locales = getRelevantLocale();
const messages = {};
locales.keys().forEach((key) => {
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
if (matched && matched.length > 1) {
const locale = matched[1];
messages[locale] = locales(key);
}
});
return messages;
};
export const i18n = new VueI18n({
messages: loadLocaleMessages(),
locale: DEFINES.I18N_LOCALE || "en",
fallbackLocale: DEFINES.I18N_FALLBACK_LOCALE || "en",
silentFallbackWarn: true,
});
问题是,当性别或语言发生变化时,区域设置路径不会更新,即如果语言是希伯来语且性别是女性,而我转向了具有相同性别的语言英语,i18n 没有选择正确的文件从“locales/en.json”直到我重新加载页面。
任何人都可以提出建议吗?
我找到了解决办法。
每当更改语言环境时,都会更新该语言环境的消息。
假设设置了区域设置“en”并且“en”的消息来自“locales/en.json”文件,现在我们切换到区域设置“he”任何性别让我们说“男性”然后“他”的消息应该来自“locales/male/he。json”文件。
为此,只需在切换语言环境后添加此行-
// Set locale
i18n.locale = "he";
// Update messages for this locale
i18n.setLocaleMessage("he", loadLocaleMessages()["he"]);
我想实施一个针对特定性别的区域设置管理系统,这意味着对于某些语言(例如希伯来语和阿拉伯语),男性和女性的文本会有所不同。所以我所做的是,为男性和女性创建了单独的文件。 这是我的目录结构-
locales
female
he.json
ar.json
male
he.json
ar.json
en.json
现在,我希望对于女性用户,区域设置文件应该从女性文件夹中选择,如果是男性用户,则应该从男性文件夹中选择。对于英语,文件“en.json”对于男性和女性都是相同的。
性别详细信息存储在 Vue 状态中,因此在 i18n.js 文件中,我正在检查用户的性别并更新语言环境文件的路径。这是我的 i18n.js 文件-
import Vue from "vue";
import VueI18n from "vue-i18n";
import { DEFINES } from "@/defines";
import { store } from "@/store";
Vue.use(VueI18n);
function getRelevantLocale() {
if (
!Object.entries(store.state.user.user).length ||
store.state.user.user.user_lang === "en"
) {
return require.context("./locales", true, /[A-Za-z0-9-_,\s]+\.json$/i);
} else if (store.state.user.user.gender === "female") {
return require.context(
"./locales/female",
true,
/[A-Za-z0-9-_,\s]+\.json$/i,
);
} else if (store.state.user.user.gender === "male") {
return require.context("./locales/male", true, /[A-Za-z0-9-_,\s]+\.json$/i);
}
}
export const loadLocaleMessages = () => {
const locales = getRelevantLocale();
const messages = {};
locales.keys().forEach((key) => {
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
if (matched && matched.length > 1) {
const locale = matched[1];
messages[locale] = locales(key);
}
});
return messages;
};
export const i18n = new VueI18n({
messages: loadLocaleMessages(),
locale: DEFINES.I18N_LOCALE || "en",
fallbackLocale: DEFINES.I18N_FALLBACK_LOCALE || "en",
silentFallbackWarn: true,
});
问题是,当性别或语言发生变化时,区域设置路径不会更新,即如果语言是希伯来语且性别是女性,而我转向了具有相同性别的语言英语,i18n 没有选择正确的文件从“locales/en.json”直到我重新加载页面。
任何人都可以提出建议吗?
我找到了解决办法。
每当更改语言环境时,都会更新该语言环境的消息。
假设设置了区域设置“en”并且“en”的消息来自“locales/en.json”文件,现在我们切换到区域设置“he”任何性别让我们说“男性”然后“他”的消息应该来自“locales/male/he。json”文件。
为此,只需在切换语言环境后添加此行-
// Set locale
i18n.locale = "he";
// Update messages for this locale
i18n.setLocaleMessage("he", loadLocaleMessages()["he"]);