مواد ڏانھن هلو

ماڊيول:I18n

کليل ڄاڻ چيڪلي، وڪيپيڊيا مان
I18n
وضاحتلُوا ڊيٽا اسٽورن ۾ پيغامن جي ذخيري لاءِ آئي 18 اين لائبريري.
ليکڪ
ڪوڊ جو ذريعوI18n
حالتبيٽا
انحصار
ڪوڊ استعمال ڪندڙCqm

لُوا ڊيٽا اسٽورن ۾ پيغامن جي ذخيري لاءِ آئي 18 اين لائبريري. هي ماڊيول پيغامن کي ماڊيولن ۽ سانچن کان الڳ رکڻ لاءِ ٺاهيو ويو آهي. ان ۾ ٻولين جي fallback سنڀالڻ جي سهولت پڻ موجود آهي. هي ماڊيول wikia:dev:I18n-js جو لُوا پورٽ آهي، ۽ جيڪي i18n ماڊيول ان ذريعي لوڊ ٿي سگهن ٿا، اهي wikia:dev:I18nEdit وسيلي به سنواريا وڃي سگهن ٿا.

وڪيميڊيا منصوبن تي i18n پيغام Data:i18n/ جي ذيلي صفحن ذريعي وڪيميڊيا ڪامنز تي سنواريا ويندا آهن.

Documentation

Package items

i18n.getMsg( frame ) (function)
ڪنجي ذريعي مقامي پيغام حاصل ڪرڻ وارو فنڪشن. uselang پيرا ميٽر ذريعي مخصوص ٻولي ڪوڊ ۾ پيغام حاصل ڪرڻ لاءِ استعمال ٿي سگهي ٿو. اضافي انگ وارا پيرا ميٽر ڊيٽا اسٽور پيغام ۾ substitution لاءِ ڏنا وڃي سگهن ٿا.
Parameters:
frame invocation مان آيل frame table. (table)
frame.args argument تي ٻڌل metatable. (table)
frame.args[1] i18n ذيلي ماڊيول جو ROOTPAGENAME. (string)
frame.args[2] i18n پيغام جي ڪنجي. (string)
frame.args.lang پيغام جي default ٻولي. (string; optional)
Error: 'missing arguments in i18n.getMsg' (string; line 271)
Returns: مقامي ٿيل ٻولي ۾ i18n پيغام. (string)
i18n.loadMessages( ... ) (function)
i18n پيغامن جو ڊيٽا اسٽور لوڊ ڪندڙ.
Parameter: ... حدف i18n ذيلي ماڊيولن جا ROOTPAGENAME/path. (string)
Error: 'no source supplied to i18n.loadMessages' (string; line 322)
Returns: i18n ڊيٽا اسٽور جو instance. (table)
Usage: require('Module:I18n').loadMessages('1', '2')
i18n.getLang( ) (function)
ٻولي جو ڪوڊ حاصل ڪرڻ وارو فنڪشن. uselang پيرا ميٽر ذريعي template جي ٻولي ڪوڊ جي تصديق ڪري سگهي ٿو.
Returns: ٻولي جو ڪوڊ. (string)
i18n.loadI18n( name, i18n_arg ) (function)
ڏنل i18n ٽيبل موجب value instantiate ڪري ٿو (deprecated)
Parameters:
name i18n رکندڙ ماڊيول جو نالو (string)
i18n_arg موجود i18n (table)
i18n.loadI18nFrame( name, i18n_arg ) (function)
مخصوص frame لاءِ i18n لوڊ ڪري ٿو (deprecated)
Parameters:
name i18n رکندڙ ماڊيول جو نالو (string)
i18n_arg موجود i18n (table)
i18n.main( frame ) (function)
ماڊيول لاءِ wrapper.
Parameter: frame invocation جو frame object. (table)
Returns: template context ۾ ماڊيول جي اوٽ. (string)
Usage: {{i18n}}
_i18n.isWikitext( msg ) (function)
جاچي ٿو ته پيغام ۾ اڻ-پروسيس ٿيل وڪي متن موجود آهي يا نه. خالص متن کي preprocess نه ڪرڻ لاءِ هن سان message getter کي بهتر ڪيو وڃي ٿو.
Parameter: msg جاچڻ لاءِ پيغام. (string)
Returns: ڇا پيغام ۾ وڪي متن شامل آهي. (boolean)

