diff --git a/src/main/haxework/macro/TemplateMacro.hx b/src/main/haxework/macro/TemplateMacro.hx index c30c17e..a3228a5 100644 --- a/src/main/haxework/macro/TemplateMacro.hx +++ b/src/main/haxework/macro/TemplateMacro.hx @@ -64,17 +64,19 @@ class TemplateMacro { private function specialValue(name:String, key:String, a:Array, position:JsonKeyPosition, exprs:Array):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": diff --git a/src/main/haxework/translate/ITranslate.hx b/src/main/haxework/translate/ITranslate.hx new file mode 100644 index 0000000..ad00225 --- /dev/null +++ b/src/main/haxework/translate/ITranslate.hx @@ -0,0 +1,9 @@ +package haxework.translate; + +interface ITranslate { + public function get(key:String):String; + public function format(key:String, args:Array):String; + public function formatPlurar(key:String, num:Int, args:Array):String; + public function getArray(key:String):Array; + public function getPlural(key:String, num:Int):String; +} diff --git a/src/main/haxework/translate/Translate.hx b/src/main/haxework/translate/Translate.hx new file mode 100644 index 0000000..dbe35d5 --- /dev/null +++ b/src/main/haxework/translate/Translate.hx @@ -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):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):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 { + var result = getObject(key); + return result != null ? result : []; + } + + public function getPlural(key:String, num:Int):String { + var array:Array = getArray(key); + switch (lang) { + case "ru": return plurarRU(array, num); + default: return plurarDefault(array, num); + } + } + + private function getObject(key:String):Dynamic { + var path:Array = 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, 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, num:Int):String { + var n:Int = num % 10; + switch (n) { + case 1: return strings[0]; + default: return strings[1]; + } + } +} diff --git a/src/main/haxework/translate/TranslateString.hx b/src/main/haxework/translate/TranslateString.hx new file mode 100644 index 0000000..1a4f2ba --- /dev/null +++ b/src/main/haxework/translate/TranslateString.hx @@ -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 = 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 = null) { + if (args != null) { + this = Provider.get(ITranslate).formatPlurar(value, num, args); + } else { + this = Provider.get(ITranslate).getPlural(value, num); + } + } +}