13. Laravel 和 Vue-element-admin多语言配置

news2024/11/26 3:31:24

后端多语言

1. 安装, 并注册

composer require overtrue/laravel-lang:~6.0
# 添加以下行到 bootstrap/app.php
$app->register(Overtrue\LaravelLang\TranslationServiceProvider::class);

2. 修改默认语言为简体中文

# vim config/app.php
'locale' => 'zh_CN',

3. 发布语言包

root@d92a8d4c6792:/var/www/ogenes/Genes-Admin# php artisan lang:publish zh_CN,zh_HK   
published languages (no overwrite): ["zh_CN","zh_HK"].
root@d92a8d4c6792:/var/www/ogenes/Genes-Admin# ls -la lang/
total 100
drwxr-xr-x  8 root     root       256 Aug 29 14:41 .
drwxr-xr-x 34 root     root      1088 Aug 29 12:04 ..
drwxr-xr-x  6 root     root       192 Aug 29 14:39 en
-rw-r--r--  1 www-data www-data   677 Feb 15  2022 en.json
drwxr-xr-x 10 root     root       320 Aug 29 14:37 zh_CN
-rw-r--r--  1 root     root     45610 Aug 29 14:37 zh_CN.json
drwxr-xr-x 10 root     root       320 Aug 29 14:37 zh_HK
-rw-r--r--  1 root     root     45336 Aug 29 14:37 zh_HK.json

4. 测试

image-20220829144302111

5. 自定义语言包

# vim lang/en/common.php
return [
 'success' => 'success',
];

# vim lang/zh_CN/common.php
return [
 'success' => '成功',
];

# vim lang/zh_HK/common.php
return [
 'success' => '成功',
];

# vim app/Http/Controllers/User/AuthController.php
 			return response()->json([
         'code' => 0,
         'message' => trans('common.success'),
         'data' => [
             'token' => $token,
             'user' => $user,
         ]
     ]);

image-20220829145226752

前端多语言

1. 安装

npm install --save vue-i18n

2. 自定义语言包

#vim resources/src/i18n/langs/en/login.js
export const login = {
loginTitle: 'Login',
rememberMe: 'Remember me',
login: 'Login',
account: 'Account',
password: 'Password',
accountError: 'Please enter the correct account',
passwordError: 'The password can not be less than 6 digits',
}

#vim resources/src/i18n/langs/en/en.js
import enLocale from 'element-ui/lib/locale/lang/en'
import {login} from "./login";

const lang = {
loginForm: login,
...enLocale
};

export default lang;


#vim resources/src/i18n/langs/zh_CN/login.js
export const login = {
loginTitle: '请登录',
rememberMe: '记住我',
login: '登录',
account: '账号',
password: '密码',
accountError: '请输入正确的账号',
passwordError: '密码至少6位',
}


#vim resources/src/i18n/langs/zh_CN/zh_CN.js
import zhCNLocale from 'element-ui/lib/locale/lang/zh-CN'
import {login} from "./login";


const lang = {
loginForm: login,
...zhCNLocale
};

export default lang;

#vim resources/src/i18n/langs/zh_HK/login.js
export const login = {
loginTitle: '請登入',
rememberMe: '記住我',
login: '登入',
account: '帳號',
password: '密碼',
accountError: '請輸入正確的帳號',
passwordError: '密碼至少6比特',
}

#vim resources/src/i18n/langs/zh_HK/zh_HK.js
import zhHKLocale from 'element-ui/lib/locale/lang/zh-TW'
import {login} from "./login";


const lang = {
loginForm: login,
...zhHKLocale
};

export default lang;


#vim resources/src/i18n/langs/index.js
import en from './en/en';
import zh_CN from './zh_CN/zh_CN';
import zh_HK from './zh_HK/zh_HK';

export default {
en: en,
zh_CN: zh_CN,
zh_HK: zh_HK,
}

#vim resources/src/i18n/i18n.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from './langs'

Vue.use(VueI18n);
const i18n = new VueI18n({
//默认语言是中文简体
locale: localStorage.getItem('locale') || 'zh_CN',
messages,
silentTranslationWarn: true,
});

export default i18n

3. 配置

#vim resources/src/main.js
…………
import i18n from '@/i18n/i18n';

Vue.use(ElementUI, {
 i18n: (key, value) => i18n.t(key, value)
})