Data

آئي 18 اين ڊيٽا اسٽور ڪلاس. هي ٻولي جي ترجمي ۽ الڳ پيغامن تائين رسائي کي سنڀالڻ لاءِ استعمال ٿيندو آهي. ڊيٽا اسٽور جو instance ٻولي ۽ پيغام لاءِ getter-setter طريقا فراهم ڪري ٿو، جيڪي لُوا ماڊيولن کي بين الاقوامي بڻائڻ لاءِ استعمال ڪري سگهجن ٿا. ٻولي وارا طريقا (اهي سڀ جيڪي Lang تي ختم ٿين ٿا) chainable آهن.

Data:msg( opts, ... ) (function)
ڊيٽا اسٽور مان پيغام حاصل ڪرڻ وارو utility طريقو. هي طريقو key مطابق ڊيٽا اسٽور مان مقامي پيغام واپس ڪري ٿو. انهن پيغامن ۾ $n پيرا ميٽر ٿي سگهن ٿا، جيڪي msg سڏ دوران ڏنل اختياري argument strings سان بدلايا وڃن ٿا.
هي فنڪشن named arguments پڻ سپورٽ ڪري ٿو. named argument نحو وڌيڪ لچڪدار آهي، جيتوڻيڪ وڌيڪ ڊگهو آهي؛ ان سان پيغام جي ٻولي ۽ ماخذ چونڊي سگهجن ٿا.
Parameters:
opts پيغام جي ترتيب يا ڪنجي. (string|table)
opts.key اها ڪنجي جنهن جو پيغام واپس ڪرڻو آهي. (string; optional)
opts.args اهي argument جيڪي پيغام ($n) ۾ رکڻا آهن. (table; optional)
opts.sources اهي ماخذ نالا جن تائين پاڻ کي محدود رکڻو آهي (ڏسو Data:fromSources). (table; optional)
opts.lang عارضي طور استعمال ٿيڻ واري ٻولي (ڏسو Data:inLang). (table; optional)
... اهي argument جيڪي پيغام ($n) ۾ رکڻا آهن. (string; optional)
Error: 'missing arguments in Data:msg' (string; line 115)
Returns: مقامي ٿيل ڊيٽا اسٽور پيغام يا '<key>'. (string)
Usage:
ds:msg{
    key = 'message-name',
    lang = '',
    args = {...},
    sources = {}
}
ds:msg('message-name', ...)
Data:parameter( parameter, args ) (function)
ڊيٽا اسٽور مان template parameter حاصل ڪرڻ وارو utility طريقو. هي طريقو argument جي ٽيبل مان، parameter جو مقامي نالو ڊيٽا اسٽور ۾ ڳولي، ان جي value واپس ڪري ٿو؛ نه ملي ته nil ڏئي ٿو. هي طريقو هميشه وڪي جي content language استعمال ڪري ٿو.
Parameters:
parameter ڊيٽا اسٽور ۾ parameter جي ڪنجي (string)
args argument جي ٽيبل جنهن مان parameter ڳولڻو آهي (table)
Error: 'missing arguments in Data:parameter' (string; line 176)
Returns: parameter جي value يا nil جيڪڏهن موجود نه هجي (string|nil)
Data:fromSource( ... ) (function)
ڊيٽا اسٽور کي مخصوص ماخذن جي ذيلي مجموعي تائين عارضي طور محدود ڪرڻ وارو setter. عام حالت ۾ پيغام ساڳئي ترجيحي ترتيب سان حاصل ڪيا ويندا آهن، جنهن ترتيب سان i18n.loadMessages ماخذ لوڊ ڪندو آهي.
Parameter: ... استعمال ٿيڻ وارا ماخذ نالا. (string)
Returns: ڊيٽا اسٽور جو instance. (Data)
Data:getLang( ) (function)
ڊيٽا اسٽور جي default language حاصل ڪرڻ وارو getter.
Returns: اها default ٻولي جنهن ۾ ڊيٽا اسٽور پيغام ڏنا ويندا. (string)
Data:useUserLang( ) (function)
ڊيٽا اسٽور جي ٻولي کي wgUserLanguage تي سيٽ ڪرڻ وارو setter.
Returns: ڊيٽا اسٽور جو instance. (Data)
Note: Scribunto صرف تڏهن wgUserLanguage رجسٽر ڪندو آهي، جڏهن invocation call stack جي سڀ کان مٿانهين سطح تي هجي.
Data:useContentLang( ) (function)
ڊيٽا اسٽور جي ٻولي کي wgContentLanguage تي سيٽ ڪرڻ وارو setter.
Returns: ڊيٽا اسٽور جو instance. (Data)
Data:useLang( code ) (function)
ڊيٽا اسٽور جي ٻولي کي مخصوص ٻولي تي سيٽ ڪرڻ وارو setter.
Parameter: code استعمال ٿيڻ واري ٻولي جو ڪوڊ. (string)
Returns: ڊيٽا اسٽور جو instance. (Data)
Data:inUserLang( ) (function)
ڊيٽا اسٽور جي ٻولي کي عارضي طور wgUserLanguage تي سيٽ ڪرڻ وارو setter. ايندڙ Data:msg سڏ کان پوءِ ڊيٽا اسٽور جي ٻولي وري default ٻولي تي موٽي ايندي.
Returns: ڊيٽا اسٽور جو instance. (Data)
Data:inContentLang( ) (function)
ڊيٽا اسٽور جي ٻولي کي عارضي طور wgContentLanguage تي سيٽ ڪرڻ وارو setter. هي صرف ايندڙ Data:msg سڏ تي اثرانداز ٿيندو.
Returns: ڊيٽا اسٽور جو instance. (Data)
Data:inLang( code ) (function)
ڊيٽا اسٽور جي ٻولي کي عارضي طور مخصوص ٻولي تي سيٽ ڪرڻ وارو setter. هي صرف ايندڙ Data:msg سڏ تي اثرانداز ٿيندو.
Parameter: code استعمال ٿيڻ واري ٻولي جو ڪوڊ. (string)
Returns: ڊيٽا اسٽور جو instance. (Data)

