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

这个月用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在某种语言环境下显示为空,该怎么处理等等。

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

(0)

相关推荐

  • 在云虚拟主机部署thinkphp5项目的步骤详解

    前言 Thinkphp作为开源的PHP框架发展到今天,无疑是国内最适合PHP学员学习和使用的框架,除了简单容易上手,更大的优点是开发文档完善.插件丰富.本文将给大家详细介绍关于在在云虚拟主机部署thinkphp5项目的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 查阅ThinkPHP5.0完全开发手册->部署->虚拟主机环境,了解情況后,开始修改. 环境 thinkphp 5.0.11 阿里云云虚拟系统CentOS 第一步 修改移动入口文件位置,把它移动到根目录下

  • ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解

    本文实例讲述了ThinkPHP5 框架引入 Go AOP,PHP AOP编程.分享给大家供大家参考,具体如下: 项目背景 目前开发的WEB软件里有这一个功能,PHP访问API操作数据仓库,刚开始数据仓库小,没发现问题,随着数据越来越多,调用API时常超时(60s).于是决定采用异步请求,改为60s能返回数据则返回,不能则返回一个异步ID,然后轮询是否完成统计任务.由于项目紧,人手不足,必须以最小的代价解决当前问题. 方案选择 重新分析需求,并改进代码 采用AOP方式改动程序 从新做需求分析,以及

  • php项目中类的自动加载实例讲解

    主要函数:spl_autoload_register() - 注册给定的函数作为 __autoload() 的实现 将函数注册到SPL __autoload函数队列中.如果该队列中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中.因为spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()

  • docker-compose部署php项目实例详解

    1.制定特定扩展的PHP镜像 sudo mkdir -p /www/docker sudo cd /www/docker sudo vi Dockerfile FROM php:7.2-fpm-alpine MAINTAINER diaocheweide RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk update && apk add --no-cache -

  • PHP如何实现阿里云短信sdk灵活应用在项目中的方法

    首先安装 composer require alibabacloud/sdk 接着看alibabacloud官网文档 https://packagist.org/packages/alibabacloud/sdk 示例 My_composer_aliyunsms.php <?php // use Swoft\Task\Bean\Annotation\Task; // use AlibabaCloud\Client\AlibabaCloud; // use AlibabaCloud\Client\

  • Vue 项目中遇到的跨域问题及解决方法(后台php)

    问题描述 前端 vue 框架,后台 php,百度跨域问题后台加这段代码 header("Access-Control-Allow-Origin: *"); 加了之后报这个错: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The valu

  • thinkphp5框架前后端分离项目实现分页功能的方法分析

    本文实例讲述了thinkphp5框架前后端分离项目实现分页功能的方法.分享给大家供大家参考,具体如下: 方法一 利用tp5提供的paginate方法实现自动分页 参数 page第几页,paginate分页方法会自动获取 size  每页数量 代码 /** * Notes:消费记录 * Date: 2019/6/25 * Time: 15:43 * @param Request $request * @return \think\response\Json */ public function g

  • php+redis在实际项目中HTTP 500: Internal Server Error故障排除

    问题描述 用户量快速增长,访问量在短时间内翻倍,由于前期容量规划做得比较好,硬件资源可以支撑,可是软件系统方面出现了大问题: 40% 的请求都会返回 HTTP 500: Internal Server Error 通过查看日志,发现错误是在 PHP <-> Redis 的连接处理上 调试处理 第1次 刚开始时并没有找到根本原因,只能尝试各种与错误相关的办法,例如: 增加 PHP 连接数,并把超时时间从 500ms 增加到 2.5s 禁止掉 PHP 设置中的 default_socket_tim

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

    这个月用ant design的方式重构了我在15年的时候写的一个给主端项目写的多语言配置后台.发现当时的设计很"深",深到有些功能根本就没用过,根据这几年的使用情况,重构了这一版本,无论是体验上还是实用性上都有所提高.今天抽时间把当时的一些想当然的需求拿出来总结下吧: 使用的技术 我们的项目主要是PHP为主要开发语言.使用gettext扩展实现国际化的.即通过人工的方式按照规则写入.po文件,然后调用某函数生成.mo 文件,放到生产环境的文件夹下,然后在代码里初始化一些内容进行引用.

  • vue新建项目并配置标准路由过程解析

    这篇文章主要介绍了vue新建项目并配置标准路由过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 配置路由所有用到的地方总共四步或者说四处 1.index.js(src--router--index.js) import Vue from 'vue' import Router from 'vue-router' // import HelloWorld from '@/components/HelloWorld' import Home

  • SpringMvc web.xml配置实现原理过程解析

    1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLoaderListener(listener-class) ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法. 3.部

  • Springboot mybais配置多数据源过程解析

    一.分包方式实现: 1.在application.properties中配置两个数据库: #druid连接池 #dataSoureOne(这里是我本地的数据源) spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver spring.datasource.one.jdbc-url=jdbc:mysql

  • Springboot内置tomcat配置虚拟路径过程解析

    在Springboot中默认的静态资源路径有:classpath:/METAINF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,从这里可以看出这里的静态资源路径都是在classpath中(也就是在项目路径下指定的这几个文件夹) 试想这样一种情况:一个网站有文件上传文件的功能,如果被上传的文件放在上述的那些文件夹中会有怎样的后果? 网站数据与程序代码不能有效分离: 当项目被打包成一个.jar文件部署时

  • SpringCloud消息总线Bus配置中心实现过程解析

    介绍和使用场景 1)什么是消息 一个事件,需要广播或者单独传递给某个接口 2)为什么使用这个 配置更新了,但是其他系统不知道是否更新 SpringCloud配置中心可参考: https://www.jb51.net/article/182888.htm 1.安装RabbitMQ 下载地址: http://erlang.org/download/ Erlang版本:Erlang OTP 21:10.0.1 下载地址: https://www.rabbitmq.com/install-windows

  • Springboot/Springcloud项目集成redis进行存取的过程解析

    目录 一.redis去官网https://redis.io/download下载后解压 二.在项目中添加redis依赖 三.redis的使用 四.字符串类型存取(k,v) 五.存取对象(k,object) 六.List类型(k,list) 七.Hash类型(K,k,value) 八.然后打开redis desktop manager工具可以看到你存储的数据 九.如果想要在单元测试中进行存取 九.实际使用思路 前言:Redis支持五种数据类型:string(字符串),hash(哈希),list(列

  • Django 导出项目依赖库到 requirements.txt过程解析

    虚拟环境: 使用 pip freeze pip freeze > requirements.txt # 这种方式推荐配合 virtualenv ,否则会把整个环境中的包都列出来. 只扫描项目目录 使用 pipreqs 这个工具的好处是可以通过对项目目录的扫描,自动发现使用了那些类库,自动生成依赖清单.缺点是可能会有些偏差,需要检查并自己调整下. # 首先安装 pipreqs# pip install pipreqs # 安装位置在pip所在的目录下 # 使用方式也比较简单 pipreqs /va

  • 在vscode中配置python环境过程解析

    1.安装vscode和python3.7(安装路径在:E:\Python\Python37): 2.打开vscode,在左下角点击设置图标选择setting,搜索python path,在该路径下选择python的安装路径(E:\Python\Python37),如下图: 3.在本地新建一个文件夹,在vscode里直接打开: 4.点击新建一个.py文件,这里为hello.py,并打开这个文件: 5.按F5运行这个文件,会弹出Add configurations框,选择python文件即可,会在l

  • SpringBoot 动态配置邮箱发件人过程解析

    前言 现在的消息模块少不了邮件发送.短信发送和手机推送的功能.邮件发送的功能历史最为悠久,也算的上烂大街的功能.一般在配置文件中设置好邮箱地址.账号.密码和发件服务器地址后便不会再去改动.可是有的客户却希望人为指定发件人信息.这个需求并不过分,需要解决两个大问题:如何在容器启动成功后重新修改发送邮件的Bean.如何在服务器重启后,发件人依然是更改后的配置信息.这里记录实现的步骤. 需求分析 一).在未配置邮箱账号时,系统拥有默认的邮箱发件人 二).重新设置邮箱发件人后,需立即生效 三).重启服务

随机推荐