PHP项目多语言配置平台实现过程解析


Posted in PHP onMay 18, 2020

这个月用ant design的方式重构了我在15年的时候写的一个给主端项目写的多语言配置后台。发现当时的设计很“深”,深到有些功能根本就没用过,根据这几年的使用情况,重构了这一版本,无论是体验上还是实用性上都有所提高。今天抽时间把当时的一些想当然的需求拿出来总结下吧:

使用的技术

我们的项目主要是PHP为主要开发语言。使用gettext扩展实现国际化的。即通过人工的方式按照规则写入.po文件,然后调用某函数生成.mo 文件,放到生产环境的文件夹下,然后在代码里初始化一些内容进行引用。

gettext

gettext是php实现国际化的基本方式。使用方法如下:

安装php扩展gettext,这个同php其他扩展一样,这里就不详细介绍了。

linux环境安装msgfmt,安好后可用此命令将po文件生成.mo文件。

基本使用

建立文件如:zh_CN.po (.po是个文本文件),内容如下:

msgid "repeat content!"
msgstr "文本内容相同"

利用msgfmt将.po文件生成.mo文件。

msgfmt -o {$lang_path}/zh_CN.mo {$lang_path}/zh_CN.po

将生成的.po文件拷贝到你指定的文件夹 target_dir 下。

在php代码里面初始化。

$lang = 'zh_CN'; //
setlocale(LC_MESSAGES, 'en_US.UTF-8'); // 函数设置地区信息(地域信息)
bindtextdomain($lang, {$pofile_path})); // 用来设置文本域目录
textdomain($lang); // 设置默认域
bind_textdomain_codeset($lang, 'UTF-8');

在php的请求里面使用如下方法即可得到语境下对应词组的内容:

gettext("repeat content!") // 文本内容必须与1中的内容一致。

或者

_("repeat content!"); // 与上面函数相同

管理后台

以前都是开发人员自己上传,后来为了解放开发者,让产品自己操作,我们进行了如下改进:

  • 做成可配置后台,产品自己根据内容填写。
  • 配置后台分成入口(权限控制),展示列表页,即每个词组key对应各种语言下的内容。
  • 详情页,详情页支持批量添加。
  • 点击按钮触发发布。
  • 发布高级功能:生成列表和支持比对,对历史版本发布(拷贝历史版本到对应的文件夹下)。

改进

经过一段时间的使用,我决定根据实际使用情况重构一版。

  • 页面全部采用ant design pro为基础的框架,采用前后端分离的样式,我特别推崇ant design的设计思想,和人机交互的开发方法,是后端开发者的福音。
  • 淡化历史版本的记录。虽然有个好些,但是这个确实看的人少,基本没有。
  • 重新发布,如果有时间就做,没时间就不做。
  • 对于一些特殊内容的规定,如如果一个词组key在某种语言环境下显示为空,该怎么处理等等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 PHP
Yii 框架使用Forms操作详解
May 18 #PHP
thinkphp 框架数据库切换实现方法分析
May 18 #PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 #PHP
php + ajax 实现的写入数据库操作简单示例
May 16 #PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 #PHP
Yii框架应用组件用法实例分析
May 15 #PHP
Yii框架小部件(Widgets)用法实例详解
May 15 #PHP
You might like
第十二节--类的自动加载
2006/11/16 PHP
PHP SQLite类
2009/05/07 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
员工年终考核评语
2014/12/31 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
活动简报范文
2015/07/22 职场文书
学生会主席任命书
2015/09/21 职场文书
升职自荐书
2019/05/09 职场文书
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技