See also


--- لُوا ڊيٽا اسٽورن ۾ پيغامن جي ذخيري لاءِ آئي 18 اين لائبريري.
--  هي ماڊيول پيغامن کي ماڊيولن ۽ سانچن کان الڳ رکڻ لاءِ ٺاهيو ويو آهي.
--  ان ۾ ٻولين جي fallback سنڀالڻ جي سهولت پڻ موجود آهي. هي ماڊيول
--  [[wikia:dev:I18n-js]] جو لُوا پورٽ آهي، ۽ جيڪي i18n ماڊيول ان ذريعي
--  لوڊ ٿي سگهن ٿا، اهي [[wikia:dev:I18nEdit]] وسيلي به سنواريا وڃي سگهن ٿا.
--  
--  وڪيميڊيا منصوبن تي i18n پيغام
--  [[c:Special:PrefixIndex/Data:i18n/|Data:i18n/]] جي ذيلي صفحن ذريعي
--  وڪيميڊيا ڪامنز تي سنواريا ويندا آهن.
--  
--  @module         i18n
--  @version        1.4.0
--  @require        Module:Entrypoint
--  @require        Module:Fallbacklist
--  @author         [[wikia:dev:User:KockaAdmiralac|KockaAdmiralac]] (اصل Fandom نفاذ)
--  @author         [[wikia:dev:User:Speedit|Speedit]] (اصل Fandom نفاذ)
--  @author         [[User:Awesome Aasim|Awesome Aasim]] (Wikimedia پورٽ)
--  @attribution    [[wikia:dev:User:Cqm|Cqm]]
--  @release        beta
--  @see            [[wikia:dev:I18n|I18n رهنمائي]]
--  @see            [[wikia:dev:I18n-js]]
--  @see            [[wikia:dev:I18nEdit]]
--  <nowiki>
local i18n, _i18n = {}, {}

