added locale and formatter

This commit is contained in:
2013-11-22 17:14:25 +04:00
parent cba776ec51
commit f9a616de19
4 changed files with 124 additions and 0 deletions

39
haxework/format/Formatter.hx Executable file
View 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
View 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
View 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
View 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];
}
}
}