Vue.config.productionTip = false

new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})

4. 测试

#修改登录页面
#<h3 class="title">Login Form</h3>
<h3 class="title">{{ $t("loginForm.loginTitle") }}</h3>


#placeholder="Username"
:placeholder="$t('loginForm.account')"

#placeholder="Password"
:placeholder="$t('loginForm.password')"

#callback(new Error('Please enter the correct user name'))
callback(new Error(this.$t('loginForm.accountError')))

#callback(new Error('The password can not be less than 6 digits'))
callback(new Error(this.$t('loginForm.passwordError')))

image-20220829161001987

切换语言

1. 前端切换

封装store模块

#vim resources/src/store/modules/app.js
import Cookies from 'js-cookie'

const state = {
sidebar: {
 opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
 withoutAnimation: false
},
device: 'desktop',
locale: localStorage.getItem('locale') || 'zh_CN',
}

const mutations = {
TOGGLE_SIDEBAR: state => {
 state.sidebar.opened = !state.sidebar.opened
 state.sidebar.withoutAnimation = false
 if (state.sidebar.opened) {
   Cookies.set('sidebarStatus', 1)
 } else {
   Cookies.set('sidebarStatus', 0)
 }
},
CLOSE_SIDEBAR: (state, withoutAnimation) => {
 Cookies.set('sidebarStatus', 0)
 state.sidebar.opened = false
 state.sidebar.withoutAnimation = withoutAnimation
},
TOGGLE_DEVICE: (state, device) => {
 state.device = device
},
SET_LOCALE: (state, locale) => {
 state.locale = locale
 localStorage.setItem('locale', locale)
}
}

const actions = {
toggleSideBar({ commit }) {
 commit('TOGGLE_SIDEBAR')
},
closeSideBar({ commit }, { withoutAnimation }) {
 commit('CLOSE_SIDEBAR', withoutAnimation)
},
toggleDevice({ commit }, device) {
 commit('TOGGLE_DEVICE', device)
},
setLocale({ commit }, locale) {
 commit('SET_LOCALE', locale)
}
}

export default {
namespaced: true,
state,
mutations,
actions
}


#vim resources/src/store/getters.js
加入: locale: state => state.app.locale,

创建一个修改语言的组件, 放到导航栏

#vim resources/src/components/Language/index.vue
<template>
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
 <svg-icon icon-class="language"/> {{ locale }}
</span>
 <el-dropdown-menu slot="dropdown">
   <el-dropdown-item
     v-for="(lang, key) in languages"
     :disabled="lang===locale"
     :key="key"
     :command="lang">
     {{ lang }}
   </el-dropdown-item>
 </el-dropdown-menu>
</el-dropdown>
</template>

<script>
export default {
 name: "Language",
 data() {
   return {
     languages: [
       'en',
       'zh_CN',
       'zh_HK'
     ],
   }
 },
 computed: {
   locale() {
     return this.$store.getters.locale;
   }
 },
 methods: {
   handleCommand(lang) {
     this.$i18n.locale = lang
     this.$store.dispatch('app/setLocale', lang)
     this.$message.success('switch language success')
     // 重新刷新页面更改语言
     location.reload()
   }
 }
}
</script>

<style scoped>

</style>



#vim resources/src/layout/components/Navbar.vue
   <template v-if="device!=='mobile'">
     <languages id="header-language" class="right-menu-item"/>
   </template>

import Languages from "@/components/Language";

将当前语言环境放进请求头

#vim resources/src/utils/request.js
service.interceptors.request.use(
config => {
 // do something before request is sent
 config.headers['locale'] = store.getters.locale;
 if (store.getters.token) {
   // let each request carry token
   // ['X-Token'] is a custom headers key
   // please modify it according to the actual situation
   config.headers['Authorization'] = "Bearer " + store.getters.token
 }
 return config
},
error => {
 // do something with request error
 console.log(error) // for debug
 return Promise.reject(error)
}
)

2. 后端切换

新建language中间件

root@d92a8d4c6792:/var/www/ogenes/Genes-Admin# php artisan make:middleware LanguageMiddleware

 public function handle(Request $request, Closure $next)
 {
     $locale = $request->header('locale') ? : '';
     App::setLocale($locale ? : 'zh_CN');
     return $next($request);
 }

引入中间件

