fis-plus安装解决方案

引自:http://fex-team.github.io/fis-plus/document.html

快速入门安装fis-plus

fis-plus 的 自动化 / 辅助开发工具 被发布为一套 npm 包,它对环境的要求是:

操作系统:任何能安装 nodejs 的操作系统
node版本:>= v0.8.0
jre版本:>= v1.5.0 【如果不需要本地调试服务器,可以忽略java环境要求】
php-cgi版本:>= v5.0.0 【如果不需要本地调试服务器,可以忽略php-cgi环境要求】
如果是百度 OCEAN 开发机器 ,直接执行以下脚本即可,所有 node & fis 的环境都被安装了;

bash -c "$( curl http://fis-cloud.bj.bcebos.com/install.sh -k )" && source ~/.bashrc

-------------------------------------------------------------------------------------

安装 nodejs

@需要先安装npm:可以使用命令:yum install npm  或没有root权限的情况下执行:sudo yum install npm

npm 是 nodejs 的包管理工具。安装 nodejs 后,npm 就自动一起安装了。

用nodejs写的模块都发布在npm上。npm 网站
用户需要使用npm install命令来安装nodejs模块。更多npm使用,执行 npm -h 来查看
由于npm经常被墙,安装fis的时候会出现速度过慢,或者安装不上的问题 。
可以通过 npm的 --registry 参数指定仓库。指定国内的npm镜像来解决npm被墙的问题。
例如:
npm install <some npm module> -g --registry=镜像

下面提供一个国内镜像
--registry=http://r.cnpmjs.org
百度内部可以使用公司内镜像
--registry=http://npm.internal.baidu.com
-------------------------------------------------------------------------------------

安装 fis-plus

