JeeSite 快速开发平台
官方网站
    • 平台简介
    • 架构特点
    • 技术选型
    • 功能介绍
    • 安装部署
    • 常见问题
    • 目录结构
    • 更新日志
    • Vue 文档
    • BPM 文档
    • Cloud 文档
V4 演示
Vue 演示
💖联系
  • 我要提意见、文档纠错
  • JeeSite 代码库, 请⭐Star关注
  • JeeSite Vue 代码库, 请⭐关注
  • Spring Cloud 微服务架构
  • JeeSite 手机端/移动端
  • Flowable 中国式工作流
  • OAauth2 统一认证服务器
  • 政务内外网环境中间件
  • 访问 ThinkGem 官方博客
  • 点击进入,下拉查看动态
官方网站
    • 平台简介
    • 架构特点
    • 技术选型
    • 功能介绍
    • 安装部署
    • 常见问题
    • 目录结构
    • 更新日志
    • Vue 文档
    • BPM 文档
    • Cloud 文档
V4 演示
Vue 演示
💖联系
  • 我要提意见、文档纠错
  • JeeSite 代码库, 请⭐Star关注
  • JeeSite Vue 代码库, 请⭐关注
  • Spring Cloud 微服务架构
  • JeeSite 手机端/移动端
  • Flowable 中国式工作流
  • OAauth2 统一认证服务器
  • 政务内外网环境中间件
  • 访问 ThinkGem 官方博客
  • 点击进入,下拉查看动态
  • 快速了解

  • 开发手册

    • 快速开始、安装部署
    • 代码生成、表结构 ER 图
    • 持久层、@Table、多数据源
    • 业务层、数据权限、库事务
    • 控制层、功能权限、Shiro
    • 后台常用工具类、Utils
    • Form 表单组件、Beetl
    • Data Grid 表格组件
    • JS 常用工具和组件
    • 修改内置登录页面
    • 国际化、多语言
      • 特点
      • 语言文件
        • 后端语言文件
        • 前端语言文件
      • 语言调用方法
        • Java
        • Beetl视图
        • JavaScript
        • 常用语言编码
      • 词条抽取工具
    • API 接口开发
    • ★ 常见问题 ★
  • Vue 开发手册

  • 扩展功能专题

  • 云服务技术架构

  • 技术服务与支持

国际化(i18n)、多语言、本地化使用文档

# 特点

1、支持登录时,指定语言,或登录后进行语言切换(param_lang=en)
2、支持 Cookie 存储语言设置,没有 Cookie 的情况使用 Session 存储,支持移动端
3、支持 properties 文件、数据库存储译文,方便译文数据进行管理。
4、可翻译:固定数据(如:页面标题、标签、消息提示)、动态数据(如:菜单数据、字典数据等)
5、中文免写 zh_CN 译文,如:text(‘你好’),找不到对应 key 直接原样输出 “你好”
6、支持 key 和译文参数,如:text(‘今天第{0}天’, 3),输出 “今天第3天”
7、支持 key 加前缀,方便区分模块,如:text(‘$user.你好’),输出 “你好”
8、使用中文Code,易于使用,易于分析源码,易于开发人员产品维护

注意此功能是专业版功能,只有专业版才能使用。

# 语言文件

# 后端语言文件

# 固定数据语言

不会变化的文字翻译,如:某个提示信息,字段 label,列表标题,按钮文字等,这些译文需要放到 properties 里。

文件目录结构,支持模块化分类语言文件结构,如下:

/src/main/resources/i18n/模块编码/i18n_语言编码.properties
1

例如:msg 模块 en 译文配置:

/src/main/resources/i18n/msg/i18n_en.properties
1

文件内容:

  • 文件内容采用 key=value 方式存储,如:你好=Hello
  • 若Key中包含空格,可使用“\”转义,如:提\ 交=Submit
  • 带参数的译文,如:今天第\ {0}\ 天。= Today is the {0} day.

在系统字典中维护新增加的语言:sys_lang_type,字典编码为语言编码;

# 动态数据语言

业务或管理员可通过数据库进行修改或配置的一些文字译文,如菜单名称,字典名称,字典值等。

这些可通过 system 账号登录,进入菜单 “系统管理 -> 系统设置 -> 国际化管理” 添加译文。

# 前端语言文件

根据需求自己扩展语言文件,例如:

<script src="${ctxStatic}/modules/i18n/i18n_${lang()}.js" ></script>
1

举例内容如下:

window.jeesiteMessage = $.extend({}, window.jeesiteMessage, {
    '你好' : 'Hello',
    '今天第 {0} 天' : ' Today is the {0} day.'
});
1
2
3
4

# 语言调用方法

# Java

1、获取语言名称:Global.getLang()

返回:en、zh_CN

2、获取语言编码译文:Global.getText(code)

例如:Global.getText("你好")

3、获取语言编码译文,支持参数:Global.getText(code, params...)

例如:Global.getText("今天第{0}天", 3)

4、在集成 BaseController 和 BaseService 的类里可直接通过

例如:text(code) 或 text(code, params...)

# Beetl视图

1、获取语言名称:${lang()}

返回:en、zh_CN

2、获取语言编码译文:${text(code)}

例如:${text("你好")}

3、获取语言编码译文,支持参数:${text(code, params...)}

例如:${text("今天第{0}天", 3)}

# JavaScript

1、获取语言名称:window.lang || 'zh_CN'

返回:en、zh_CN

2、获取语言编码译文:text(code)

例如:text("你好")

3、获取语言编码译文,支持参数: text(code, params...)

例如:text("今天第{0}天", 3)

