之前web项目一直都是中文为主的,现在随着业务的需求,需要将网站语言支持多语言,这个着实给不管是前台还是后台都增加了不小的挑战,因为之前做的时候根本没有考虑多语言的问题,导致很多页面写的不是很灵活,样式写的比较死,中文看起来不错,其他语言又比较难看,其他语言看起来不错,中文比较难看,总之调了很久才能好。。。 哈哈哈,先吐槽一番。

今天,主要弄一下基于jQuery.i18n.properties 实现前端页面的资源国际化这个问题,也就是将页面中的显示中文的地方都变成可以根据用户选择的语言来变化的。网上也有很多js专门做这个国际化的,最终我们选择了jQuery.i18n.properties来实现。

先来copy一段关于jQuery.i18n.properties 的说明哈。

jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。
国际化英文单词为:Internationalization,又称i18n,“i”为单词的第一个字母,“18”为“i”和“n”之间单词的个数,而“n”代表这个单词的最后一个字母。jQuery.i18n.properties采用.properties文件对JavaScript进行国际化。jQuery.i18n.properties插件首先加载默认的资源文件(strings.properties),然后加载针对特定语言环境的资源文件(strings_zh.properties),这就保证了在未提供某种语言的翻译时,默认值始终有效。

废话少说,直接上代码吧(just demo)!

第一步:
下载必须的js文件
jquery.i18n.properties.js
jquery.js

第二步:
新建demo静态页面index.html

中文简体 中文繁體 English

<script src="js/jquery.js"></script>
<!-- 加载语言包文件 -->
<script src="js/jquery.i18n.properties-min-1.0.9.js"></script>
<script src="js/language.js"></script>

说明:
1、meta id=”i18n_pagename” content=”index-common” 这里面的index-common写法,这里是引 入了两个资源文件index和common,这样做的好处就是,我们可以把公用部分的资源文件放到common里面,例如页头,页脚等,而且不需在每个页面都复制这部分内容,当共有内容有所变化,只需要修改common.properties就可以全部修改啦。
2、获取方式一:label class=”i18n” name=”hellomsg1”这里面class=”i18n”写法,下边在js里面我们可以根据类选择器获取需要国际化的地方,然后name=”hellomsg1”这里面的hellomsg1跟资源文件里面的key保持一致。获取方式二:input type=”search” class=”i18n-input” selectname=”searchPlaceholder” selectattr=”placeholder”这里面的class=”i18n-input”写法,跟上边的区别就是可以给html标签的任何属性可以赋值,例如placeholder,name,id什么的都可以,selectattr=”placeholder”里面的placeholder就是要赋值的属性,selectname=”searchPlaceholder”里面的searchPlaceholder跟资源文件里面的key保持一致。

第三步:
配置language.js文件

/**

  • cookie操作
    */
    var getCookie = function(name, value, options) {
    if (typeof value != ‘undefined’) { // name and value given, set cookie
    options = options || {};
    if (value === null) {
    value = ‘’;
    options.expires = -1;
    }
    var expires = ‘’;
    if (options.expires && (typeof options.expires == ‘number’ || options.expires.toUTCString)) {
    var date;
    if (typeof options.expires == ‘number’) {
    date = new Date();
    date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
    } else {
    date = options.expires;
    }
    expires = ‘; expires=’ + date.toUTCString(); // use expires attribute, max-age is not supported by IE
    }
    var path = options.path ? ‘; path=’ + options.path : ‘’;
    var domain = options.domain ? ‘; domain=’ + options.domain : ‘’;
    var s = [cookie, expires, path, domain, secure].join(’’);
    var secure = options.secure ? ‘; secure’ : ‘’;
    var c = [name, ‘=’, encodeURIComponent(value)].join(’’);
    var cookie = [c, expires, path, domain, secure].join(’’)
    document.cookie = cookie;
    } else { // only name given, get cookie
    var cookieValue = null;
    if (document.cookie && document.cookie != ‘’) {
    var cookies = document.cookie.split(’;’);
    for (var i = 0; i < cookies.length; i++) {
    var cookie = jQuery.trim(cookies[i]);
    // Does this cookie string begin with the name we want?
    if (cookie.substring(0, name.length + 1) == (name + ‘=’)) {
    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
    break;
    }
    }
    }
    return cookieValue;
    }
    };

/**

  • 获取浏览器语言类型
  • @return {string} 浏览器国家语言
    */
    var getNavLanguage = function(){
    if(navigator.appName == “Netscape”){
    var navLanguage = navigator.language;
    return navLanguage.substr(0,2);
    }
    return false;
    }

