2012-01-16 19 views
8

मैंने एक लुआ वेब एप्लिकेशन बनाया और यह स्पष्ट हो गया है कि मुझे अपने विदेशी ग्राहकों के लिए अंतर्राष्ट्रीयकरण ("i18n") शुरू करना होगा।लुआ - अंतर्राष्ट्रीयकरण कैसे करें?

लुआ में, मेरे आवेदन को अंतर्राष्ट्रीयकरण का सबसे अच्छा तरीका क्या है?

मुझे एहसास है कि यह एक महत्वपूर्ण उपक्रम है, खासकर जब से मेरे कुछ प्रदर्शन HTML टेम्पलेट्स में हार्ड कोड किए गए हैं और कुछ डेटा फ़ील्ड मेरे वर्तमान में यूएस-अंग्रेज़ी उन्मुख डेटाबेस में हैं।

किसी भी मार्गदर्शन की सराहना की जाएगी।

+0

यह करने के लिए व्यापक एक सवाल का जवाब देने का तरीका है। थोड़ी सी चीजें नीचे संकीर्ण करें। आपका आवेदन क्या है? अनुवाद करने की क्या ज़रूरत है? वेब पेजों को बिल्कुल उत्पन्न करने के लिए आप क्या उपयोग कर रहे हैं? इत्यादि। –

उत्तर

5

संपादित करें: जोड़ा metatable सामान

चाहेंगे कोई मन में थोड़ा और स्पष्ट

निश्चित रूप से ऊपर के उदाहरण कोड बना रही है।

एक फाइल में आप निम्न विधियों के साथ एक i18n चर को परिभाषित:

local i18n = { locales = {} } 

local currentLocale = 'en' -- the default language 

function i18n.setLocale(newLocale) 
    currentLocale = newLocale 
    assert(i18n.locales[currentLocale], ("The locale %q was unknown"):format(newLocale)) 
end 