nodejs 安装好后,命令行执行
@执行命令:npm install -g fis-plus 或没有root权限的情况下执行:sudo npm install -g fis-plus
安装好 fis-plus 之后,执行 fisp -v,如果能看到以下信息,则表明安装成功。 如果安装过程中遇到什么问题,可以到 https://github.com/fex-team/fis-plus/issues?state=open 提问题,或者 QQ 询问。
![](https://images2018.cnblogs.com/blog/1296853/201802/1296853-20180228173119774-1901774321.png)
-------------------------------------------------------------------------------------

安装 lights

lights 是 fis 提供的包管理工具,托管了 fis 所有资源。是使用 fis 的时候,必不可少的利器。
@执行命令:npm install -g lights 或没有root权限执行:sudo npm install -g lights

=======================================================================================

安装 Java

安装 php-cgi
-------------------------------------------------------------------------------------

mac 安装

mac 下安装 php-cgi 有多种方法,这里只介绍比较简单的两个方法;

@用brew安装
直接下载安装 XAMPP

用 brew 安装
如果安装了 xcode,那么推荐使用 brew 来安装 php。详细使用方法见 官网,这里只说明如何装 php-cgi;

$ brew install php55 --with-cgi
如果安装提示没有 php55,请用 brew tap homebrew/homebrew-php 后再安装

如上,方法很简单,等安装成功后即可使用;

直接下载安装 XAMPP
到 XAMPP 官网 下载 Mac 版本,双击安装;等安装成功后需要把 XAMPP 的 bin 目录设置到 环境变量里面;

@使用 zsh

$ echo 'export PATH=/Applications/XAMPP/bin:$PATH' >> ~/.zshrc
$ source ~/.zshrc
@使用 bash

$ echo 'export PATH=/Applications/XAMPP/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
-------------------------------------------------------------------------------------

windows 安装

windows 安装方法很多,下面介绍最简单的一种。

直接安装 xampp
地址:[http://www.apachefriends.org/zh_cn/index.html]

下载xampp并安装,将xampp/php路径加入环境变量中。
就安装了php和php-cgi。
cmd命令行输入php-cgi -v ,就看到php-cgi版本号。php-cgi就装好啦
-------------------------------------------------------------------------------------

linux 安装

安装 JAVA 和 php-cgi 是由于 fis-plus 内置了 jetty 服务框架来解析 php 脚本,如果你自己有本地 Web 服务,可以用你自己的, 详见 ;
@执行命令:yum -y install php-cgi 或没有root权限执行:sudo yum -y install php-cgi
-------------------------------------------------------------------------------------

示例
以下示例都是在命令行下操作的,如果你是 windows 用户,请打命令的时候忽略命令前的 $,而且请打开cmd 来执行这些操作

已经准备好了一个 fis-plus 的前端项目,只需要经过以下四步,就可以完整运行这个项目,并看到结果。

========================================================================================
初始化本地模拟环境
下载Demo
发布
预览
初始化本地模拟环境
为了前后端开发分离,来并行开发,fis-plus 提供了一套本地环境模拟的工具,安装并初始化它后就能方便的模拟线上环境了。

$ fisp server init

下载 Demo

FIS 的所有示例及其组件都用包管理工具 lights 进行管理,使用 lights 安装 demo。

$ lights install pc-demo
其实 fisp 已经集成了 lights 的客户端。

和上面等值的用法;

$ fisp init pc-demo
fisp <= 0.7.5

$ fisp install pc-demo
如果下载失败,可直接从 GitHub 下载,https://github.com/fex-team/fis-plus-pc-demo

发布
$ cd pc-demo
$ fisp release -r common
$ fisp release -r home
预览
$ fisp server start #启动服务器
启动服务的时候,启动成功后会自动打开浏览器,访问首页,这时候你应该打开 demo 首页,并和下图是一致的。

示例解说
自此,一个前端项目已经运行起来了。你可以看一下 pc-demo 的源码,其中包含两个模块

common
home
模块 这个词会贯穿整个文档,以及整个 fis-plus 的使用。为什么会有模块这种东西? 当前端代码很多时,不得不面临分组件,分页面。为了发布迭代方便,不得不把它们分为不同的子系统。比如用户信息、首页、详情页等等。

模块 就是一个子系统,而在 fis 项目中用 namespace 和fis-conf.js来区分。每一个模块会有一个配置文件fis-conf.js,还会取名不同的namespace。这主要是为了区分模块之前的静态资源。

继续进入 home 模块,可以看看有几个目录及其文件

.
├── fis-conf.js
├── page
├── server.conf
├── static
├── test
└── widget
无疑,这就是使用 fis-plus 需要遵循的目录规范,为什么要有目录规范,可能在网上可以找到很多答案,这里就不再赘述。

说一下这几个目录所代表的意思;

page 页面模板
widget 组件,模板组件,JS组件,CSS组件,会被组件化
static 这个目录下放一些不需要组件化的公共库,比如lazyload.js
test 放置一些测试数据,和page下的模板相对应,表明哪个模板用哪个数据文件进行渲染
server.conf 这是一个很有用的文件,它里面可以配置url转发,可以方便在本地模拟ajax请求等。
细心的你有可能发现了一个比较专业的词汇 组件化,组件化的细节比较繁多,准备新开一节说明

page 如何引入 widget
如示例中 index.tpl 如何应用 widget/header/header.tpl ? 如果用过 smarty 的你可能会想到include,但在 FIS-PLUS 中引入 widget 有个跟include 类似的插件完成,widget。

{%widget name="home:widget/header/header.tpl"%}
home:widget/header/header.tpl 这个是 FIS 中 静态资源 id

模板中如何使用 widget 目录下的静态资源
根据目录规范 widget 目录下的 js 将被进行 组件化封装 ,根据 同名依赖 原则;

当使用某个widget下模板时,同名js,css将会被加载。
当使用某个widget下的js时,其同名css会被加载。
加载 JS
由于 js 进行了组件化封装,比如通过 require 或者 require.async 函数来执行其中逻辑。

{%script%}
require('/widget/a.js');
{%/script%}
如上,在模板中使用 widget 下的 js,必须放到 {%script%} {%/script%} 之间,用它来代替 js 的内联用法。

加载 css
说完加载 js 的方法,css 如何引入呢?

同名依赖,被依赖
通过smarty的require插件
{%require name="home:widget/a.css"%}
静态资源 id
静态资源 id 会贯穿整个用户文档,跟使用密切相关,所以它很重要。现在需要弄清楚两件事情

静态资源id是如何在fis-plus中计算的?
静态资源id在那些情况下使用,那些情况下必须用静态资源id?
静态资源 id 是如何在 fis-plus 中计算的?
fis-plus 必须要指定模块的 namespace,所以静态资源 id 被标记为

namespace:< 资源相对于模块根目录的路径 >

比如:

home/static/a.js home目录为模块跟目录,home为namespace,则静态资源id就为 home:static/a.js
namespace可以为任意值,可以不跟模块根目录相同。
静态资源 id 在那些情况下使用,那些情况下必须用静态资源 id?
使用widget、require、html等smarty插件时,必须指定资源的id
require、require.async等JavaScript函数,可以使用id
本地开发
本地开发主要是一些fis-plus指定的目录规范的讲解以及提供的js和css组件化开发和Smarty模板中提供的一些插件的使用等。
目录规范
规范是辅助用户开发的利器,按照规范进行开发,可以极大的提升开发效率。 在 FIS 中,定义了一套默认的模块化开发规范。

站点目录结构
业务功能模块化,针对常见的业务模型,抽象出以下层级关系:

站点(site):一般指能独立提供服务,具有单独二级域名的产品线。如旅游产品线或者特大站点的子站点(lv.baidu.com)。
模块(module):具有较清晰业务逻辑关系的功能业务集合,一般也叫系统子模块,多个子系统构成一个站点。
页面(page): 具有独立URL的输出内容,多个页面一般可组成子系统。
组件(widget):能独立提供功能且能够复用的独立资源,它可以是独立的JS、CSS或者是由JS、CSS和页面组成的页面碎片。
静态资源(static):非组件资源目录,包括模板页面引用的静态资源和其他静态资源(favicon,crossdomain.xml等)。
插件(plugin): 模板插件目录(可选,对于特殊需要的产品线,可以独立维护)。
测试数据(test): 页面对应的测试数据目录。
FIS 规范定义了两类模块: common 模块 与 业务模块。

common模块: 为其他业务模块提供规范、资源复用的通用模块。
业务模块: 根据业务、URI等将站点进行划分的子系统站点模块。
站点整体目录结构示意:

|---site
| |---common #通用子系统
| | |---config #smarty配置文件
| | |---page #模板页面文件目录,也包含用于继承的模板页面
| | └── layout.tpl
| | |---widget #组件的资源目录,包括模板组件,JS组件,CSS组件等
| | | └── menu #widget模板组件
| | | | └── menu.tpl
| | | | └── menu.js
| | | | └── menu.css
| | | └── ui #UI组件
| | | └── dialog #JS组件
| | | | └──dialog.js
| | | | └──dialog.css
| | | └── reset #CSS组件
| | | └── reset.css
| | |---static #非组件静态资源目录,包括模板页面引用的静态资源和其他静态资源
| | |---plugin #模板插件目录(可选,对于特殊需要的产品线,可以独立维护)
| | |---fis-conf.js #fis配置文件
| |---module1 #module1子系统
| | |---test
| | |---config
| | |---page
| | └── index.tpl
| | |---widget
| | |---static
| | | └── index #index.tpl模板对应的静态资源
| | | └── index.js
| | | └── index.css
| | |---fis-conf.js #fis配置文件

    ......

为什么 FIS 要按照上述模块化方式定义规范呢?

模块化是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易得。

想了解的更多,可以查看 FIS 模块化

路径说明
页面 (page):存放在 模块根目录 /page 下,url 访问路径为 / 模块名 /page/ 页面名,例如 path_to_user_module/page/view.tpl,访问 url 为:/user/page/view。页面静态资源存储的位置为:

tpl :path_to_module/page/页面名.tpl
js :path_to_module/page/页面名.js
css :path_to_module/page/页面名.css
css 组件 :一般来说,CSS 组件是最简单的组件,它的存储方式为:

widget目录下的css文件皆为css组件,建议存放在widget/ui目录下

css :path_to_module/widget/ui/组件名/组件名.css
js 组件 :支持 AMD 规范的 js 组件,js 组件存储的方式为:

widget目录下的js文件皆为js组件,建议存放在widget/ui目录下

js :path_to_module/widget/ui/组件名/组件名.js
模板组件 :存放在 模块根目录 /widget 下,每个 widget 包含至少一个与 widget 目录 同名 的 tpl,同时可以有与 widget 同名 的 js、css 作为其静态资源。组件存储方式为:

tpl :path_to_module/widget/组件名/组件名.tpl
js :path_to_module/widget/组件名/组件名.js
css :path_to_module/widget/组件名/组件名.css
配置文件 (fis-conf.js):fis 配置文件存放在模块根目录下 path_to_user_module/fis-conf.js ,smarty 配置文件存放在:

conf:path_to_module/config/模块名/
smarty 插件 :与 smarty 插件相关的都存放在 plugin 目录下,存储位置为:

插件:path_to_module/plugin/
测试数据 (test):fis 开发环境允许在本地开发中设置测试数据进行调试,测试数据以页面模板为单位进行组织,其存储方式为:

tpl:path_to_module/page/模块名/页面名.tpl
data:path_to_module/test/page/页面名.json(或php)
组件化
模块的 widget 目录默认为组件目录,组件化按照代码的组织方式,分为以下三种:

CSS 组件:独立 css 代码片段。可以被其他 css,js,模板引用。

JS 组件:独立 js 代码片段,JS 组件可以封装 CSS 组件的代码。

模板组件:涉及代码最多,有模板代码,JS 代码,css 代码和 HTML 代码。 建议,模板组件中的 js 仅被这个 widget 使用,保持 widget 的独立。

下面的文档会详细介绍组件的使用方式。

自定义特殊目录规范
假设有自定义特殊目录规范的需求,比如某些图片需要挪动到自定义的目录下时,需要通过如下方式设置, 切记 。

具体设置属性参考 roadmap.path 设置

fis.config.set('roadmap.path', [
{ // 规则1
reg: '匹配文件正则或者glob',
release: '文件想产出的路径'
},
{ // 规则2
reg: '匹配文件正则或者glob',
release: '文件想产出的路径'
}
].concat(fis.config.get('roadmap.path', [])));
三种语言能力
html、css、javascript扩展语言能力,请参见三种语言能力
Smarty提供的三种语言能力
Smarty 三种语言能力
在 fis-plus 中使用 Smarty 插件的方式也实现了 三种语言能力 :require、uri 以及编译期的widget_inline

{%require%}

解释:当前文件添加依赖,是一个Smarty运行时函数
参数:name、src
例子:

{%require name="common:static/lib/jquery.js"%}

{%require src="http://www.baidu.com/cdn/jquery.js"%} {%外链%}

解释:运行时动态定位某一个资源,是一个Smarty运行时函数
参数:name
例子:

widget_inline
解释:widget_inline是一个fis编译插件,可以认为是一个fisp编译时功能,意在内嵌一些widget模板,降低线上解析smarty带来的IO开销。
例子:
模板开发
使用如下方式获取最新 Smarty 插件

git clone https://github.com/fex-team/fis-plus-smarty-plugin plugin 后进入 plugin 目录 删除.git 目录

或 点击下载

页面模板
在模块中,用户可直接访问浏览的页面称为页面模板,文件在 模块根目录 /page/ 下。FIS 提供提供了很多模板插件替换原生 html 标签,为页面模板开发提供使用。

通过html 插件控制整体页面的输出,以及注册前端组件化框架。
通过head 插件在模板解析运行时,控制加载同步静态资源使用。
通过body 插件可在页面底部集中输出JS静态资源。
从 demo 中 common 模块的 layout.tpl,可以了解到如何通过后端框架进行开发,组织整个页面:

{%* 使用html插件替换普通html标签,同时注册JS组件化库 %}
{%html framework="common:static/mod.js" class="expanded"%}
{%
使用head插件替换head标签,主要为控制加载同步静态资源使用 %}
{%head%}


{%$title%}
{%block name="block_head_static"%}{%/block%}
{%/head%}
{%
使用body插件替换body标签,主要为可控制加载JS资源 *%}
{%body%}
{%block name="content"%}{%/block%}
{%/body%}
{%/html%}
通过require 插件加载静态资源,便于静态资源管理。
通过script 插件管理JS片段,集中在页面底部加载。
通过widget 插件调用模板组件组织页面,处理对应的静态资源。
在 demo-home 模块中的 index.tpl,加载页面模板对应的静态资源,通过模板组件组织页面:

{%extends file="common/page/layout.tpl"%}
{%block name="block_head_static"%}

{%* 模板中加载静态资源 %}
{%require name="home:static/lib/css/bootstrap.css"%}
{%require name="home:static/lib/css/bootstrap-responsive.css"%}
{%require name="home:static/lib/js/jquery-1.10.1.js"%}
{%/block%}
{%block name="content"%}




{%widget name="home:widget/slogan/slogan.tpl"%}
{%foreach $docs as $index=>$doc%}
{%widget
name="home:widget/section/section.tpl"
call="section"
data=$doc index=$index
%}
{%/foreach%}


{%require name="home:static/index/index.css"%}
{%
通过script插件收集JS片段 *%}
{%script%}var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F70b541fe48dd916f7163051b0ce5a0e3' type='text/javascript'%3E%3C/script%3E"));{%/script%}
{%/block%}
在模板框架中,对应的文件调用路径均为 modulename: 相对模块根目录的相对路径 :

//home为模块名,static/lib/css/bootstrap.css为绝对路径截取home模块根目录后的路径
{%require name="home:static/lib/css/bootstrap.css"%}
前端模板
在 FIS 中,集成了 百度前端模板。在编译过程中,会静态编译 baidu template,不需要线上编译,提高页面运行效率。

在 JS 代码中,通过 __inline 方式进行编译处理前端模板。同时规定以 tmpl 为后缀的文件为前端模板,使用方式:

//编译前
var demoTemplate = __inline('demo.tmpl');
//编译后
var demoTemplate = function (_template_object) {
.......
};
在使用前端模板时需要注意的问题:

//在__inline前端模板前加载template对象
require("common:static/lib/template.js")
//或者通过全局加载的方式
{%require name="common:static/lib/template.js"%}
template 的安装方式

//在common的static/lib目录下执行下面命令
$ lights install template
模板组件化
模板组件是能独立提供功能且能够复用的页面片段,所在规范目录 模块根目录 /widget/ ,模板组件以模板、JS 组件、CSS 组件组成(默认必须有模板)。

widget 定义
只要在 widget 目录下的 Smarty 模板即为模板组件, 目录下有与模板同名的 JS、CSS 文件 FIS 会自动添加依赖关系处理,在模板渲染时进行同步加载 。

widget 调用
调用一个模板组件需要通过 widget 语法,如我们想调用 home 下的 section 模板组件,则语法为

//调用模板的路径为 modulename:模板在widget目录下路径
{%widget name="home:widget/section/section.tpl" %}
widget 函数调用方式
widget 插件可以直接调用某个 smarty 的 function 函数,使用方式为:

//在模板中定义function函数
{%function name="functionDemo"%}
.............

//在模板中调用此函数
{%widget call="functionDemo" %}
Smarty 插件
FIS-PLUS 提供一套基于 smarty(version >= 3.1.13) 插件的后台运行框架,针对静态资源管理、模板模块化、pagelet 等功能。

html
功能:代替\标签,设置页面运行的前端框架,以及控制整体页面输出。
属性值:framework及html标签原生属性值
是否必须:是
用法:在模板中替换普通\标签
{%html framework="home:static/lib/mod.js"%}
....

head
功能:代替\标签,控制CSS资源加载输出。
属性值:head标签原生属性值
是否必须:是
用法:在模板中替换普通\标签
{%html framework="home:static/lib/mod.js"%}
{%head%}

{%/head%}
{%/html%}
head

body
功能:代替\标签,控制JS资源加载输出。
属性值:body标签原生属性值
是否必须:是
用法:在模板中替换普通\标签
{%html framework="home:static/lib/mod.js"%}
{%head%}

{%/head%}
{%body%}
....
{%/body%}
{%/html%}
body

script
功能:代替 上面是正常的使用方式,就像 方案二 中说到的,如何让渲染 index.tpl 时不展示 widget_A 呢。

{%widget name="demo:widget/widget_A/widget_A.tpl" mode="quickling" pagelet_id="widget_A"%}
OK,改造完成。 加了 mode="quickling" 和pagelet_id="widget_A"这俩参数。 这时候渲染页面的结果是什么呢?

.....
..... 如上代码,做了俩事情。

挖了个坑

,异步请求回来的widget_A的html就放在这个坑了。
在textarea里面打了一个JS函数,这个思路来自bigrender,可以在页面滚动到那个部位才去拉取数据。
等页面渲染完后,开发的同学需要做什么,他只需要把 textarea 里面的代码根据自己的需求执行就成,比如滚轮滚那个地方,domready 后。。。这个自己决定。

说到这里我想你也知道如何使用了。

使用步骤 :

widget调用的时候设定这个widget的 渲染模式 为quickling,mode="quickling"
widget调用的时候设定pagelet_id, pagelet_id="widget_A"
运行时,取出class="fis_g_bigrender"中包含的代码,运行它
页面引入前端加载器BigPipe.js
项目中使用方案提供的smarty 插件
相关资源 :

demo
Smarty 插件
优点和缺点
有了使用场景而且也知道如何使用,那现在开始总结一下它到底有哪些优点,事物都是双面的当然也有缺点。这栏总结一下整个方案的优缺点。按照一贯的做法,先说优点。

优点
灵活 页面widget可以灵活请求
可维护性高 FIS用户项目都是组件化的,维护肯定是最好的
使用简单 只需要关注那些页面部分想后展示、具体展示的时机
能解决特定问题 案例一和案例二已经说明了这一点。
缺点
增加了请求 一个页面渲染,如果某一个widget显然模式是“quickling”,那么渲染页面就会多一次请求
增加了服务器负担
性能本来就是一个折中,方案有优缺点,就看具体场景需要了。

国际化解决方案
国际化解决方案适应于国际化多语言支持的解决方案.

解决当语言增多时出现的文件成倍增长的问题
支持动态加载,运行时分析
解决本地编译效率低下、国际化目录规范复杂开发成本高等问题
背景
国际化是指产品、应用或者内容的设计和开发可以使得不同语言、文化、地区的目标受众容易接受和实现本地化这个单词一般被缩写成 i18n

国际化过程由如下基本的必要属性:

设计和开发方式必须要能够容易的实现本地化和通用部署,包括使用 unicode 字符,确保对老的字符编码做了处理等等

提供一些只有在某些情况下才会使用的本地化特性。比如在 HTML 的 DTD 中支持双向的文本展示特性,或者标示出语言,或者在 CSS 中提供支持文字垂直方向展示等等

能够支持一些本地区域的语言和文化展现,如加入一些预定义的本地化数据或者从当地图书馆导出的用户属性,比如时间和日期的格式化展现,数字格式化,排序方式,用户名展示方式等等

从源码中区分本地化的元素和内容,比如本地化备选展现方式可以通过用户在界面上选择后再独立展现

产品国际化的基本流程
产品调研和确定目标市场
给出产品需要的功能需求文档
研发人员调研目标市场的本地化特性,评审需求文档
设计、开发
联调、测试,翻译语言
效果确认,语言确认
上线,效果确认,语言确认
前端开发调研点
前端开发调研点
语言特性
是否有单复数
字符的字节数
人称属性,比如他它她
性别属性,某些动词会因为性别属性不一样而表现不一样
语言展示的方向:LTR,RTL,VERTICAL
时间日期
时间的显示格式
日期的显示格式
是否有本土化的日期显示方式(如中文: 2012年12月30日,泰语佛历显示等)
时区标示符,参考这里
其它格式化内容
数字格式化显示
货币符号
字符行高,字体大小
本地优化特性
虚拟键盘支持(阿语)
输入法支持(越南语有输入法的支持)
RTL语言的自动识别
FIS 国际化方案
自动抽取所有的词条
css RTL自动转换
运行时展示不同语言
根据 gettext 的思路,一份代码在不同语言环境下展示不同语言。

使用
下载demo
编译发布项目
fisp release -r common
fisp release -r i18n
预览 http://127.0.0.1:8080
如何开发
按照上面说的使用方法,已经在本地模拟一个国际化项目。修改测试数据 i18n 字段,为 en_US、ja_JP 或其他分别看看效果。

'en_US' ); ?>

进入模块 i18n,详细了解一下目录结构;

└── i18n
├── fis-conf.js
├── lang #语言目录
│ ├── en_US.po
│ └── ja_JP.po
├── page
├── server.conf
├── static
├── test
└── widget
当这个模块 release 以后得到如下结果;

.
├── config
│ ├── i18n-map.json
│ └── lang
│ ├── i18n.en_US.json
│ └── i18n.ja_JP.json
├── server-conf
│ └── i18n.conf
├── static
│ └── i18n
│ ├── mod.js
│ └── widget
├── template
│ └── i18n
│ ├── page
│ └── widget
└── test
└── i18n
└── page
可以看到 config/lang 目录下是一些 JSON 翻译文件。翻译文件格式为;

{
"原文": "译文",
"原文1": "译文1"
}
这样当运行时调用了翻译函数,翻译函数读取对应的翻译文件展示译文。

翻译函数
JS中的语言
Smarty模板中的语言
js 中的语言:

var str = __('中文');
Smarty 模板中的语言:

{%'中文'|gettext%}
综述,开发过程;

功能开发完成后,通过fisp xgettext抽取所有的词条,产出.en_US.po等语言文件
开发人员完善po文件
编译项目fisp release -r project
fis在编译过程中,分析po文件,生成.en_US.json语言翻译文件key=>value
运行时执行{%'xxxx'|gettext%}函数时,根据语言类型,读取对应的翻译文字并展示
更多资料
更多国际化资料 [http://fe.baidu.com/doc/i18n/]

Home
快速入门
本地开发
目录规范
三种语言能力
模板开发
Smarty 插件
JS & CSS
编译优化工具
打包合并
配置
上传测试机
上线部署
测试联调
本地测试数据
本地 URL 模拟转发
线上调试
Quickling 解决方案
国际化解决方案

posted @ 2018-02-28 17:33  Elion_Zhang  阅读(312)  评论(0)    收藏  举报