【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
今天有客户买我们的蜻蜓Q系统之-短视频影视系统-优雅草蜻蜓film产品,但是我们蜻蜓Q系统没有做语言包切换功能,但是客户又必须需要,因此本次项目决定对语言包整体功能进行升级,首先语言包切换功能并非直接翻译即可做到,客户是新疆地区,需要维吾尔语,其实可以做一个翻译版本,前端翻译一下我们对外收费1k差不多,市场价3-5k,但是客户坚持要可切换语言包,告诉大家这个功能很费劲,市场价20k元左右,卓伊凡收费10k元(其实都收费太低了,不过呢,主要是由于这是一个大功能,一旦完成了对我们这个产品的迭代也是有好处的),所以接受项目,项目开始,卓伊凡说过,对学习方向相关或者产品迭代相关的内容,或者合营项目可以做,非纯外包就行。
我们的蜻蜓f系统,准备在登录页,和我的页面里面加入语言切换功能。
laravel的相关源码,第一个Laravel Localization to Vue/JSON
这是一个能将 Laravel 本地化文件转化为 Vue 或其他 JavaScript 库可使用的 JSON 对象的工具,它在前后端分离的项目中非常实用,可让前后端共享语言资源,方便实现多语言功能。
适用于基于 Laravel 后端和 Vue 前端的前后端分离项目,尤其是需要实现多语言功能的应用,如国际化的网站、Web 应用程序等。
laravel的相关源码,第二个 [conttas/laravel - language]
这是一个 Laravel 语言切换器包,为 Laravel 项目提供了方便的语言环境切换功能,能根据用户的浏览器配置自动更改应用程序的语言环境,同时支持手动切换语言。
适用于各种 Laravel 项目,尤其是面向国际用户的网站、电子商务平台、内容管理系统等,需要为不同语言背景的用户提供个性化的语言服务。
关于前端uniapp,这里必须说下uniapp虽然是基于vue.js的,但是在实现这类复杂功能的时候我们一定要先去看有没有插件,因为你绝对不能直接按照vue.js来开发,还是会有区别的,加上打包的话uni的项目就是uni和vue不一样。
卓伊凡发现了这个插件,但是发现更新最后日期2023年,看起来相当有难度呀,而开源地址,已经被关掉,作者不知道为啥不开源了,看来此功能很具有挑战。
插件地址:https://github.com/zhongzf/i18n-uniapp 简介:该插件为 UniApp 项目提供了完整的国际化解决方案。它允许开发者将不同语言的文案集中管理,并且可以在运行时动态切换语言。插件支持对路由、组件等进行多语言处理,确保整个应用的各个部分都能实现语言切换。此外,它还提供了一些工具函数,方便开发者在代码中进行语言切换和文本翻译操作。
APP 进行语言自由切换且后台可修改语言包功能和普通 APP 翻译版本功能存在较大区别,主要体现在以下几个方面:
从上面的文字是否能理解意思?因为如果做语言切换,固定的文字就全部要做成变量,且在后台可以添加更多语言,那么做一种语言和做100种语言收费是一样的,并且功能项目完成后,后续这个功能就可以自主添加无限语种。
基于 Vue.js 前端(UniApp)和 PHP Laravel 后端实现语言自由切换且后台可修改语言包功能的开发思路:
languages
),用于存储支持的语言信息,包含字段如 id
、code
(语言代码,如 en
、zh-CN
)、name
(语言名称,如 English、中文)。translations
),用于存储具体的翻译内容,包含字段如 id
、language_id
(关联语言表的 id
)、key
(翻译的键,用于在前端引用)、value
(翻译的值,即具体的文本内容)。// 控制器方法 public function index() { return Language::all(); }
- **获取指定语言的翻译内容**:创建一个接口,根据前端传递的语言代码,返回该语言对应的所有翻译内容。
```php
// 路由定义
Route::get('/translations/{languageCode}', 'TranslationController@getTranslationsByLanguage');
// 控制器方法
public function getTranslationsByLanguage($languageCode)
{
$language = Language::where('code', $languageCode)->first();
if ($language) {
return Translation::where('language_id', $language->id)->pluck('value', 'key');
}
return [];
}
// 控制器方法示例 public function store(Request $request) { $translation = Translation::create([ ‘language_id’ => $request->input(‘language_id’), ‘key’ => $request->input(‘key’), ‘value’ => $request->input(‘value’) ]); return response()->json($translation, 201); }
### 前端(Vue.js + UniApp)
#### 1. 初始化语言状态
在 Vuex 或全局变量中初始化当前语言状态,默认可以设置为用户系统语言或应用的默认语言。
```javascript
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
currentLanguage: 'en' // 默认语言
},
mutations: {
setLanguage(state, language) {
state.currentLanguage = language;
}
},
actions: {
changeLanguage({ commit }, language) {
commit('setLanguage', language);
}
}
});
在应用启动时,调用后端接口获取支持的语言列表和当前语言的翻译内容。
// App.vue
export default {
async created() {
// 获取支持的语言列表
const languages = await this.$http.get('/languages');
this.languages = languages.data;
// 获取当前语言的翻译内容
const translations = await this.$http.get(`/translations/${this.$store.state.currentLanguage}`);
this.$store.commit('setTranslations', translations.data);
}
};
在界面上提供语言切换选项,用户选择不同语言时,调用后端接口获取新的翻译内容并更新界面显示。
<template>
<div>
<select v-model="selectedLanguage" @change="changeLanguage">
<option v-for="language in languages" :key="language.code" :value="language.code">{{ language.name }}</option>
</select>
<p>{{ $t('welcome_message') }}</p>
</div>
</template>
<script>
export default {
data() {
return {
selectedLanguage: this.$store.state.currentLanguage,
languages: []
};
},
methods: {
async changeLanguage() {
const translations = await this.$http.get(`/translations/${this.selectedLanguage}`);
this.$store.commit('setTranslations', translations.data);
this.$store.commit('setLanguage', this.selectedLanguage);
}
}
};
</script>
在 Vue 中封装一个翻译函数 $t
,用于根据翻译键获取对应的翻译内容。
// main.js
import Vue from 'vue';
import App from './App.vue';
import store from './store';
Vue.prototype.$t = function(key) {
return this.$store.state.translations[key] || key;
};
new Vue({
store,
render: h => h(App)
}).$mount('#app');
localStorage
)缓存翻译内容,只有在语言切换或翻译内容更新时才重新获取。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。