local function translate(id) 
    local result = i18n.locales[currentLocale][id] 
    assert(result, ("The id %q was not found in the current locale (%q)"):format(id, currentLocale) 
    return result 
end 

i18n.translate = translate 

setmetatable(i18n, {__call = function(_,...) return translate(id) end}) 

return i18n 

एक ही फाइल में, या अन्य (रों) में, आप स्थानों आप i18n.locales अंदर की जरूरत है शामिल हैं।

local i18n = require 'i18n' -- remove this line if on the same file as before 

i18n.locales.en = { 
    helloWorld = "Hello world", 
    loginWarning = "You need to be logged in to do that" 
} 

i18n.locales.es = { 
    helloWorld = "Hola mundo", 
    loginWarning = "Debes haber iniciado una sesión para hacer eso" 
} 
... 

उपयोग:

local i18n = require 'i18n' 
require 'locales' -- if using a separate file for the locales, require it too 

print(i18n.translate('helloWorld')) -- Hello world 
i18n.setLocale('es') 
-- using i18n() instead of i18n.translate() 
print(i18n('helloWorld')) -- Hola mundo 
+0

किकिटो, विस्तृत पोस्ट के लिए बहुत धन्यवाद। एक विचार के रूप में, यदि अनुवाद के बजाय एक मेटाटेबल का उपयोग किया जाता है तो अनुवाद तालिका का उपयोग करना संभव नहीं है? इस तरह, उपयोग i18n.translate ('helloWorld') – nickb

+0

@nickb की बजाय i18n ('हैलोवर्ल्ड') को कॉल करने के रूप में सरल होगा, निश्चित रूप से, मैंने इसे शामिल करने के लिए अपना उत्तर संपादित कर लिया है। मैंने स्थानीय टी – kikito

+0

भी हटा दिया है धन्यवाद, यह बहुत उपयोगी था, लेकिन मुझे एक बग मिला, और मैंने आपका कोड संपादित किया, अनुवाद को अनुवाद करने के लिए स्ट्रिंग की आईडी को पास करने के लिए अनुवाद (...) कहा जाना चाहिए, चीयर्स –

2

लुआ में अनुवाद तालिकाओं का उपयोग करना बहुत आसान है। सबसे पहले आपको कोड लिखें ताकि प्रत्येक स्ट्रिंग को अनुवादित करने की आवश्यकता हो, जिसे फ़ंक्शन कॉल के माध्यम से उपयोग किया जाता है, जैसा कि i18n"Hello World" कहता है। फिर उन भाषाओं के लिए अनुवाद तालिकाओं को लिखें जिन्हें आप समर्थन देना चाहते हैं। उदाहरण के लिए, English={["Hello World"]="Hello World"} (या एक इंडेक्स मेटामॉइड जोड़ें जो स्ट्रिंग को दोहराने से बचने के लिए केवल कुंजी लौटाता है) और French={["Hello World"]="Salut le monde"}। अंत में function i18n(s) return Language[s] end लिखें और इसलिए जब आपको इसकी आवश्यकता हो तो Language=French सेट करें।

+0

तो ऐसा कुछ है?
तार = {}
तार [ "जर्मनी"] = { "Anwendung", "फेंस्टर"}
तार [ "अंग्रेज़ी"] = { "अनुप्रयोग", "खिड़की"}
language = "अंग्रेज़ी"
प्रिंट (स्ट्रिंग्स [भाषा] [1]) – nickb

+2

यदि आप इसे इस तरह करते हैं तो आप संख्यात्मक कुंजी में खुद को खो देंगे। एक दिन आपको 'भाषा [1824]' दिखाई देगी और यह नहीं पता कि कौन सी स्ट्रिंग 1824 है, और आपकी अनुवाद फ़ाइल भी बहुत पठनीय नहीं होगी। लुइज़ ने सुझाव दिया कि बेहतर करें - कुंजी के रूप में "डिफ़ॉल्ट" अंग्रेजी स्ट्रिंग का उपयोग करें - इस तरह, आप हमेशा यह जान लेंगे कि आप क्या अनुवाद कर रहे हैं। –

+0

भाषा प्रविष्टियों के लिए enum-style नामों का उपयोग करना आम है। उदाहरण के लिए: 'अंग्रेज़ी = {ACCOUNT_CREATION_ERROR_PASSWORD_CAPITALS = "आपको कम से कम 3 पूंजी अक्षरों की आवश्यकता है।"} '। हालांकि आंखों पर अच्छा नहीं है, यह तार्किक अर्थ बनाता है, और "हैलो वर्ल्ड" जैसे "हैलो वर्ल्ड" से मेल खाने वाले टाइपो को रोकता है। – Deco

0

मैंने स्ट्रिंग की एक तालिका को परिभाषित करने वाले मॉड्यूल का उपयोग करके, मेरी एक परियोजना, bib.lua के लिए lhf के उत्तर में उसी तरह हल किया। मैं बस इसे साझा करने के बारे में सोचा था, तो आप वास्तव में कुछ समान रूप से कुछ कोड देख सकते हैं।

यह bib/trans.lua में है।

कुछ चीजें हैं जो मेरे दृष्टिकोण में जोड़ा जा सकता है कर रहे हैं:

  1. जाँच हो रही है पूरा हो गया है, तो उपयोग में अनुवाद, जैसे संदर्भ भाषा में परिभाषित सभी स्ट्रिंग्स उपयोग में भाषा में परिभाषित कर रहे हैं। या बेहतर अभी तक, परिभाषित करने के लिए प्रोग्राम में सभी तारों की जांच करें।

  2. अलग गैर संदर्भ भाषाओं पर एक metatable तंत्र एक चेतावनी मुद्रित, और संदर्भ भाषा लेबल वापसी अगर यह प्रयोग में भाषा में उपलब्ध नहीं है करने के लिए।

उन चीजों को एक तरफ, मैं इसके साथ काफी सहज था। केवल कठिनाइयों का सामना करना पड़ता है यदि भाषा संरचना में मतभेदों के कारण तारों के टुकड़े काफी मेल नहीं खाते हैं। मुझे आश्चर्य है कि इन्हें कैसे हल किया जाए।

+0

हाय jpjacobs, आप निम्न फ़ाइल का उपयोग कैसे करते हैं? https://github.com/jpjacobs/bib/blob/master/bib-0.1/bib/trans.lua – nickb

+0

यह आवश्यक है [यहां] (https://github.com/jpjacobs/bib/blob /master/bib-0.1/bib/config.lua#L20)। इसके बाद आप 'स्ट्रिंग्स = bib.trans.strings [en] 'का उपयोग करके बस एक भाषा चुनें। फिर जब भी आपको स्ट्रिंग की आवश्यकता होती है, इसे 'trans.lua' में बनाएं, और इसके बजाय 'strings.the_key_you_chose_for_your_string' का उपयोग करें। – jpjacobs

संबंधित मुद्दे