--  ماڊيول جا متغير ۽ انحصار.
local title = mw.title.getCurrentTitle()
local fallbacks = require('Module:Fallbacklist')
local entrypoint = require('Module:Entrypoint')
local uselang

--- $n جي صورت ۾ argument substitution، جتي n > 0 هجي.
--  @function       _i18n.handleArgs
--  @param          {string} msg اهو پيغام جنهن ۾ argument رکڻا آهن.
--  @param          {table} args اهي arguments جيڪي متبادل طور وجهڻا آهن.
--  @return         {string} نتيجي وارو پيغام.
--  @local
function _i18n.handleArgs(msg, args)
	for i, a in ipairs(args) do
		msg = (string.gsub(msg, '%$' .. tostring(i), tostring(a)))
	end
	return msg
end

--- جاچي ٿو ته ٻولي جو ڪوڊ درست آهي يا نه.
--  @function       _i18n.isValidCode
--  @param          {string} code جاچڻ لاءِ ٻولي جو ڪوڊ.
--  @return         {boolean} ڇا ٻولي جو ڪوڊ درست آهي.
--  @local
function _i18n.isValidCode(code)
	return type(code) == 'string' and #mw.language.fetchLanguageName(code) ~= 0
end

--- جاچي ٿو ته پيغام ۾ اڻ-پروسيس ٿيل وڪي متن موجود آهي يا نه.
--  خالص متن کي preprocess نه ڪرڻ لاءِ هن سان message getter کي بهتر ڪيو وڃي ٿو.
--  @function       _i18n.isWikitext
--  @param          {string} msg جاچڻ لاءِ پيغام.
--  @return         {boolean} ڇا پيغام ۾ وڪي متن شامل آهي.
function _i18n.isWikitext(msg)
	return
		type(msg) == 'string' and
		(
			msg:find('%-%-%-%-') or
			msg:find('%f[^\n%z][;:*#] ') or
			msg:find('%f[^\n%z]==* *[^\n|]+ =*=%f[\n]') or
			msg:find('%b<>') or msg:find('\'\'') or
			msg:find('%[%b[]%]') or msg:find('{%b{}}')
		)
end

--- آئي 18 اين ڊيٽا اسٽور ڪلاس.
--  هي ٻولي جي ترجمي ۽ الڳ پيغامن تائين رسائي کي سنڀالڻ لاءِ استعمال ٿيندو آهي.
--  ڊيٽا اسٽور جو instance ٻولي ۽ پيغام لاءِ getter-setter طريقا فراهم ڪري ٿو،
--  جيڪي لُوا ماڊيولن کي بين الاقوامي بڻائڻ لاءِ استعمال ڪري سگهجن ٿا.
--  ٻولي وارا طريقا (اهي سڀ جيڪي `Lang` تي ختم ٿين ٿا) **chainable** آهن.
--  @type           Data
local Data = {}
Data.__index = Data

