当前位置: 首页 > article >正文

uniapp实现后端数据i18n国际化

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

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

//接口数据示例:

{
    "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

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


http://www.kler.cn/a/467340.html

相关文章:

  • 华为设备的VRP系统详解
  • Http基础认证摘要认证
  • 软件工程期末大复习(六)面向对象分析
  • Nginx代理本地exe服务http为https
  • 基于单片机的数字电子秒表设计
  • NLP初识
  • [CTF/网络安全] 攻防世界 get_post 解题详析
  • 基于Java+Netty搞了个类似teamviewer、向日葵、ToDesk的远程桌面工具
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机
  • Ruby 中文编码
  • 【竞技宝】CS2:HLTV 2024 TOP11-w0nderful
  • Tailwind CSS 使用简介
  • 基于SpringBoot在线竞拍平台系统功能实现十五
  • 【Linux】定时运行shell脚本
  • DNS分块矩阵的理解
  • 遇到复杂的 递归查询sql 需要oracle 转pgsql 可以把数据表结构给ai
  • 挑战春招找到java后端实习第三天(1.4)
  • C++语言编程————C++的输入与输出
  • --- UDP和TCP传输协议 ---
  • 5G NTN(七) 高层(1)
  • git submodule的使用:将别人的git仓库作为自己的子仓库
  • uniapp3 手写签名组件(vue3 语法)封装与应用
  • DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计
  • 《Android最全面试题-Offer直通车》目录
  • 喜报|富唯智能荣获暨2024年广州科技创新创业大赛二等奖
  • 3、蓝牙打印机按键 - GPIO输入控制