annotate Libs/AceLocale-3.0/AceLocale-3.0.lua @ 0:c6ff7ba0e8f6

Reasonably functional now. Cleaning up some stuff which might have to be reverted.
author Zerotorescue
date Thu, 07 Oct 2010 17:17:43 +0200
parents
children
rev   line source
Zerotorescue@0 1 --- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
Zerotorescue@0 2 -- @class file
Zerotorescue@0 3 -- @name AceLocale-3.0
Zerotorescue@0 4 -- @release $Id: AceLocale-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
Zerotorescue@0 5 local MAJOR,MINOR = "AceLocale-3.0", 2
Zerotorescue@0 6
Zerotorescue@0 7 local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
Zerotorescue@0 8
Zerotorescue@0 9 if not AceLocale then return end -- no upgrade needed
Zerotorescue@0 10
Zerotorescue@0 11 -- Lua APIs
Zerotorescue@0 12 local assert, tostring, error = assert, tostring, error
Zerotorescue@0 13 local setmetatable, rawset, rawget = setmetatable, rawset, rawget
Zerotorescue@0 14
Zerotorescue@0 15 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
Zerotorescue@0 16 -- List them here for Mikk's FindGlobals script
Zerotorescue@0 17 -- GLOBALS: GAME_LOCALE, geterrorhandler
Zerotorescue@0 18
Zerotorescue@0 19 local gameLocale = GetLocale()
Zerotorescue@0 20 if gameLocale == "enGB" then
Zerotorescue@0 21 gameLocale = "enUS"
Zerotorescue@0 22 end
Zerotorescue@0 23
Zerotorescue@0 24 AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref
Zerotorescue@0 25 AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName"
Zerotorescue@0 26
Zerotorescue@0 27 -- This metatable is used on all tables returned from GetLocale
Zerotorescue@0 28 local readmeta = {
Zerotorescue@0 29 __index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key
Zerotorescue@0 30 rawset(self, key, key) -- only need to see the warning once, really
Zerotorescue@0 31 geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'")
Zerotorescue@0 32 return key
Zerotorescue@0 33 end
Zerotorescue@0 34 }
Zerotorescue@0 35
Zerotorescue@0 36 -- This metatable is used on all tables returned from GetLocale if the silent flag is true, it does not issue a warning on unknown keys
Zerotorescue@0 37 local readmetasilent = {
Zerotorescue@0 38 __index = function(self, key) -- requesting totally unknown entries: return key
Zerotorescue@0 39 rawset(self, key, key) -- only need to invoke this function once
Zerotorescue@0 40 return key
Zerotorescue@0 41 end
Zerotorescue@0 42 }
Zerotorescue@0 43
Zerotorescue@0 44 -- Remember the locale table being registered right now (it gets set by :NewLocale())
Zerotorescue@0 45 -- NOTE: Do never try to register 2 locale tables at once and mix their definition.
Zerotorescue@0 46 local registering
Zerotorescue@0 47
Zerotorescue@0 48 -- local assert false function
Zerotorescue@0 49 local assertfalse = function() assert(false) end
Zerotorescue@0 50
Zerotorescue@0 51 -- This metatable proxy is used when registering nondefault locales
Zerotorescue@0 52 local writeproxy = setmetatable({}, {
Zerotorescue@0 53 __newindex = function(self, key, value)
Zerotorescue@0 54 rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string
Zerotorescue@0 55 end,
Zerotorescue@0 56 __index = assertfalse
Zerotorescue@0 57 })
Zerotorescue@0 58
Zerotorescue@0 59 -- This metatable proxy is used when registering the default locale.
Zerotorescue@0 60 -- It refuses to overwrite existing values
Zerotorescue@0 61 -- Reason 1: Allows loading locales in any order
Zerotorescue@0 62 -- Reason 2: If 2 modules have the same string, but only the first one to be
Zerotorescue@0 63 -- loaded has a translation for the current locale, the translation
Zerotorescue@0 64 -- doesn't get overwritten.
Zerotorescue@0 65 --
Zerotorescue@0 66 local writedefaultproxy = setmetatable({}, {
Zerotorescue@0 67 __newindex = function(self, key, value)
Zerotorescue@0 68 if not rawget(registering, key) then
Zerotorescue@0 69 rawset(registering, key, value == true and key or value)
Zerotorescue@0 70 end
Zerotorescue@0 71 end,
Zerotorescue@0 72 __index = assertfalse
Zerotorescue@0 73 })
Zerotorescue@0 74
Zerotorescue@0 75 --- Register a new locale (or extend an existing one) for the specified application.
Zerotorescue@0 76 -- :NewLocale will return a table you can fill your locale into, or nil if the locale isn't needed for the players
Zerotorescue@0 77 -- game locale.
Zerotorescue@0 78 -- @paramsig application, locale[, isDefault[, silent]]
Zerotorescue@0 79 -- @param application Unique name of addon / module
Zerotorescue@0 80 -- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc.
Zerotorescue@0 81 -- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS)
Zerotorescue@0 82 -- @param silent If true, the locale will not issue warnings for missing keys. Can only be set on the default locale.
Zerotorescue@0 83 -- @usage
Zerotorescue@0 84 -- -- enUS.lua
Zerotorescue@0 85 -- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true)
Zerotorescue@0 86 -- L["string1"] = true
Zerotorescue@0 87 --
Zerotorescue@0 88 -- -- deDE.lua
Zerotorescue@0 89 -- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "deDE")
Zerotorescue@0 90 -- if not L then return end
Zerotorescue@0 91 -- L["string1"] = "Zeichenkette1"
Zerotorescue@0 92 -- @return Locale Table to add localizations to, or nil if the current locale is not required.
Zerotorescue@0 93 function AceLocale:NewLocale(application, locale, isDefault, silent)
Zerotorescue@0 94
Zerotorescue@0 95 if silent and not isDefault then
Zerotorescue@0 96 error("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' can only be specified for the default locale", 2)
Zerotorescue@0 97 end
Zerotorescue@0 98
Zerotorescue@0 99 -- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
Zerotorescue@0 100 -- Ammo: I still think this is a bad idea, for instance an addon that checks for some ingame string will fail, just because some other addon
Zerotorescue@0 101 -- gives the user the illusion that they can run in a different locale? Ditch this whole thing or allow a setting per 'application'. I'm of the
Zerotorescue@0 102 -- opinion to remove this.
Zerotorescue@0 103 local gameLocale = GAME_LOCALE or gameLocale
Zerotorescue@0 104
Zerotorescue@0 105 if locale ~= gameLocale and not isDefault then
Zerotorescue@0 106 return -- nop, we don't need these translations
Zerotorescue@0 107 end
Zerotorescue@0 108
Zerotorescue@0 109 local app = AceLocale.apps[application]
Zerotorescue@0 110
Zerotorescue@0 111 if not app then
Zerotorescue@0 112 app = setmetatable({}, silent and readmetasilent or readmeta)
Zerotorescue@0 113 AceLocale.apps[application] = app
Zerotorescue@0 114 AceLocale.appnames[app] = application
Zerotorescue@0 115 end
Zerotorescue@0 116
Zerotorescue@0 117 registering = app -- remember globally for writeproxy and writedefaultproxy
Zerotorescue@0 118
Zerotorescue@0 119 if isDefault then
Zerotorescue@0 120 return writedefaultproxy
Zerotorescue@0 121 end
Zerotorescue@0 122
Zerotorescue@0 123 return writeproxy
Zerotorescue@0 124 end
Zerotorescue@0 125
Zerotorescue@0 126 --- Returns localizations for the current locale (or default locale if translations are missing).
Zerotorescue@0 127 -- Errors if nothing is registered (spank developer, not just a missing translation)
Zerotorescue@0 128 -- @param application Unique name of addon / module
Zerotorescue@0 129 -- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional)
Zerotorescue@0 130 -- @return The locale table for the current language.
Zerotorescue@0 131 function AceLocale:GetLocale(application, silent)
Zerotorescue@0 132 if not silent and not AceLocale.apps[application] then
Zerotorescue@0 133 error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
Zerotorescue@0 134 end
Zerotorescue@0 135 return AceLocale.apps[application]
Zerotorescue@0 136 end