--- ڊيٽا اسٽور مان پيغام حاصل ڪرڻ وارو utility طريقو.
--  هي طريقو `key` مطابق ڊيٽا اسٽور مان مقامي پيغام واپس ڪري ٿو.
--  انهن پيغامن ۾ `$n` پيرا ميٽر ٿي سگهن ٿا، جيڪي `msg` سڏ دوران
--  ڏنل اختياري argument strings سان بدلايا وڃن ٿا.
--  
--  هي فنڪشن [[mw:Extension:Scribunto/Lua reference manual#named_arguments|named
--  arguments]] پڻ سپورٽ ڪري ٿو. named argument نحو وڌيڪ لچڪدار آهي،
--  جيتوڻيڪ وڌيڪ ڊگهو آهي؛ ان سان پيغام جي ٻولي ۽ ماخذ چونڊي سگهجن ٿا.
--  @function       Data:msg
--  @usage
--  
--      ds:msg{
--          key = 'message-name',
--          lang = '',
--          args = {...},
--          sources = {}
--      }
--  
--  @usage
--  
--      ds:msg('message-name', ...)
--  
--  @param          {string|table} opts پيغام جي ترتيب يا ڪنجي.
--  @param[opt]     {string} opts.key اها ڪنجي جنهن جو پيغام واپس ڪرڻو آهي.
--  @param[opt]     {table} opts.args اهي argument جيڪي پيغام (`$n`) ۾ رکڻا آهن.
--  @param[opt]     {table} opts.sources اهي ماخذ نالا جن تائين پاڻ کي محدود رکڻو آهي (ڏسو `Data:fromSources`).
--  @param[opt]     {table} opts.lang عارضي طور استعمال ٿيڻ واري ٻولي (ڏسو `Data:inLang`).
--  @param[opt]     {string} ... اهي argument جيڪي پيغام (`$n`) ۾ رکڻا آهن.
--  @error[115]     {string} 'missing arguments in Data:msg'
--  @return         {string} مقامي ٿيل ڊيٽا اسٽور پيغام يا `'<key>'`.
function Data:msg(opts, ...)
	local frame = mw.getCurrentFrame()
	-- Argument normalization.
	if not self or not opts then
		error('missing arguments in Data:msg')
	end
	local key = type(opts) == 'table' and opts.key or opts
	local args = opts.args or {...}
	-- Configuration parameters.
	if opts.sources then
		self:fromSources(unpack(opts.sources))
	end
	if opts.lang then
		self:inLang(opts.lang)
	end
	-- Source handling.
	local source_n = self.tempSources or self._sources
	local source_i = {}
	for n, i in pairs(source_n) do
		source_i[i] = n
	end
	self.tempSources = nil
	-- Language handling.
	local lang = self.tempLang or self.defaultLang
	self.tempLang = nil
	-- Message fetching.
	local msg
	for i, messages in ipairs(self._messages) do
		-- Message data.
		local msg = (messages[lang] or {})[key]
		-- Fallback support (experimental).
		for _, l in ipairs((fallbacks[lang] or {})) do
			if msg == nil then
				msg = (messages[l] or {})[key]
			end
		end
		-- Internal fallback to 'en'.
		msg = msg ~= nil and msg or messages.en[key]
		-- Handling argument substitution from Lua.
		if msg and source_i[i] and #args > 0 then
			msg = _i18n.handleArgs(msg, args)
		end
		if msg and source_i[i] and lang ~= 'qqx' then
			return frame and _i18n.isWikitext(msg)
				and frame:preprocess(mw.text.trim(msg))
				or  mw.text.trim(msg)
		end
	end
	return '&#x29FC;' .. mw.text.nowiki(key) .. '&#x29FD;'
end

--- ڊيٽا اسٽور مان template parameter حاصل ڪرڻ وارو utility طريقو.
--  هي طريقو argument جي ٽيبل مان، parameter جو مقامي نالو ڊيٽا اسٽور ۾ ڳولي،
--  ان جي value واپس ڪري ٿو؛ نه ملي ته nil ڏئي ٿو.
--
--  هي طريقو هميشه وڪي جي content language استعمال ڪري ٿو.
--  @function       Data:parameter
--  @param          {string} parameter ڊيٽا اسٽور ۾ parameter جي ڪنجي
--  @param          {table} args argument جي ٽيبل جنهن مان parameter ڳولڻو آهي
--  @error[176]     {string} 'missing arguments in Data:parameter'
--  @return         {string|nil} parameter جي value يا nil جيڪڏهن موجود نه هجي
function Data:parameter(key, args)
	-- Argument normalization.
	if not self or not key or not args then
		error('missing arguments in Data:parameter')
	end
	local contentLang = mw.language.getContentLanguage():getCode()
	-- Message fetching.
	for i, messages in ipairs(self._messages) do
		local msg = (messages[contentLang] or {})[key]
		if msg ~= nil and args[msg] ~= nil then
			return args[msg]
		end
		for _, l in ipairs((fallbacks[contentLang] or {})) do
			if msg == nil or args[msg] == nil then
				msg = (messages[l] or {})[key]
			else
				return args[msg]
			end
		end
		msg = messages.en[key]
		if msg ~= nil and args[msg] ~= nil then
			return args[msg]
		end
	end
