uniapp实现后端数据i18n国际化

1.在main.js配置请求获取到数据再设置到i18n中,

我这里是通过后端接口先获取到一个多个数据的的json链接,通过链接再获取数据,拿到数据后通过遍历的方式设置i18n

javascript 复制代码
//接口数据示例:

{
    "vi": "http://localhost:8899/_data/storage/languages/vi.json",
    "zh_CN": "http://localhost:8899/_data/storage/languages/zh_CN.json",
    "pt": "http://localhost:8899/_data/storage/languages/pt.json"
}

main.js

javascript 复制代码
import App from './App'
import { getLanguageJson } from "@/api/index.js";

// 初始化一个对象来存储语言数据
const i18nData = {};

// 设置 i18n 配置
const i18nConfig = {
  locale: uni.getLocale(), // 获取当前设备语言
  messages: uni.getStorageSync("i18nData") || {}, // 从缓存获取语言数据
  silentTranslationWarn: true,
  missingWarn: false,
  silentFallbackWarn: true,
  fallbackWarn: false
};

// 异步加载所有语言文件
const loadLanguages = async () => {
  try {
    const res = await getLanguageJson();
    const obj = res.data;
    console.log(obj);

    // 使用 Object.entries 生成语言文件请求的 Promise 数组
    const promises = Object.entries(obj).map(([lang, url]) => 
      new Promise((resolve) => {
        uni.request({
          url: url,
          method: 'GET',
          success: (res) => {
            if (res.statusCode === 200 && res.data) {
              i18nData[lang] = res.data;
              console.log(`语言包 ${lang} 加载成功`);
            } else {
              console.error(`语言包 ${lang} 加载失败`);
              i18nData[lang] = {}; // 设置为空对象以避免错误
            }
            resolve();
          },
          fail: (err) => {
            console.error(`语言包 ${lang} 加载失败`, err);
            i18nData[lang] = {}; // 设置为空对象以避免错误
            resolve();
          }
        });
      })
    );

    // 等待所有 Promise 完成
    await Promise.all(promises);

    // 加载完语言包后保存到本地缓存
    uni.setStorageSync("i18nData", i18nData);
  } catch (error) {
    console.error("获取语言包列表失败", error);
  }
};

  // #ifdef VUE3
  import { createSSRApp } from 'vue'
  import { createI18n } from 'vue-i18n'

  var i18n = createI18n(i18nConfig);
  
  // 拿到数据后加载语言包
  loadLanguages().then(() => {
     Object.entries(i18nData).forEach(([lang, messages]) => {
        i18n.global.setLocaleMessage(lang, messages);
        console.log(`语言包 ${lang} 加载成功`);
      });
  });
  export function createApp() {
    const app = createSSRApp(App);
    app.use(i18n);
    return {
      app
    };
  }
  // #endif

2.uniapp内置的文本语言无法通过异步国际化,只能在根目录locale文件夹下提前配置好。

├── locale

│ ├── en.json

│ ├── zh-Hans.json

│ └── zh-Hant.json

相关推荐
careybobo1 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
TDengine (老段)1 小时前
TDengine 中的关联查询
大数据·javascript·网络·物联网·时序数据库·tdengine·iotdb
杉之2 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端2 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡3 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
木木黄木木4 小时前
html5炫酷图片悬停效果实现详解
前端·html·html5
请来次降维打击!!!4 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
難釋懷5 小时前
JavaScript基础-移动端常见特效
开发语言·前端·javascript
还是鼠鼠5 小时前
Node.js全局生效的中间件
javascript·vscode·中间件·node.js·json·express
自动花钱机5 小时前
WebUI问题总结
前端·javascript·bootstrap·css3·html5