#vim app/Http/Kernel.php	
 	protected $routeMiddleware = [
     …………
     'auth.jwt' => Authenticate::class,
     'language' => LanguageMiddleware::class,
 ];

生效

#vim routes/api.php
Route::middleware(['language'])->group(function () {
 Route::post('/user/login', [AuthController::class, 'login']);
 Route::post('/user/logout', [AuthController::class, 'logout']);
 Route::middleware(['auth.jwt'])->group(function () {
     Route::post('/user/userinfo', [AuthController::class, 'userinfo'])->name('Userinfo');
 });
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/566159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『树莓派云台机器人』03. 利用SD卡进行树莓派的镜像烧录

目录 1. 下载镜像文件2. SD卡初始化与镜像烧录工具3. SD卡初始化过程4. 镜像烧录过程总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 1. 下载镜像文件 链接&#xff1a;https://pan.baidu.com/s/1…

我是普通人,我居然可以这样借力ChatGPT?(此文不卖课)

昨天写了一篇《程序员&#xff0c;如何借力ChatGPT&#xff1f;》&#xff0c;分享了借助AI&#xff1a; &#xff08;1&#xff09;撰写通用代码&#xff1b; &#xff08;2&#xff09;协助寻找BUG&#xff1b; &#xff08;3&#xff09;协助优化算法性能&#xff1b; &…

小白也能看懂的ChatGPT知识介绍

一、ChatGPT介绍 ChatGPT 是一款由 OpenAI 开发的人工智能技术驱动的语言模型应用。以下是 ChatGPT 的主要特点和功能&#xff1a; 自然语言处理&#xff1a;ChatGPT 可以识别和理解自然语言&#xff0c;包括英语、法语、德语、西班牙语等多种语言。它可以回答各种问题、提供各…

【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

文章目录 一、Room ViewModel LiveData 框架使用核心要点1、Room 框架优化分析2、Google 官方建议的 Room ViewModel LiveData 架构3、Room 与 LiveData 结合使用要点4、Repository 层核心要点5、ViewModel Room 结合使用6、Activity 组件中 ViewModel 使用要点7、Room 框…

RWKV论文燃爆!将RNN崛起进行到底!可扩百亿级参数,与Transformer表现相当!

深度学习自然语言处理 原创作者&#xff1a;鸽鸽 万众期待的RWKV论文来啦&#xff01; 这股RNN崛起的“清流”&#xff0c;由民间开源组织发起&#xff0c;号称是第一个可扩展到百亿级参数的非transformer架构&#xff01; RWKV结合了RNN和Transformer的优势&#xff1a;一方面…

【送书】前端系列16集-vue3范型,vue-i18n-next,watch,watchEffect

送书活动&#xff1a;挑选1名粉丝同学哦 免费包邮送。截止时间&#xff1a;2023/5/26号 19 : 00参与底部评论区说说&#xff1a;请在评论中分享你的阅读收获。 中台落地手记——业务服务化与数据资产化 vue-i18n-next vue3 中使用 i18n 需要安装的是 [vue-i18n v9] 的版本 npm…

Nat Biotechnol –精准 CRISPR-Cas噬菌体疗法将为重症感染患者带来福音

治疗血液系统恶性肿瘤的化学药物常会引起骨髓功能抑制&#xff08;bone marrow suppression&#xff09;和胃肠道黏膜炎&#xff0c;并伴有肠道通透性增加。肠道细菌&#xff08;包括大肠杆菌&#xff09;从胃肠道易位是血流感染的常见原因。肠道细菌引起血流感染导致的死亡率为…

【这个问题纠结了我好多年】3dMax到底使用Intel还是AMD的CPU更好?

随着英特尔和 AMD 的新 CPU上市&#xff0c;是时候进行新一轮的硬件测试了。通过以极具竞争力的价格提供大量内核&#xff0c;AMD 已成为 CPU 领域的有力竞争者。作为回应&#xff0c;英特尔已开始增加其 CPU 中的内核数量。虽然它们提供的内核数量仍然不如 AMD&#xff0c;但它…

基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标

概述 在本文中,我们将使用ESP32-CAM和OpenCV开发手势控制虚拟鼠标。ESP32 Camera Module和Python程序可用于无线控制鼠标跟踪和点击操作。 入门者必须具备 Python、图像处理、嵌入式系统以及物联网的丰富知识。首先,我们将了解如何控制鼠标跟踪和单击,以及运行 python 程序…

《Kali渗透基础》03. 被动信息收集

kali渗透 1&#xff1a;被动信息收集1.1&#xff1a;收集内容1.2&#xff1a;信息用途 2&#xff1a;域名信息收集2.1&#xff1a;nslookup2.1.1&#xff1a;命令参数2.1.2&#xff1a;示例 - 命令行2.1.3&#xff1a;示例 - 交互式 2.2&#xff1a;dig2.2.1&#xff1a;命令参…

chatgpt赋能python:PythonSplit连续空格

Python Split 连续空格 在Python编程中&#xff0c;split()方法是用来将字符串按照指定的分隔符划分成一个列表。默认情况下&#xff0c;分隔符是空格。但是&#xff0c;在实际应用中&#xff0c;我们可能会遇到连续空格的情况&#xff0c;这时候split()方法会出现一些问题。本…

让你不再好奇怎样无损放大图片

随着科技的不断进步&#xff0c;放大图片已经成为我们生活中不可避免的需求。但是&#xff0c;放大图片往往会导致图片失真、模糊或者变形等问题&#xff0c;让人感到十分困扰。那么&#xff0c;你知道怎样无损放大图片吗&#xff1f;接下来我将分享三个无损放大图片的方法给你…

顺丰科技携手飞桨自研“智能外呼机器人”,为客户打造优质服务体验

“您好&#xff0c;请问是李立先生吗”&#xff0c;或许不少人在拨通客服电话后发现是机器人客服&#xff0c;都希望能快点转人工。但顺丰的“客服机器人”却是“与众不同”的存在。 顺丰已成为国内领先的快递物流综合服务商、全球第四大快递公司&#xff0c;依托领先的科技研发…

DailyMart02:DDD领域分解与微服务划分

大家好&#xff0c;今天咱们继续更新DDD&微服务系列&#xff01; DailyMart是一个简单的购物商城&#xff0c;主要销售书籍&#xff0c;包括实体书和电子书。本文将使用领域驱动设计&#xff08;DDD&#xff09;对DailyMart的业务进行分析与优化&#xff0c;以提高系统的内…

今天的技术干货由 ChatGPT 买单了~~

ChatGPT 技术最近有多火就不用再介绍了吧&#xff0c;连超级大佬都说了 ChatGPT 这是几百年不遇的、类似发明电的工业革命一样的机遇。 这种机遇当然不能错过&#xff0c;使用得当那就像玄幻小说里的男主角开了挂一样&#xff0c;用来做快速查询、资料搜集、辅助学习相当不错&a…

ip网络广播对讲的特点

随着科技的不断发展&#xff0c;通讯方式也在不断地变革。传统的对讲机已经无法满足现代化沟通的需求&#xff0c;特别是在大型企业、学校和安保等领域对讲机的局限性已经显现出来。而一种新型通讯方式&#xff1a;IP网络广播对讲正在逐渐受到人们的关注和使用。本篇文章将围绕…

chatgpt赋能python:Python工程师必知:掌握Pythonspdiags用于高效稀疏矩阵计算

Python工程师必知&#xff1a;掌握Python spdiags用于高效稀疏矩阵计算 在机器学习和数据分析中&#xff0c;我们常常需要处理大量的数据集来进行模型训练和预测&#xff0c;但是在实际应用中&#xff0c;很多数据集都是稀疏的。这时候&#xff0c;稀疏矩阵的计算就变得非常重…

2023年网络安全自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书

2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件…

linux安装并启动nacos

前提准备 下载最新稳定版本&#xff0c;此处以nacos-server-2.1.0.tar.gz版本为例安装下载地址&#xff1a;https://github.com/alibaba/nacos/releases 二、具体步骤2.1 下载完成后解压&#xff1a;tar -zxvf nacos-server-2.1.0.tar.gz 2.2 将解压文件移动到/usr/local目录下…

生活中有趣好玩的产品设计

生活纷繁忙碌&#xff0c;设计无处不在。我们的衣食住行、吃喝玩乐都在跟设计打交道&#xff0c;创作奇才们用竭尽所能的心智引导和体验设计&#xff0c;吸引着我们的注意力。 这其中充满着做产品的思路&#xff0c;散发着智慧的光芒&#xff0c;留心观察就会发现很多有趣好玩的…