end

--- ڊيٽا اسٽور کي مخصوص ماخذن جي ذيلي مجموعي تائين عارضي طور محدود ڪرڻ وارو setter.
--  عام حالت ۾ پيغام ساڳئي ترجيحي ترتيب سان حاصل ڪيا ويندا آهن،
--  جنهن ترتيب سان `i18n.loadMessages` ماخذ لوڊ ڪندو آهي.
--  @function       Data:fromSource
--  @param          {string} ... استعمال ٿيڻ وارا ماخذ نالا.
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:fromSource(...)
	local c = select('#', ...)
	if c ~= 0 then
		self.tempSources = {}
		for i = 1, c do
			local n = select(i, ...)
			if type(n) == 'string' and type(self._sources[n]) == 'number' then
				self.tempSources[n] = self._sources[n]
			end
		end
	end
	return self
end

--- ڊيٽا اسٽور جي default language حاصل ڪرڻ وارو getter.
--  @function       Data:getLang
--  @return         {string} اها default ٻولي جنهن ۾ ڊيٽا اسٽور پيغام ڏنا ويندا.
function Data:getLang()
	return self.defaultLang
end

--- ڊيٽا اسٽور جي ٻولي کي `wgUserLanguage` تي سيٽ ڪرڻ وارو setter.
--  @function       Data:useUserLang
--  @return         {Data} ڊيٽا اسٽور جو instance.
--  @note           Scribunto صرف تڏهن `wgUserLanguage` رجسٽر ڪندو آهي،
--                  جڏهن invocation call stack جي سڀ کان مٿانهين سطح تي هجي.
function Data:useUserLang()
	self.defaultLang = i18n.getLang() or self.defaultLang
	return self
end

--- ڊيٽا اسٽور جي ٻولي کي `wgContentLanguage` تي سيٽ ڪرڻ وارو setter.
--  @function       Data:useContentLang
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:useContentLang()
	self.defaultLang = mw.language.getContentLanguage():getCode()
	return self
end

--- ڊيٽا اسٽور جي ٻولي کي مخصوص ٻولي تي سيٽ ڪرڻ وارو setter.
--  @function       Data:useLang
--  @param          {string} code استعمال ٿيڻ واري ٻولي جو ڪوڊ.
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:useLang(code)
	self.defaultLang = _i18n.isValidCode(code)
		and code
		or  self.defaultLang
	return self
end

--- ڊيٽا اسٽور جي ٻولي کي عارضي طور `wgUserLanguage` تي سيٽ ڪرڻ وارو setter.
--  ايندڙ @{Data:msg} سڏ کان پوءِ ڊيٽا اسٽور جي ٻولي وري default ٻولي تي موٽي ايندي.
--  @function       Data:inUserLang
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:inUserLang()
	self.tempLang = i18n.getLang() or self.tempLang
	return self
end

--- ڊيٽا اسٽور جي ٻولي کي عارضي طور `wgContentLanguage` تي سيٽ ڪرڻ وارو setter.
--  هي صرف ايندڙ @{Data:msg} سڏ تي اثرانداز ٿيندو.
--  @function       Data:inContentLang
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:inContentLang()
	self.tempLang = mw.language.getContentLanguage():getCode()
	return self
end

