diff --git a/haxework/format/Formatter.hx b/haxework/format/Formatter.hx new file mode 100755 index 0000000..81036d8 --- /dev/null +++ b/haxework/format/Formatter.hx @@ -0,0 +1,39 @@ +package haxework.format; + +import haxework.provider.Provider; +import haxework.locale.ILocale; + +class Formatter implements IFormatter { + + public function formatDate(date:Date, format:String):String { + var locale:ILocale = Provider.get(ILocale); + var r:EReg = ~/\{(\w+)\}/g; + return r.map(format, function(r:EReg):String { + var pattern:String = r.matched(1); + return switch(pattern) { + case "ss": doubleDigit(date.getSeconds()); + case "nn": doubleDigit(date.getMinutes()); + case "hh": doubleDigit(date.getHours()); + case "dd": doubleDigit(date.getDate()); + case "mm": doubleDigit(date.getMonth() + 1); + case "yyyy": date.getFullYear() + ""; + case "month": locale.getArray("month")[date.getMonth()]; + case "Month": firstLetterUp(locale.getArray("month")[date.getMonth()]); + default: return ""; + } + return r.matched(0); + }); + } + + private static function doubleDigit(num:Int):String { + return ((num < 10) ? "0" : "") + num; + } + + private static function firstLetterUp(s:String):String { + return s.charAt(0).toUpperCase() + s.substring(1); + } + + public function formatDateFloat(date:Float, format:String):String { + return formatDate(Date.fromTime(date), format); + } +} \ No newline at end of file diff --git a/haxework/format/IFormatter.hx b/haxework/format/IFormatter.hx new file mode 100755 index 0000000..6f4a333 --- /dev/null +++ b/haxework/format/IFormatter.hx @@ -0,0 +1,6 @@ +package haxework.format; + +interface IFormatter { + public function formatDate(date:Date, format:String):String; + public function formatDateFloat(date:Float, format:String):String; +} \ No newline at end of file diff --git a/haxework/locale/ILocale.hx b/haxework/locale/ILocale.hx new file mode 100755 index 0000000..6c98b27 --- /dev/null +++ b/haxework/locale/ILocale.hx @@ -0,0 +1,8 @@ +package haxework.locale; + +interface ILocale { + public function getString(key:String):String; + public function formatString(key:String, args:Array):String; + public function getArray(key:String):Array; + public function getPlural(key:String, num:Int):String; +} \ No newline at end of file diff --git a/haxework/locale/Locale.hx b/haxework/locale/Locale.hx new file mode 100755 index 0000000..7088a23 --- /dev/null +++ b/haxework/locale/Locale.hx @@ -0,0 +1,71 @@ +package haxework.locale; + +class Locale implements ILocale { + + private var data:Dynamic; + private var lang:String; + + public function new(lang:String, data:Dynamic) { + this.lang = lang; + this.data = data; + } + + public function formatString(key:String, args:Array):String { + var string:String = getString(key); + for (i in 0...args.length) { + var arg:Dynamic = args[i]; + string = StringTools.replace(string, "{" + i + "}", arg); + } + return string; + } + + public function getString(key:String):String { + return getObject(key); + } + + public function getArray(key:String):Array { + return getObject(key); + } + + + 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]; + } + } +} \ No newline at end of file