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

相关推荐
liwulin05064 分钟前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
前端甜糖16 分钟前
记录We码开发者工具的一个bug
前端·javascript
程序员黑豆25 分钟前
鸿蒙应用开发教程:以红绿灯切换为例,掌握条件渲染的核心用法
前端·harmonyos
猫32833 分钟前
echarts 日常问题解决
前端·javascript·echarts
新中地GIS开发老师37 分钟前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发
我是大卫1 小时前
【图】React源码解析-从数据结构、调度器、源码设计模式到状态计算引擎,深挖useReducer原理
前端·react.js·源码
willes1 小时前
列表中的倒计时组件
前端
LVZ1 小时前
用了半年 AI 写代码,最烦的不是代码,是环境
前端·后端·开源
polaris_tl1 小时前
一行 `compress: false`,为什么让 SSE 首包恢复实时返回
前端
海边的云1 小时前
别再让 AI 瞎改代码:一套让大模型「收敛」的前端专家 Skill》
前端