--- ڊيٽا اسٽور جي ٻولي کي عارضي طور مخصوص ٻولي تي سيٽ ڪرڻ وارو setter.
--  هي صرف ايندڙ @{Data:msg} سڏ تي اثرانداز ٿيندو.
--  @function       Data:inLang
--  @param          {string} code استعمال ٿيڻ واري ٻولي جو ڪوڊ.
--  @return         {Data} ڊيٽا اسٽور جو instance.
function Data:inLang(code)
	self.tempLang = _i18n.isValidCode(code)
		and code
		or  self.tempLang
	return self
end

--  Package functions.

--- ڪنجي ذريعي مقامي پيغام حاصل ڪرڻ وارو فنڪشن.
--  `uselang` پيرا ميٽر ذريعي مخصوص ٻولي ڪوڊ ۾ پيغام حاصل ڪرڻ لاءِ استعمال ٿي سگهي ٿو.
--  اضافي انگ وارا پيرا ميٽر ڊيٽا اسٽور پيغام ۾ substitution لاءِ ڏنا وڃي سگهن ٿا.
--  @function       i18n.getMsg
--  @param          {table} frame invocation مان آيل frame table.
--  @param          {table} frame.args argument تي ٻڌل metatable.
--  @param          {string} frame.args[1] i18n ذيلي ماڊيول جو ROOTPAGENAME.
--  @param          {string} frame.args[2] i18n پيغام جي ڪنجي.
--  @param[opt]     {string} frame.args.lang پيغام جي default ٻولي.
--  @error[271]     {string} 'missing arguments in i18n.getMsg'
--  @return         {string} مقامي ٿيل ٻولي ۾ i18n پيغام.
function i18n.getMsg(frame)
	if
		not frame or
		not frame.args or
		not frame.args[1] or
		not frame.args[2]
	then
		error('missing arguments in i18n.getMsg')
	end
	local source = frame.args[1]
	local key = frame.args[2]
	local repl = {}
	for i, a in ipairs(frame.args) do
		if i >= 3 then
			repl[i-2] = a
		end
	end
	local ds = i18n.loadMessages(source)
	ds:inLang(frame.args.uselang)
	return ds:msg { key = key, args = repl }
end
 
--- i18n پيغامن جو ڊيٽا اسٽور لوڊ ڪندڙ.
--  @function       i18n.loadMessages
--  @param          {string} ... حدف i18n ذيلي ماڊيولن جا ROOTPAGENAME/path.
--  @error[322]     {string} 'no source supplied to i18n.loadMessages'
--  @return         {table} i18n ڊيٽا اسٽور جو instance.
--  @usage          require('Module:I18n').loadMessages('1', '2')
function i18n.loadMessages(...)
	local ds
	local i = 0
	local s = {}
	for j = 1, select('#', ...) do
		local source = select(j, ...)
		if type(source) == 'string' and source ~= '' then
			i = i + 1
			s[source] = i
			if not ds then
				ds = {}
				ds._messages = {}
				setmetatable(ds, Data)
				ds:useUserLang()
			end
			source = string.gsub(source, '^.', mw.ustring.upper)
			local success, messages = pcall(mw.loadData, mw.ustring.find(source, ':')
				and source
				or  'Module:' .. source .. '/i18n')
			if success then
				local msgCopy = {}
				local langSecond = nil
				for lang_id, msgtbl in pairs(messages) do
					if langSecond == nil then
						if lang_id == "qqq" or fallbacks[lang_id] ~= nil then
							langSecond = false
						else
							langSecond = true
						end
					end
					for id_lang, msg in pairs(msgtbl) do
						if langSecond then
							msgCopy[id_lang] = msgCopy[id_lang] or {}
							msgCopy[id_lang][lang_id] = msg
						else
							msgCopy[lang_id] = msgCopy[lang_id] or {}
							msgCopy[lang_id][id_lang] = msg
						end
					end
				end
				ds._messages[i] = msgCopy
			end
			local tab = mw.ext.data.get('I18n/' .. source .. '.tab', '_')
			local T = {}
			if not success and not tab then error("i18n for " .. source .. " is missing") end
			for _, row in pairs(tab.data) do
				local id, t = unpack(row)
				for lang, msg in pairs(t) do
					if not T[lang] then T[lang] = {} end
					T[lang][id] = msg
				end
			end
			if not success then
				ds._messages[i] = T
			else
				for lang, msgTbl in pairs(T) do
					ds._messages[i][lang] = ds._messages[i][lang] or msgTbl
				end
			end
		end
	end
	if not ds then
		error('no source supplied to i18n.loadMessages')
	else
		ds._sources = s
		return ds
	end
