comparison libs/AceLocale-2.1/AceLocale-2.1.lua @ 1:c11ca1d8ed91

Version 0.1
author Flick <flickerstreak@gmail.com>
date Tue, 20 Mar 2007 21:03:57 +0000
parents
children
comparison
equal deleted inserted replaced
0:4e2ce2894c21 1:c11ca1d8ed91
1 --[[
2 Name: AceLocale-2.1
3 Revision: $Rev: 18753 $
4 Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
5 Inspired By: Ace 1.x by Turan (turan@gryphon.com)
6 Website: http://www.wowace.com/
7 Documentation: http://www.wowace.com/index.php/AceLocale-2.1
8 SVN: http://svn.wowace.com/root/trunk/Ace2/AceLocale-2.1
9 Description: Localization library for addons to use to handle proper
10 localization and internationalization.
11 Dependencies: AceLibrary
12 ]]
13
14 local MAJOR_VERSION = "AceLocale-2.1"
15 local MINOR_VERSION = "$Revision: 18753 $"
16
17 if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end
18 if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
19
20 local curTranslation, baseTranslation, translations, baseLocale, curLocale, strictTranslations, dynamic, reverseTranslation
21 local AceLocale = {}
22 local backbone = {}
23 backbone.class, backbone.super = false, false
24
25 local function initReverse(self)
26 self[reverseTranslation] = {}
27
28 for k, v in pairs(self[curTranslation]) do self[reverseTranslation][v] = k end
29
30 setmetatable(self[reverseTranslation], {
31 __index = function(tbl, key)
32 AceLocale:error("Reverse translation for %s not found", key)
33 end
34 })
35 end
36
37 local function __call(obj, text, flag)
38 if flag == nil then return obj[text] end
39
40 if flag == true then
41 if rawget(obj[curTranslation], text) then AceLocale:error("Strict translation for %s not found", text) end
42 return rawget(obj[curTranslation], text)
43 elseif flag == false then
44 return rawget(obj[curTranslation], arg2) or obj[baseTranslation][arg2]
45 elseif flag == "reverse" then
46 if not rawget(obj, reverseTranslation) then initReverse(obj) end
47 return obj[reverseTranslation][text]
48 else
49 AceLocale:error("Invalid flag given to __call. Should be true/false/\"reverse\" but %s was given", flag)
50 end
51 end
52
53 local function NewInstance(self, uid)
54 if self.registry[uid] then return self.registry[uid] end
55
56 self.registry[uid] = {}
57 self.registry[uid][translations] = {}
58
59 setmetatable(self.registry[uid], {
60 __tostring = function()
61 return "AceLocale(" .. uid .. ")"
62 end,
63 __call = __call,
64 __index = backbone
65 })
66
67 return self.registry[uid]
68 end
69
70 function AceLocale:RegisterTranslation(uid, locale, func)
71 error(MAJOR_VERSION .. " is not supported in WoW 2.0", 2)
72 self:argCheck(uid, 1, "string")
73 self:argCheck(locale, 2, "string")
74 self:argCheck(func, 3, "function")
75
76 local instance = self.registry[uid] or NewInstance(self, uid)
77
78 if instance[translations][locale] then
79 self:error("Cannot provide the same locale more than once. %q provided twice for %s.", locale, uid)
80 end
81
82 if rawget(instance, baseLocale) then
83 for k, v in pairs(func()) do
84 if not rawget(instance[baseTranslation], k) then
85 self:error("Improper translation exists. %q is likely misspelled for locale %s.", k, locale)
86 elseif value == true then
87 self:error( "Can only accept true as a value on the base locale. %q is the base locale, %q is not.", instance[baseLocale], locale)
88 end
89 end
90 else
91 instance[baseTranslation] = func()
92 instance[baseLocale] = locale
93
94 for k, v in pairs(instance[baseTranslation]) do
95 if type(v) ~= "string" and type(v) ~= "table" then
96 if type(v) == "boolean" then
97 instance[baseTranslation][k] = k
98 else
99 self:error("Translation for %s is invalid. Must be either string or boolean", k)
100 end
101 end
102 end
103
104 setmetatable(instance[baseTranslation], {__index = backbone})
105 end
106
107 instance[translations][locale] = func
108 end
109
110 function AceLocale:GetInstance(uid, locale)
111 self:argCheck(uid, 1, "string")
112
113 local instance = self.registry[uid]
114
115 if not instance then self:error("At least one translation must be registered before you can GetInstance().") end
116
117 instance:SetLocale(locale)
118
119 return instance
120 end
121
122 function AceLocale:HasInstance(uid)
123 self:argCheck(uid, 1, "string")
124 return self.registry[uid] and true or false
125 end
126
127 setmetatable(backbone, {__index =
128 function(tbl, key)
129 AceLocale:error("Translation for %s not found", key)
130 end})
131
132 function backbone:SetLocale(locale)
133 local loose = false
134 if locale == nil then return end
135
136 if locale == true then
137 locale = GetLocale()
138 if rawget(self, curLocale) and self[curLocale] == locale then return end
139 if not self[translations][locale] then locale = self[baseLocale] end
140 end
141
142 if rawget(self, curLocale) and self[curLocale] == locale then return end
143
144 if not self[translations][locale] then
145 AceLocale:error("Cannot SetLocale to %s for %s, It has not been registered.", locale, tostring(self))
146 end
147
148 if self[translations][locale] and self[baseLocale] == locale then
149 self[curLocale] = self[baseLocale]
150 self[curTranslation] = {}
151 getmetatable(self).__index = self[baseTranslation]
152 else
153 self[curLocale] = locale
154 self[curTranslation] = self[translations][locale]()
155 getmetatable(self).__index = self[curTranslation]
156 end
157
158 if rawget(self, strictTranslations) then
159 setmetatable(self[curTranslation], {
160 __index = function(tbl, key)
161 AceLocale:error("Translation for %s not found", key)
162 end
163 })
164 else
165 setmetatable(self[curTranslation], {
166 __index = self[baseTranslation]
167 })
168 end
169
170 if not rawget(self, dynamic) then
171 self[translations] = {}
172 end
173
174 if rawget(self, reverseTranslation) then
175 self[reverseTranslation] = nil
176 end
177 end
178
179 function backbone:ClearLocales()
180 self[translations] = {}
181 self[curLocale] = nil
182 self[baseLocale] = nil
183 end
184
185 function backbone:SetDynamicLocales(flag)
186 AceLocale:argCheck(flag, 1, "boolean")
187 self[dynamic] = flag
188 end
189
190 function backbone:SetStrictness(flag)
191 AceLocale:argCheck(flag, 1, "boolean")
192 local mt
193
194 if rawget(self, curTranslation) then
195 mt = getmetatable(self[curTranslation])
196 end
197
198 if strict and mt then
199 mt.__index = function(tbl, key)
200 AceLocale:error("Translation for %s not found", key)
201 end
202 elseif mt then
203 mt.__index = self[baseTranslation]
204 end
205
206 self[strictTranslations] = strict
207 end
208
209 function backbone:HasTranslation(text)
210 AceLocale:argCheck(text, 1, "string")
211
212 if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasTranslation().") end
213
214 return rawget(self[curTranslation], text) and true or false
215 end
216
217 function backbone:HasReverseTranslation(text)
218 AceLocale:argCheck(text, 1, "string")
219
220 if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasReverseTranslation().") end
221
222 if not rawget(self, reverseTranslation) then
223 initReverse(self)
224 end
225
226 return rawget(self[reverseTranslation], text) and true or false
227 end
228
229 function backbone:GetIterator()
230 if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call GetIterator().") end
231 return pairs(self[curTranslation])
232 end
233
234 function backbone:GetReverseIterator()
235 if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasReverseTranslation().") end
236
237 if not rawget(self, reverseTranslation) then
238 initReverse(self)
239 end
240
241 return pairs(self[reverseTranslation])
242 end
243
244 function backbone:GetLocaleList()
245 local results = {}
246 for k, v in pairs(self[translations]) do tinsert(results, k) end
247 return results
248 end
249
250 local function activate(self, oldLib, oldDeactivate)
251 AceLocale = self
252
253 if oldLib then
254 self.registry = oldLib.registry
255 self.curTranslation = oldLib.curTranslation
256 self.baseTranslation = oldLib.baseTranslation
257 self.translations = oldLib.translations
258 self.baseLocale = oldLib.baseLocale
259 self.curLocale = oldLib.curLocale
260 self.strictTranslations = oldLib.strictTranslations
261 self.dynamic = oldLib.dynamic
262 self.reverseTranslation = oldLib.reverseTranslation
263 end
264
265 if not self.registry then self.registry = {} end
266 if not self.curTranslation then self.curTranslation = {} end
267 if not self.baseTranslation then self.baseTranslation = {} end
268 if not self.translations then self.translations = {} end
269 if not self.baseLocale then self.baseLocale = {} end
270 if not self.curLocale then self.curLocale = {} end
271 if not self.strictTranslations then self.strictTranslations = {} end
272 if not self.dynamic then self.dynamic = {} end
273 if not self.reverseTranslation then self.reverseTranslation = {} end
274
275 if oldDeactivate then
276 oldDeactivate(oldLib)
277 end
278
279 curTranslation = self.curTranslation
280 baseTranslation = self.baseTranslation
281 translations = self.translations
282 baseLocale = self.baseLocale
283 curLocale = self.curLocale
284 strictTranslations = self.strictTranslations
285 dynamic = self.dynamic
286 reverseTranslation = self.reverseTranslation
287 end
288
289 AceLibrary:Register(AceLocale, MAJOR_VERSION, MINOR_VERSION, activate)
290 AceLocale = AceLibrary(MAJOR_VERSION)