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