added locale and formatter
This commit is contained in:
39
haxework/format/Formatter.hx
Executable file
39
haxework/format/Formatter.hx
Executable file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
6
haxework/format/IFormatter.hx
Executable file
6
haxework/format/IFormatter.hx
Executable file
@@ -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;
|
||||||
|
}
|
||||||
8
haxework/locale/ILocale.hx
Executable file
8
haxework/locale/ILocale.hx
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
package haxework.locale;
|
||||||
|
|
||||||
|
interface ILocale {
|
||||||
|
public function getString(key:String):String;
|
||||||
|
public function formatString(key:String, args:Array<Dynamic>):String;
|
||||||
|
public function getArray(key:String):Array<String>;
|
||||||
|
public function getPlural(key:String, num:Int):String;
|
||||||
|
}
|
||||||
71
haxework/locale/Locale.hx
Executable file
71
haxework/locale/Locale.hx
Executable file
@@ -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<Dynamic>):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<String> {
|
||||||
|
return getObject(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user