end

--- ٻولي جو ڪوڊ حاصل ڪرڻ وارو فنڪشن.
--  `uselang` پيرا ميٽر ذريعي template جي ٻولي ڪوڊ جي تصديق ڪري سگهي ٿو.
--  @function       i18n.getLang
--  @return         {string} ٻولي جو ڪوڊ.
function i18n.getLang()
	local frame = mw.getCurrentFrame() or {}
	local parentFrame = frame.getParent and frame:getParent() or {}

	local code = mw.language.getContentLanguage():getCode()
	local subPage = title.subpageText

	local langOverride =
		(frame.args or {}).uselang or
		(parentFrame.args or {}).uselang
	if _i18n.isValidCode(langOverride) then
		code = langOverride
	elseif title.isSubpage and _i18n.isValidCode(subPage) then
		code = _i18n.isValidCode(subPage) and subPage or code
	elseif parentFrame.preprocess or frame.preprocess then
		uselang = uselang
			or  parentFrame.preprocess
				and parentFrame:preprocess('{{int:lang}}')
				or  frame:preprocess('{{int:lang}}')
		local decodedLang = mw.text.decode(uselang) 
		if decodedLang ~= '<lang>' and decodedLang ~= '⧼lang⧽' then
			code = decodedLang == '(lang)'
				and 'qqx'
				or  uselang
		end
	end

	return code
end

-- Credit to http://stackoverflow.com/a/1283608/2644759
-- cc-by-sa 3.0
local function tableMerge(t1, t2, overwrite)
	for k,v in pairs(t2) do
		if type(v) == "table" and type(t1[k]) == "table" then
			tableMerge(t1[k], v, overwrite)
		else
			if overwrite or t1[k] == nil then t1[k] = v end
		end
	end
	return t1
end

--- ڏنل i18n ٽيبل موجب value instantiate ڪري ٿو (deprecated)
--  @function i18n.loadI18n
--  @param {string} name i18n رکندڙ ماڊيول جو نالو
--  @param {table} i18n_arg موجود i18n
function i18n.loadI18n(name, i18n_arg)
	local exist, res = pcall(require, name)
	if exist and next(res) ~= nil then
		if i18n_arg then
			tableMerge(i18n_arg, res.i18n, true)
		end
	end
end

--- مخصوص frame لاءِ i18n لوڊ ڪري ٿو (deprecated)
--  @function i18n.loadI18nFrame
--  @param {string} name i18n رکندڙ ماڊيول جو نالو
--  @param {table} i18n_arg موجود i18n
function i18n.loadI18nFrame(frame, i18n_arg)
	return i18n.loadI18n(frame:getTitle().."/i18n", i18n_arg)
end

--- ماڊيول لاءِ wrapper.
--  @function       i18n.main
--  @param          {table} frame invocation جو frame object.
--  @return         {string} template context ۾ ماڊيول جي اوٽ.
--  @usage          {{#invoke:i18n|main}}
i18n.main = entrypoint(i18n)

return require("Module:Deprecated")(i18n, 
	{
		["loadI18n"] = {
			deprecated = true,
			replacement = "use <code>i18n.loadMessages</code>"
		},
		["loadI18nFrame"] = {
			deprecated = true,
			replacement = "use <code>i18n.loadMessages</code>"
		}
	}
)