插件:i18n
项目管理工具:grunt
需安装: grunt 和properties-reader(i18n运行依赖)
- 在根目录下新建i18n文件夹,然后把i18n-parsers.coffee和i18n.coffee放在该文件夹(两文件在笔记最后)
- 在js下面放**.json(不同语言的资源文件)
- 新建grunt任务:
i18n: {custom_parser: {src: ['src/**/*.html'],options: {locales: 'src/js/**/*.json',output: 'tmp/'}},options: { base: 'src' }}
- 注册该任务:grunt.registerTask('dev', [ ‘i18n’])
- 运行: grunt dev
- 就会在tem目录下生成不同语言版本的文件夹
7.实现根据浏览器默认语言环境来加载不同的地址,在页面上也可以切换不同语言:解决方法,设置cookie.代码如下:
if (!getCookie('chuan')) {setCookie('chuan', 'cunzai');var type = navigator.appName,lang;if (type == "Netscape") {lang = navigator.language;} else {lang = navigator.userLanguage;}lang = lang.substr(0, 2); //取得浏览器语言的前两个字母if (lang == "en") { // 英语window.location.href = envUrl+"en/index.html";}else if (lang == "zh") { // 中文 - 不分繁体和简体window.location.href = envUrl+"index.html";}else { // 除上面所列的语言window.location.href = envUrl + "index.html";}}
//设置cookiefunction setCookie(c_name, value, expiredays) {var exdate = new Date();exdate.setDate(exdate.getDate() + expiredays);document.cookie = c_name + "=" + escape(value) + ((!expiredays) ? "" : ";expires=" + exdate.toGMTString());}
//获取cookiefunction getCookie(c_name) {if (document.cookie.length > 0) {var c_start = document.cookie.indexOf(c_name + "=");if (c_start != -1) {c_start = c_start + c_name.length + 1;var c_end = document.cookie.indexOf(";", c_start);if (c_end == -1)c_end = document.cookie.length;return unescape(document.cookie.substring(c_start, c_end));}}return "";}
8. i18n-parsers.coffee
//i18n-parsers.coffee
fs = require 'fs'
path = require 'path'
PropertiesReader = require 'properties-reader'class BaseParserconstructor: (@grunt) ->resolveLocale: (localePath) ->path.basename localePath, path.extname localePathclass JsonParser extends BaseParsername: 'json'readLocaleData: (localePath) ->@grunt.file.readJSON localePath"""
Locales from Transifex have one property to name the particular locale, with the
translations all below that. E.G. { "en": {"message": "Hello, world!"} }
"""
class TransifexParser extends JsonParsername: 'transifex'readLocaleData: (localePath) ->data = superkeys = Object.keys dataif keys.length is 1 and typeof data[keys[0]] is 'object'data[keys[0]]elsedataclass YamlParser extends BaseParsername: 'yaml'readLocaleData: (localePath) ->@grunt.file.readYAML localePathclass PropertiesParser extends BaseParsername: 'properties'resolveLocale: (localePath) ->(path.extname localePath).substring 1readLocaleData: (localePath) ->PropertiesReader(localePath).path()module.exports = (grunt) ->jsonParser = new JsonParser(grunt)transifexParser = new TransifexParser(grunt)yamlParser = new YamlParser(grunt)propertiesParser = new PropertiesParser(grunt)result = {}result[jsonParser.name] = jsonParserresult[transifexParser.name] = transifexParserresult[yamlParser.name] = yamlParserresult[propertiesParser.name] = propertiesParserresult
9. i18n.coffee
// i18n.coffee
parsers = require './i18n-parsers'module.exports = (grunt) ->grunt.registerMultiTask 'i18n', 'Localize Grunt templates', ->options = @optionslocales: []output: '.'base: ''format: 'json'grunt.verbose.writeflags options, 'Options'parser = if options.parser then options.parser else parsers(grunt)[options.format]for templatePath in @filesSrcif grunt.file.isFile templatePathlocalePaths = grunt.file.expand options.localesfor localePath in localePathslocale = parser.resolveLocale localePathoutputPath = generateOutputPath templatePath, locale, optionslocaleData = parser.readLocaleData localePathtemplate = translateTemplate templatePath, localeData, optionsgrunt.verbose.writeln "Translating '#{templatePath}' with locale '#{localePath}' to '#{outputPath}'."grunt.file.write outputPath, templatetranslateTemplate = (templatePath, localeData, options) ->template = grunt.file.read templatePathtemplateOptions =data: localeDatatemplateOptions.delimiters = options.delimiters if options.delimitersgrunt.template.process template, templateOptionsgenerateOutputPath = (templatePath, locale, options) ->filePath = templatePath.slice options.base.length if grunt.util._.startsWith templatePath, options.basetrimmedFilePath = grunt.util._.trim filePath, '/'[options.output, locale, trimmedFilePath].join '/'return @