diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libs/AceLocale-2.1/AceLocale-2.1.lua	Tue Mar 20 21:03:57 2007 +0000
@@ -0,0 +1,290 @@
+--[[
+Name: AceLocale-2.1
+Revision: $Rev: 18753 $
+Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
+Inspired By: Ace 1.x by Turan (turan@gryphon.com)
+Website: http://www.wowace.com/
+Documentation: http://www.wowace.com/index.php/AceLocale-2.1
+SVN: http://svn.wowace.com/root/trunk/Ace2/AceLocale-2.1
+Description: Localization library for addons to use to handle proper
+             localization and internationalization.
+Dependencies: AceLibrary
+]]
+
+local MAJOR_VERSION = "AceLocale-2.1"
+local MINOR_VERSION = "$Revision: 18753 $"
+
+if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end
+if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
+
+local curTranslation, baseTranslation, translations, baseLocale, curLocale, strictTranslations, dynamic, reverseTranslation
+local AceLocale = {}
+local backbone = {}
+backbone.class, backbone.super = false, false
+
+local function initReverse(self)
+   self[reverseTranslation] = {}
+
+   for k, v in pairs(self[curTranslation]) do self[reverseTranslation][v] = k end
+
+   setmetatable(self[reverseTranslation], {
+      __index = function(tbl, key)  
+         AceLocale:error("Reverse translation for %s not found", key)
+      end
+   })
+end
+
+local function __call(obj, text, flag)
+   if flag == nil then return obj[text] end
+   
+   if flag == true then
+      if rawget(obj[curTranslation], text) then AceLocale:error("Strict translation for %s not found", text) end
+      return rawget(obj[curTranslation], text)
+   elseif flag == false then
+      return rawget(obj[curTranslation], arg2) or obj[baseTranslation][arg2]
+   elseif flag == "reverse" then
+      if not rawget(obj, reverseTranslation) then initReverse(obj) end
+      return obj[reverseTranslation][text]	
+   else
+      AceLocale:error("Invalid flag given to __call.  Should be true/false/\"reverse\" but %s was given", flag)
+   end
+end
+
+local function NewInstance(self, uid)
+   if self.registry[uid] then return self.registry[uid] end
+
+   self.registry[uid] = {}
+   self.registry[uid][translations] = {}
+   
+   setmetatable(self.registry[uid], {
+     __tostring = function()
+        return "AceLocale(" .. uid .. ")"
+     end,
+     __call = __call,
+     __index = backbone
+   })
+   
+   return self.registry[uid]
+end
+
+function AceLocale:RegisterTranslation(uid, locale, func)
+	error(MAJOR_VERSION .. " is not supported in WoW 2.0", 2)
+   self:argCheck(uid, 1, "string")
+   self:argCheck(locale, 2, "string")
+   self:argCheck(func, 3, "function")
+	
+   local instance = self.registry[uid] or NewInstance(self, uid)
+   
+   if instance[translations][locale] then
+      self:error("Cannot provide the same locale more than once. %q provided twice for %s.", locale, uid)
+   end
+	
+    if rawget(instance, baseLocale) then 
+        for k, v in pairs(func()) do
+			if not rawget(instance[baseTranslation], k) then
+				self:error("Improper translation exists. %q is likely misspelled for locale %s.", k, locale)
+			elseif value == true then
+				self:error( "Can only accept true as a value on the base locale. %q is the base locale, %q is not.", instance[baseLocale], locale)
+			end
+		end
+    else
+        instance[baseTranslation] = func() 
+        instance[baseLocale] = locale
+        
+        for k, v in pairs(instance[baseTranslation]) do
+            if type(v) ~= "string" and type(v) ~= "table" then
+                if type(v) == "boolean" then 
+                    instance[baseTranslation][k] = k 
+                else
+                    self:error("Translation for %s is invalid.  Must be either string or boolean", k)
+                end
+            end
+        end
+        
+        setmetatable(instance[baseTranslation], {__index = backbone})
+    end
+    
+    instance[translations][locale] = func
+end
+
+function AceLocale:GetInstance(uid, locale)
+   self:argCheck(uid, 1, "string")
+   
+   local instance = self.registry[uid]
+   
+   if not instance then self:error("At least one translation must be registered before you can GetInstance().") end
+    
+   instance:SetLocale(locale)
+   
+   return instance
+end
+
+function AceLocale:HasInstance(uid)
+    self:argCheck(uid, 1, "string")
+    return self.registry[uid] and true or false
+end
+
+setmetatable(backbone, {__index = 
+    function(tbl, key)  
+        AceLocale:error("Translation for %s not found", key)
+    end})
+
+function backbone:SetLocale(locale)
+    local loose = false
+    if locale == nil then return end
+   
+    if locale == true then 
+        locale = GetLocale() 
+        if rawget(self, curLocale) and self[curLocale] == locale then return end
+        if not self[translations][locale] then locale = self[baseLocale] end
+    end
+    
+    if rawget(self, curLocale) and self[curLocale] == locale then return end
+    
+    if not self[translations][locale] then
+            AceLocale:error("Cannot SetLocale to %s for %s,  It has not been registered.", locale, tostring(self))
+    end
+    
+    if self[translations][locale] and self[baseLocale] == locale then
+        self[curLocale] = self[baseLocale]
+        self[curTranslation] = {}
+        getmetatable(self).__index = self[baseTranslation]
+    else
+        self[curLocale] = locale
+        self[curTranslation] = self[translations][locale]()
+        getmetatable(self).__index = self[curTranslation]
+    end    
+
+    if rawget(self, strictTranslations) then
+        setmetatable(self[curTranslation], {
+            __index = function(tbl, key)  
+                AceLocale:error("Translation for %s not found", key)
+            end
+        })
+    else
+        setmetatable(self[curTranslation], {
+            __index = self[baseTranslation]
+        })
+    end
+
+    if not rawget(self, dynamic) then
+        self[translations] = {}
+    end
+
+    if rawget(self, reverseTranslation) then
+        self[reverseTranslation] = nil
+    end
+end
+
+function backbone:ClearLocales()
+    self[translations] = {}
+    self[curLocale] = nil
+    self[baseLocale] = nil
+end
+
+function backbone:SetDynamicLocales(flag)
+    AceLocale:argCheck(flag, 1, "boolean")
+    self[dynamic] = flag
+end
+
+function backbone:SetStrictness(flag)
+    AceLocale:argCheck(flag, 1, "boolean")
+    local mt
+    
+    if rawget(self, curTranslation) then
+        mt = getmetatable(self[curTranslation])
+    end
+    
+    if strict and mt then
+        mt.__index = function(tbl, key)  
+            AceLocale:error("Translation for %s not found", key)
+        end
+    elseif mt then
+        mt.__index = self[baseTranslation]
+    end
+
+    self[strictTranslations] = strict
+end
+
+function backbone:HasTranslation(text)
+   AceLocale:argCheck(text, 1, "string")
+   
+   if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasTranslation().") end
+   
+   return rawget(self[curTranslation], text) and true or false
+end
+
+function backbone:HasReverseTranslation(text)
+   AceLocale:argCheck(text, 1, "string")
+    
+    if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasReverseTranslation().") end
+    
+    if not rawget(self, reverseTranslation) then
+		initReverse(self)
+	end
+    
+    return rawget(self[reverseTranslation], text) and true or false
+end
+
+function backbone:GetIterator()
+   if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call GetIterator().") end
+   return pairs(self[curTranslation])
+end
+
+function backbone:GetReverseIterator()
+    if not rawget(self, curTranslation) then AceLocale:error("A locale must be chosen before you can call HasReverseTranslation().") end
+    
+    if not rawget(self, reverseTranslation) then
+		initReverse(self)
+	end
+    
+    return pairs(self[reverseTranslation])
+end
+
+function backbone:GetLocaleList()
+    local results = {}
+    for k, v in pairs(self[translations]) do tinsert(results, k) end
+    return results
+end
+
+local function activate(self, oldLib, oldDeactivate)
+   AceLocale = self
+	
+   if oldLib then
+      self.registry = oldLib.registry
+      self.curTranslation = oldLib.curTranslation
+      self.baseTranslation = oldLib.baseTranslation
+      self.translations = oldLib.translations
+      self.baseLocale = oldLib.baseLocale
+      self.curLocale = oldLib.curLocale
+      self.strictTranslations = oldLib.strictTranslations
+      self.dynamic = oldLib.dynamic
+      self.reverseTranslation = oldLib.reverseTranslation
+   end
+	
+   if not self.registry then self.registry = {} end
+   if not self.curTranslation then	self.curTranslation = {} end
+   if not self.baseTranslation then self.baseTranslation = {} end
+   if not self.translations then self.translations = {} end
+   if not self.baseLocale then self.baseLocale = {} end
+   if not self.curLocale then self.curLocale = {} end
+   if not self.strictTranslations then	self.strictTranslations = {} end
+   if not self.dynamic then self.dynamic = {} end
+   if not self.reverseTranslation then	self.reverseTranslation = {} end
+	
+   if oldDeactivate then
+      oldDeactivate(oldLib)
+   end
+	
+   curTranslation = self.curTranslation
+   baseTranslation = self.baseTranslation
+   translations = self.translations
+   baseLocale = self.baseLocale
+   curLocale = self.curLocale
+   strictTranslations = self.strictTranslations
+   dynamic = self.dynamic
+   reverseTranslation = self.reverseTranslation
+end
+
+AceLibrary:Register(AceLocale, MAJOR_VERSION, MINOR_VERSION, activate)
+AceLocale = AceLibrary(MAJOR_VERSION)
\ No newline at end of file