# 常用语言编码

java.util.Locale :

public static final Locale ENGLISH = createConstant("en", "");
public static final Locale FRENCH = createConstant("fr", "");
public static final Locale GERMAN = createConstant("de", "");
public static final Locale ITALIAN = createConstant("it", "");
public static final Locale JAPANESE = createConstant("ja", "");
public static final Locale KOREAN = createConstant("ko", "");
public static final Locale CHINESE = createConstant("zh", "");
public static final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
public static final Locale TRADITIONAL_CHINESE = createConstant("zh", "TW");
public static final Locale FRANCE = createConstant("fr", "FR");
public static final Locale GERMANY = createConstant("de", "DE");
public static final Locale ITALY = createConstant("it", "IT");
public static final Locale JAPAN = createConstant("ja", "JP");
public static final Locale KOREA = createConstant("ko", "KR");
public static final Locale CHINA = SIMPLIFIED_CHINESE;
public static final Locale PRC = SIMPLIFIED_CHINESE;
public static final Locale TAIWAN = TRADITIONAL_CHINESE;
public static final Locale UK = createConstant("en", "GB");
public static final Locale US = createConstant("en", "US");
public static final Locale CANADA = createConstant("en", "CA");
public static final Locale CANADA_FRENCH = createConstant("fr", "CA");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

语言代码表:http://www.lingoes.cn/zh/translator/langcode.htm (opens new window)

# 词条抽取工具

感谢 SoleMan 分享,词条抽取工具,可快速将 字典、菜单、源文件 中的译文编码抽取出来。

字典抽取:

INSERT IGNORE INTO js_sys_lang (id, module_code, lang_code, lang_text, lang_type, create_by, create_date, update_by, update_date, remarks)
select distinct md5(dict_label) as id, 'core' as module_code, dict_label as lang_code, '' as lang_text, 'en' as lang_type, 'system' as create_by, now() as create_date, 'system' as update_by, now() as update_date, 'dict' as remarks
from js_sys_dict_data;
1
2
3

菜单抽取:

INSERT IGNORE INTO js_sys_lang (id, module_code, lang_code, lang_text, lang_type, create_by, create_date, update_by, update_date, remarks)
select distinct md5(menu_name) as id, 'core' as module_code, menu_name as lang_code, '' as lang_text, 'en' as lang_type, 'system' as create_by, now() as create_date, 'system' as update_by, now() as update_date, 'menu' as remarks
from js_sys_menu;
1
2
3

源文件抽取(找到未国际化的汉字):

package com.jeesite.test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.jeesite.common.io.FileUtils;
import com.jeesite.common.lang.StringUtils;

/**
 * 根据文件类型提取词条(找到未国际化的汉字)
 * @author wujie, soleman, jeesite
 */
public class I18nEntryExtractor {

	private static Set<String> unfinishedOut = new LinkedHashSet<>();
	private static Set<String> unfinishedSet = new LinkedHashSet<>();

	/**
	 * 根据文件类型提取词条
	 */
	public static void main(String[] args) throws Exception {
		String[] types = new String[] { ".java", ".html", ".js" };
		String rootPath = FileUtils.getProjectPath();
		System.out.println("Root Path: " + rootPath);
		extracted(rootPath + "/src/main/java", types);
		extracted(rootPath + "/src/main/resources/views", types);
	}

	private static void extracted(String mainPath, String[] types) throws Exception {
		Set<String> sets = new LinkedHashSet<>();

		Files.walk(Paths.get(mainPath))
			.filter(file -> StringUtils.endsWithAny(file.toString(), types))
			.sorted((f1, f2) -> {
				return StringUtils.substringAfterLast(f1.toString(), ".")
						.compareTo(StringUtils.substringAfterLast(f2.toString(), "."));
			})
			.forEach(file -> {
				// System.out.println("# Processing file " + file.toString());
				try {
					Files.lines(file).forEach(line -> {
						// 过滤掉注释和注解
						String regex = "^[\\s\t]*(//|\\*|@).*";
						if (!line.matches(regex)) {
							extractChineseEntry(file.getFileName().toString(), line, sets);
						}
					});
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (!unfinishedSet.isEmpty()) {
					unfinishedOut.add("**************" + file.toString() + "**************");
					unfinishedOut.addAll(unfinishedSet);
					unfinishedOut.add("\n");
					unfinishedSet.clear();
				}
			});

		sets.forEach(entry -> {
			System.out.println(entry);
		});
		System.out.println("# Total: " + sets.size());
		
		Thread.sleep(1000);
		unfinishedOut.forEach(System.err::println);
		unfinishedOut.clear();
	}

	/**
	 * 正则提取汉字
	 */
	public static void extractChineseEntry(String file, String line, Set<String> sets) {
		// 提取单引号或双引号内的中文词条
		String regex = "(?:['\"]([^'\"]*?[\u4e00-\u9fa5]+?[^'\"]*?)['\"])";
		Matcher matcher = Pattern.compile(regex).matcher(line);
		while (matcher.find()) {
			if (!StringUtils.contains(line, "text(")) {
				unfinishedSet.add(line);
			}
			sets.add(matcher.group(1));
		}
	}
	
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
进入 JeeSite 源码仓库页面,点击右上角 ⭐ Star 加星关注。

← 修改内置登录页面 API 接口开发→

联系我们:s.jeesite.com  |  微信号:jeesitex  |  邮箱:jeesite@163.com
© 2013-2023 济南卓源软件有限公司 版权所有 | Theme Vdoing

关注 JeeSite 公众号,了解最新动态

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式