/**

  • 设置语言类型: 默认为中文
    */
    var i18nLanguage = “zh-CN”;

/*
设置一下网站支持的语言种类
*/
var webLanguage = [‘zh-CN’, ‘zh-TW’, ‘en’];

/**

  • 执行页面i18n方法

  • @return
    /
    var execI18n = function(){
    /

    获取一下资源文件名
    /
    var optionEle = $("#i18n_pagename");
    if (optionEle.length < 1) {
    console.log(“未找到页面名称元素,请在页面写入\n <meta id=“i18n_pagename” content=“页面名(对应语言包的语言文件名)”>”);
    return false;
    };
    var sourceName = optionEle.attr(‘content’);
    sourceName = sourceName.split(’-’);
    /

    首先获取用户浏览器设备之前选择过的语言类型
    */
    if (getCookie(“userLanguage”)) {
    i18nLanguage = getCookie(“userLanguage”);
    } else {
    // 获取浏览器语言
    var navLanguage = getNavLanguage();
    if (navLanguage) {
    // 判断是否在网站支持语言数组里
    var charSize = KaTeX parse error: Expected 'EOF', got '}' at position 223: … }; }̲ else{ ….i18n == undefined) {
    console.log(“请引入i18n js 文件”)
    return false;
    };

     /*这里需要进行i18n的翻译*/jQuery.i18n.properties({name : sourceName, //资源文件名称path : 'i18n/' + i18nLanguage +'/', //资源文件路径mode : 'map', //用Map的方式使用资源文件中的值language : i18nLanguage,callback : function() {//加载成功后设置显示内容var insertEle = $(".i18n");console.log(".i18n 写入中...");insertEle.each(function() {// 根据i18n元素的 name 获取内容写入$(this).html($.i18n.prop($(this).attr('name')));});console.log("写入完毕");console.log(".i18n-input 写入中...");var insertInputEle = $(".i18n-input");insertInputEle.each(function() {var selectAttr = $(this).attr('selectattr');if (!selectAttr) {selectAttr = "value";};$(this).attr(selectAttr, $.i18n.prop($(this).attr('selectname')));});console.log("写入完毕");}});
    

}

/页面执行加载执行/
$(function(){

/*执行I18n翻译*/
execI18n();/*将语言选择默认选中缓存中的值*/
$("#language option[value="+i18nLanguage+"]").attr("selected",true);/* 选择语言 */
$("#language").on('change', function() {var language = $(this).children('option:selected').val()console.log(language);getCookie("userLanguage",language,{expires: 30,path:'/'});location.reload();
});

});

说明: 这个js文件写的比较详细有注释,大家一看应该就能懂,大致的就是第一次进来时,会根据浏览器的语言选择默认语言,然后用户每次选择不同的语言,会将选择的语言存入cookie,下一次进入取cookie里面的语言,核心i18n代码在 jQuery.i18n.properties({…})这里面就是给页面需要国际化的地方赋值。

第四步:
新建不用语言的资源文件index.properties,common.properties
zh-CN/index.properties

title=i18n资源国际化

lan=语言选择:
hellomsg1=首页消息:
hellomsg2=资源国际化!这是首页消息!
searchPlaceholder=请输入搜索信息
-CN/common.properties

commonmsg1=通用消息:
commonmsg2=资源国际化!这是通用消息哦!
1
2
zh-TW/index.properties

title=i18n資源國際化

lan=語言選擇:
hellomsg1=首頁消息:
hellomsg2=資源國際化! 这是首頁消息!
searchPlaceholder=請輸入搜索信息

zh-TW/common.properties

commonmsg1=通用消息:
commonmsg2=資源國際化!這是通用消息哦!

en/index.properties

title=i18n Resource Internationalization

lan=Language:
hellomsg1=Index message:
hellomsg2=Hello word! This is index message!
searchPlaceholder=Please input serach information

en/common.properties

commonmsg1=Common message:
commonmsg2=This is common message!

注意:这里我没有按照jquery.i18n.properties上边那种strings.properties,strings_zh.properties写法写,我觉得把资源文件按语言类型文件夹划分,更直观些,故而将所有中文简体放在zh-CN下边,所有中文繁体放在zh-TW下边,英语放在en下边。会导致它每次都会去请求index_zh.properties,出现404请求错误,不过没啥大影响啦!

大功告成!

来几张截图,看下效果如何!(页面有点丑呵,不影响啦!)

中文简体

中文繁体

英语

demo 项目源码已上传到 CSDN Download
demo 项目源码地址:基于jQuery.i18n.properties 实现前端页面的资源国际化 Demo 源码

作者:哎_小羊_168
原文:https://blog.csdn.net/aixiaoyang168/article/details/49336709

前端页面语言国际化,实现中英切换相关推荐

  1. struts2中页面语言国际化的方法

    在struts2中,前端页面表示国际化的实现更加简单.简单的应用struts2提供的支持国际化的表达式即可快速方便的进行页面的国际化的实现.如何做呢?本文以英文和中文为例进行说明. 1,自定义stru ...

  2. ajax中英文切换,vue-i18n中英切换插件使用

    虽然现在的浏览器都能实现翻译功能,但没有什么是比甲方爸爸说话更有权威的了. 问:如果实现后端数据传送前端时中英切换? 答:可以通过请求头设置一个为lang的值传送给后台,然后后台对lang=1进行判断 ...

  3. Windows10恢复任务栏中的“中/英”切换图标

    问题描述 一时手残点到任务栏中中/英切换标志下的[显示语言栏],然后我的中/英切换按钮就不见了,而且多出了一个丑的一批的语言栏. 点击语言栏右侧的最小化,这个语言栏倒是消失了,但是中/英切换标志还是没 ...

  4. IOS开发之国际化(中英语言版本设置)

    语言国际化 会根据系统语言自动替换app的语言 添加Localization,选择地区 新建String File 文件(不能乱写) 关于app名称为InfoPlist.strings 关于代码的名称 ...

  5. Qt国际化翻译(中英切换)步骤:可子界面翻译

    效果显示: 1.英文翻译: 2.中文翻译: 步骤 1.用一个函数用来设置控件的文本信息,因为每次切换语言,就要重新设置控件的文本信息,所以我这里用了一个FunSetText()函数封装(FunSetT ...

  6. 7、SpringBoot之实现登陆界面的中英切换

    项目地址:https://github.com/Chakid/SpringBoot-example 1.第一步,创建一个SpringBoot项目 2.导入资料中的一些写到的代码和静态页面 1)在con ...

  7. eclipse汉化方式(下载,安装,中英切换)

    按照下面的步骤完成Eclipse的汉化,对初学java的小伙伴们很有帮助哦,愿大家能够学习进步! eclipse汉化的两种方式 第一种方式 第二种方式 第一种方式 一.第一步准备工作: 打开eclip ...

  8. 如何把网上下载的前端页面在Spring Boot中跑起来(CSS,JavaScript,程序运行等路径设置)

    这个功能非常有用,估计99.99%的java web开发者都干过,本人是初学者,特写这个博客记录下! 方便本人以后查阅,方便以后进行投机取巧 这里使用thymeleaf模板引擎! 在网上下载了一个Bo ...

  9. django2.x/3.x 前端页面在debug模式中找不到动态文件static

    修改setting配置: STATIC_URL = '/static/' STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), ...

最新文章

  1. java中引用类型_您真的了解Java中的4种引用类型吗?
  2. Spring Cloud:使用Ribbon实现负载均衡详解(下)
  3. Android中点击事件的四种写法
  4. ios开发text kit_IOS开发入门之TextKit详解
  5. 如何在Windows 7、8、10,Vista或XP中删除Windows服务
  6. Android TextView 设置文字背景色或文字颜色,字体阴影,字体样式
  7. the java home_the java_home environment variable is not defined correctly
  8. 推荐《程序设计导引及在线实践》
  9. SPSS学习笔记(五)卡方检验
  10. Android系统中的常用时间戳及时间单位
  11. img文件制作linux启动u盘,制作Linux的U盘启动盘
  12. 【百度大脑新品体验】行驶证识别
  13. 贪心 :PIPI渡江
  14. javaCSGO赛事管理系统springbootvueweb
  15. 程序媛的芳华,女神节快乐!
  16. TSINGSEE青犀视频云-边-端架构视频智能分析平台EasyNVR如何实现直播地址和录像地址统一
  17. java_计算两个时间相差多少天、小时、分钟、秒
  18. 缺少vcruntime140d.dll的解决办法
  19. Python每日一记42机器学习中特征重要性feature_importances_
  20. 转行大数据还是人工智能,哪个发展更好

热门文章

  1. Facebook MySQL 8.0 迁移之路
  2. 竞价猎马技术具体操作
  3. [Unity实战]虚线的绘制
  4. mysql is双竖线_oracle中的单引号和双竖线||以及q'间隔符
  5. 比较器Compare升序降序
  6. 2021最新汇总:国内外知名的cms建站系统,这些你必须知道
  7. H5技术实现教程:多屏CSS动画精进技巧
  8. android点击应用没有反应,Android 应用菜单项点击没反应的问题
  9. 短信发送AZDG加密算法
  10. C语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作