forked from ares-emulator/ares
-
Notifications
You must be signed in to change notification settings - Fork 0
/
locale.hpp
87 lines (75 loc) · 2.21 KB
/
locale.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#pragma once
namespace nall {
struct Locale {
struct Dictionary {
string location;
string language;
Markup::Node document;
};
auto scan(string pathname) -> void {
dictionaries.reset();
selected.reset();
for(auto filename : directory::icontents(pathname, "*.bml")) {
Dictionary dictionary;
dictionary.location = {pathname, filename};
dictionary.document = BML::unserialize(string::read(dictionary.location));
dictionary.language = dictionary.document["locale/language"].text();
dictionaries.append(dictionary);
}
}
auto available() const -> vector<string> {
vector<string> result;
for(auto& dictionary : dictionaries) {
result.append(dictionary.language);
}
return result;
}
auto select(string option) -> bool {
selected.reset();
for(auto& dictionary : dictionaries) {
if(option == Location::prefix(dictionary.location) || option == dictionary.language) {
selected = dictionary;
return true;
}
}
return false;
}
template<typename... P>
auto operator()(string ns, string input, P&&... p) const -> string {
vector<string> arguments{std::forward<P>(p)...};
if(selected) {
for(auto node : selected().document) {
if(node.name() == "namespace" && node.text() == ns) {
for(auto map : node) {
if(map.name() == "map" && map["input"].text() == input) {
input = map["value"].text();
break;
}
}
}
}
}
for(u32 index : range(arguments.size())) {
input.replace({"{", index, "}"}, arguments[index]);
}
return input;
}
struct Namespace {
Namespace(Locale& _locale, string _namespace) : _locale(_locale), _namespace(_namespace) {}
template<typename... P>
auto operator()(string input, P&&... p) const -> string {
return _locale(_namespace, input, std::forward<P>(p)...);
}
template<typename... P>
auto tr(string input, P&&... p) const -> string {
return _locale(_namespace, input, std::forward<P>(p)...);
}
private:
Locale& _locale;
string _namespace;
};
private:
vector<Dictionary> dictionaries;
maybe<Dictionary&> selected;
};
}