[translate] add

This commit is contained in:
2019-04-19 12:05:21 +03:00
parent cd6ad0e3ed
commit 7c879ee159
4 changed files with 126 additions and 2 deletions

View File

@@ -64,17 +64,19 @@ class TemplateMacro {
private function specialValue(name:String, key:String, a:Array<String>, position:JsonKeyPosition, exprs:Array<Expr>):Dynamic {
return switch (a[0]) {
case "asset":
case "asset" | "a":
switch (a[1]) {
case "image":
'openfl.Assets.getBitmapData("${a[2]}")';
case _:
a[2];
}
case "res" | "r":
case "resource" | "r":
var bindExpr = 'haxework.provider.Provider.get(haxework.resources.IResources).${a[1]}.bind("${a[2]}", ${name}, "${key}")';
exprs.push(Context.parse(bindExpr, getPosition(position)));
null;
case "translate" | "t":
'new haxework.translate.TranslateString("${a[1]}")';
case "code":
a[1];
case "this":

View File

@@ -0,0 +1,9 @@
package haxework.translate;
interface ITranslate {
public function get(key:String):String;
public function format(key:String, args:Array<Dynamic>):String;
public function formatPlurar(key:String, num:Int, args:Array<Dynamic>):String;
public function getArray(key:String):Array<String>;
public function getPlural(key:String, num:Int):String;
}

View File

@@ -0,0 +1,81 @@
package haxework.translate;
class Translate implements ITranslate {
public var lang(default, null):String;
private var data:Dynamic;
public function new(lang:String, data:Dynamic) {
this.lang = lang;
this.data = data;
}
public function format(key:String, args:Array<Dynamic>):String {
var string:String = get(key);
for (i in 0...args.length) {
var arg:Dynamic = args[i];
string = StringTools.replace(string, '{$i}', arg);
}
return string;
}
public function formatPlurar(key:String, num:Int, args:Array<Dynamic>):String {
var string:String = getPlural(key, num);
for (i in 0...args.length) {
var arg:Dynamic = args[i];
string = StringTools.replace(string, '{$i}', arg);
}
return string;
}
public function get(key:String):String {
var result = getObject(key);
return result != null ? result : key;
}
public function getArray(key:String):Array<String> {
var result = getObject(key);
return result != null ? result : [];
}
public function getPlural(key:String, num:Int):String {
var array:Array<String> = getArray(key);
switch (lang) {
case "ru": return plurarRU(array, num);
default: return plurarDefault(array, num);
}
}
private function getObject(key:String):Dynamic {
var path:Array<String> = key.split(".");
var tmp:Dynamic = data;
for (i in 0...path.length) {
if (Reflect.hasField(tmp, path[i])) {
tmp = Reflect.field(tmp, path[i]);
} else {
return null;
}
}
return tmp;
}
private function plurarRU(strings:Array<String>, num:Int):String {
if (num > 10 && num < 20) return strings[2];
var n:Int = num % 10;
switch (n) {
case 1: return strings[0];
case 2: return strings[1];
case 3: return strings[1];
case 4: return strings[1];
default: return strings[2];
}
}
private function plurarDefault(strings:Array<String>, num:Int):String {
var n:Int = num % 10;
switch (n) {
case 1: return strings[0];
default: return strings[1];
}
}
}

View File

@@ -0,0 +1,32 @@
package haxework.translate;
import haxework.provider.Provider;
abstract TranslateString(String) from String to String {
inline public function new(value:String, args:Array<Dynamic> = null) {
if (args != null) {
this = Provider.get(ITranslate).format(value, args);
} else {
this = Provider.get(ITranslate).get(value);
}
}
}
abstract TranslateArrayString(String) from String to String {
inline public function new(value:String, index:Int) {
this = Provider.get(ITranslate).getArray(value)[index];
}
}
abstract TranslatePluralString(String) from String to String {
inline public function new(value:String, num:Int, args:Array<Dynamic> = null) {
if (args != null) {
this = Provider.get(ITranslate).formatPlurar(value, num, args);
} else {
this = Provider.get(ITranslate).getPlural(value, num);
}
}
}