2019-06-25 13:29:10 +00:00
|
|
|
|
package cn.glycol.t18n;
|
|
|
|
|
|
2019-06-26 09:10:15 +00:00
|
|
|
|
import java.io.BufferedReader;
|
2019-06-25 13:29:10 +00:00
|
|
|
|
import java.io.File;
|
2019-06-26 09:10:15 +00:00
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.InputStreamReader;
|
2019-07-11 06:26:17 +00:00
|
|
|
|
import java.nio.charset.Charset;
|
2019-06-25 13:38:19 +00:00
|
|
|
|
import java.util.ArrayList;
|
2019-06-25 13:29:10 +00:00
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
public class LanguageMapBuilder {
|
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 从文件读取语言包
|
|
|
|
|
* @param langFile 语言文件
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-06-25 13:29:10 +00:00
|
|
|
|
public static LanguageMap fromFile(File langFile) {
|
|
|
|
|
return fromFile(langFile, LanguageMapConfiguration.DEFAULT);
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 从文件读取语言包
|
|
|
|
|
* @param langFile 语言文件
|
|
|
|
|
* @param config 读取配置
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-06-25 13:29:10 +00:00
|
|
|
|
public static LanguageMap fromFile(File langFile, LanguageMapConfiguration config) {
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
|
|
|
|
List<String> lines = T18nUtils.getLocalContent(langFile);
|
|
|
|
|
return processFinal(config, lines);
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 以 UTF8 为编码读取Jar包里的资源
|
|
|
|
|
* @param path 资源地址
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-07-01 09:22:54 +00:00
|
|
|
|
public static LanguageMap fromJarResource(String path) {
|
2019-07-11 06:26:17 +00:00
|
|
|
|
return fromJarResource(path, "UTF8", LanguageMapConfiguration.DEFAULT);
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 用设定编码读取Jar包里的资源
|
|
|
|
|
* @param path 资源地址
|
|
|
|
|
* @param encode 编码名称,例如<code>UTF-8</code>,<code>GBK</code>,<code>Unicode</code>等等。
|
|
|
|
|
* @param config 读取配置
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-07-11 06:26:17 +00:00
|
|
|
|
public static LanguageMap fromJarResource(String path, String encode, LanguageMapConfiguration config) {
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
|
|
|
|
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
|
|
|
|
|
if (is == null) {
|
|
|
|
|
return new LanguageMap();
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-11 06:26:17 +00:00
|
|
|
|
BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName(encode)));
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
|
|
|
|
String cache;
|
|
|
|
|
List<String> strs = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
while (true) {
|
|
|
|
|
if ((cache = br.readLine()) != null) {
|
|
|
|
|
strs.add(cache);
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
|
|
|
|
return processFinal(config, strs);
|
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 从在线页面读取语言包
|
|
|
|
|
* @param url 页面地址
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-07-01 09:22:54 +00:00
|
|
|
|
public static LanguageMap fromURL(String url) {
|
|
|
|
|
return fromURL(url, LanguageMapConfiguration.DEFAULT);
|
|
|
|
|
}
|
2019-06-25 13:29:10 +00:00
|
|
|
|
|
2019-07-12 05:55:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* 从在线页面读取语言包
|
|
|
|
|
* @param url 页面地址
|
|
|
|
|
* @param config 读取配置
|
|
|
|
|
* @return 语言包
|
|
|
|
|
*/
|
2019-07-01 09:22:54 +00:00
|
|
|
|
public static LanguageMap fromURL(String url, LanguageMapConfiguration config) {
|
|
|
|
|
return processFinal(config, T18nUtils.getOnlineContent(url));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final String[] UNREADABLE = new String[] { null, null };
|
|
|
|
|
|
|
|
|
|
/** 处理单行翻译 */
|
|
|
|
|
private static String[] process(LanguageMapConfiguration config, String s) {
|
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
/* Empty Line */
|
2019-07-01 09:22:54 +00:00
|
|
|
|
if (s == null || s.length() == 0) {
|
2019-06-25 13:29:10 +00:00
|
|
|
|
return UNREADABLE;
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
/* Annotation */
|
2019-07-01 09:22:54 +00:00
|
|
|
|
if (config.isAnnotation(s)) {
|
2019-06-25 13:29:10 +00:00
|
|
|
|
return UNREADABLE;
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
String[] parts = s.split(config.getSplitter(s), 2);
|
|
|
|
|
|
2019-07-01 09:22:54 +00:00
|
|
|
|
/* Part fewer than 2 */
|
|
|
|
|
if(parts.length < 2) {
|
|
|
|
|
return UNREADABLE;
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
/* The Key is Null */
|
2019-07-01 09:22:54 +00:00
|
|
|
|
if (parts[0] == null || parts[0].length() == 0) {
|
2019-06-25 13:29:10 +00:00
|
|
|
|
return UNREADABLE;
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
/* The Value is Null */
|
2019-07-01 09:22:54 +00:00
|
|
|
|
if (parts[1] == null) {
|
2019-06-25 13:29:10 +00:00
|
|
|
|
parts[1] = "null";
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
return parts;
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
private static boolean isUnreadable(String[] s) {
|
|
|
|
|
return s[0] == null;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-01 09:22:54 +00:00
|
|
|
|
/** 将处理的结果整合到翻译表中 */
|
|
|
|
|
private static LanguageMap processFinal(LanguageMapConfiguration config, List<String> lines) {
|
2019-06-26 09:10:15 +00:00
|
|
|
|
|
2019-07-01 09:22:54 +00:00
|
|
|
|
final LanguageMap map = new LanguageMap();
|
|
|
|
|
|
|
|
|
|
for (String s : lines) {
|
|
|
|
|
String[] pair = process(config, s);
|
|
|
|
|
if (!isUnreadable(pair)) {
|
|
|
|
|
map.put(pair[0], pair[1]);
|
2019-06-26 09:10:15 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
|
|
|
|
return map;
|
|
|
|
|
|
2019-06-26 09:10:15 +00:00
|
|
|
|
}
|
2019-07-01 09:22:54 +00:00
|
|
|
|
|
2019-06-25 13:29:10 +00:00
|
|
|
|
}
|