博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php/Java Web国际化的联合解决方案
阅读量:7171 次
发布时间:2019-06-29

本文共 4556 字,大约阅读时间需要 15 分钟。

hot3.png

1.在php开发项目中,往往没有固定而有效的国际化方案,通常是由数组来实现的,其原理是通过php文件名(如zh-cn.php,zh-tw.php,en-us.php,en.php,zh.php)或者自定义的某些规则进行匹配。

无论在php还是Java中,初始化(默认)语言指定一般通过读取浏览器环境变量或者系统信息来实现的

下面是一张http请求头,注意请求参数appcept-Language

php中

'.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'
';//一般使用getallheaders()返回的数组遍历请求同,显然这里的变量经过了处理if(strrpos(strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']), 'zh-cn') !== false) {    echo '
你的是中文操作系统
';}else{    echo '
非中文操作系统
';}?>

java中

String lang = request.getHeader("accept-language");boolean isZh_CN = Pattern.compile("(zh|cn)+",Pattern.CASE_INSENSITIVE).matcher(lang).matches();

我们看到,他们都通过获取accept-language来得到,PHP中的 HTTP_ACCEPT_LANAGUAGE是经过封装后显示的 ,可以使用php内置函数getallheaders来获取所有请求同信息,原理也很简单

if (!function_exists('getallheaders')) {     function getallheaders()     {        foreach ($_SERVER as $name => $value)        {            if (substr($name, 0, 5) == 'HTTP_')   {                $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;            }        }        return $headers;     } }

2.上面的数据流程是静态的,在一个项目或框架中这样做无法实现更多语言的设计,因此需要一种灵活的映射来完成这项任务

注意:国际化设置往往需要设置服务器响应数据的编码类型,一般设置为utf-8

php

java

request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");
java web.xml中可以使用filter或者其他框架来设置编码

public class CharacterEncodingFilter implements Filter{private String encoding = "utf-8"; 	public void doFilter(ServletRequest request,ServletResponse response,	FilterChain chain)throws IOException,ServletException{	request.setCharacterEncoding(encoding);	request.setCharacterEncoding(encoding);	response.setCharacterEncoding(encoding);	//传递控制到下一个过滤器	chain.doFilter(request, response);}@Overridepublic void destroy() {	}@Overridepublic void init(FilterConfig config) throws ServletException {	encoding = config.getInitParameter("encoding")!=null?config.getInitParameter("encoding"):encoding;}}

web.xml

CharacterEncoding
hello.SetCharacterEncodingFilter
 
    
encoding
    
utf-8
  
CharacterEncoding
/*

如果使用了Spring或者Struts框架,需要如下设置方式了

 
 
org.springframework.web.context.ContextLoaderListener
 

CharacterFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true

如果采用了SpringMVC控制器,在这里需要注意,SpringMVC默认使用JSON传递数据,因此必须设置编码,下面是springmvc的配置文件

 
 text/plain;charset=UTF-8
 application/json;charset=UTF-8
 application/xml;charset=UTF-8

如果采用的是struts2控制器需要在struts2配置配置文件中设置

说道这里,编码问题基本解决了,至于ThinkPHP的编码,默认是utf-8,完全不用设置,如果想尝试一下改变,可以再thinkphp的conf/有具体文件设置,或者在项目配置目录文件中设置 DEFAULT_CHARSET =>'utf-8'即可。

另外提一下python+django,python3.x语言默认使用unicode字符集,Django也是默认的使用utf-8,如果觉得好玩儿的话可在settings.py中进行设置。

3.编码配置完成,下面进行映射

 %zh,     'zh_cn'=>$zh_cn,     'zh_tw'=>$zh,.....  );//这里使用zh/en来表示说这些语言的地区,范围更广,一般把相同的数据放在这里面?>//一下是一个简答的语言库(zh_cn.php)
'姓名',   'gender'=>'性别'   .... );?>

当然要想访问上面的数据,那么就需要根据accept-language来判断是什么语言了,判断出来假设

$local = 'zh_cn';

然后调用方式为

$lang[$local]

上面的是普通php要做的,在thinkphp中在项目目录下有一个/lang的文件夹,只需创建zh_cn/common.php,en_us/common.php等语言库,然后就可以在模板中调用了

{$Think.lang.lan_subject}

问题来了,如果要切换语言怎么办,还用问,当然是使用 cookie/session/url里面带的参数来判断了,比如说thinkphp的语言切换参数是 l?输入http://hostname:[port]/xxx/xx.php?l=zh_cn,如果你自己使用的话也可以使用自己的参数,比如local什么的。

问题又来了,某些页面如果没经过controller过滤怎么办?使用javascript的json数据是首选,当然html5支持本例离线缓存等也可以使用,这里不多说。

java web 国际化

java web国际化某些方面和php相同,比如使用json等

在某些时候,推荐使用servlet自带的国际化标签,关于format标签的使用,首先需要在web.xml中进行配置

javax.servlet.jsp.jstl.fmt.localizationContext
message

然后建立如下语言包(注意以 web.xml中 param-value值为前缀)

然后在jsp页面中使用,首先引入fmt标签库

<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %>

然后调用

在struts.xml中开启国际化(在struts.xml中设置)

在一般项目中,往往通过fmt和struts配合使用

在springmvc中这种配合却成了问题,因为springmvc对url的过滤是全覆盖式的,所以不需要担心没有通过controller过滤

在springmvc中国际化,需要进行如下配置

        
            
message
            

然后使用spring自带的标签库进行调用

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>

结束了,再说一下python+django,需要国际化时可以采用这种方式

转载于:https://my.oschina.net/ososchina/blog/337378

你可能感兴趣的文章
李开复预言:人工智能将在10年后让50%的人失业
查看>>
iStaing获500万美元投资,VR室内设计离我们还远吗?
查看>>
JFinal结合Sigar、echarts实现后台服务器监控
查看>>
SAP Netweaver和Hybris的数据库层
查看>>
编写安全 PHP 应用程序的七个习惯
查看>>
Elasticsearch 公司上市,市值近 50 亿美元
查看>>
如何正确看待量子计算的突破?
查看>>
从数据竞赛到专业第三方数据平台,科赛是如何高效提升「数据工作者」价值的?...
查看>>
IPerf——网络测试工具介绍与源码解析(1)
查看>>
ABAP Netweaver和git的快捷方式
查看>>
Java高级之内存模型分析
查看>>
Java日志框架-Spring中使用Logback(Spring/Spring MVC)
查看>>
蚂蚁金服战略投资ofo,双方合作进一步推进
查看>>
西咸新区“硬科技号”地铁专列上线运行,感受大西安的硬科技特色
查看>>
人工智能带来的社会影响
查看>>
袁煜明:现阶段区块链发展的最大问题是公链的不成熟
查看>>
RegexBuddy正则表达式工具
查看>>
HDU 1024Max Sum Plus Plus(最大m字段和)
查看>>
经典算法
查看>>
css 文本属性详细总结
查看>>