1 module evael.system.I18n; 2 3 import std.json; 4 import std.conv; 5 6 class I18n 7 { 8 private JSONValue m_texts; 9 10 public this() 11 { 12 13 } 14 15 /** 16 * Params: 17 * language : ISO 639-1 code. 18 */ 19 public void setLocale(in string language) 20 { 21 import std.file; 22 import std.exception; 23 24 immutable path = "medias/translations/" ~ language ~ ".json"; 25 26 enforce(path.exists(), "Unable to find translation for language " ~ language); 27 28 this.m_texts = parseJSON(read(path).to!string); 29 } 30 31 /** 32 * Returns a TranslationNode for a translation key 33 */ 34 @property 35 public auto opDispatch(string key)() 36 { 37 return TranslationNode(key in this.m_texts); 38 } 39 } 40 41 struct TranslationNode 42 { 43 private wstring m_textValue = "lang_error"; 44 private const(JSONValue)* m_jsonValue = null; 45 46 public this(const(JSONValue)* value) 47 { 48 this.m_jsonValue = value; 49 } 50 51 public this(in wstring value) 52 { 53 this.m_textValue = value; 54 } 55 56 @property 57 public auto opDispatch(string key)() 58 { 59 if(this.m_jsonValue !is null) 60 { 61 auto jsonValue = key in *this.m_jsonValue; 62 63 immutable type = jsonValue.type(); 64 65 if(type == JSON_TYPE.STRING || type == JSON_TYPE.OBJECT) 66 { 67 return TranslationNode(jsonValue); 68 } 69 } 70 71 return TranslationNode(this.m_textValue); 72 } 73 74 @property 75 public wstring str() 76 { 77 if(this.m_jsonValue !is null) 78 { 79 immutable type = this.m_jsonValue.type(); 80 81 if(type == JSON_TYPE.STRING) 82 { 83 return this.m_jsonValue.str.to!wstring; 84 } 85 } 86 87 return this.m_textValue; 88 } 89 }