Lua - 如何进行国际化?

我建立了一个 Lua web 应用程序,现在清楚地看到我需要开始国际化("i18n")为我的海外客户。

在 Lua 中,什么是国际化我的应用程序的最佳方法?

我意识到这是一项重大任务,特别是由于我的某些显示是硬编码在 HTML 模板中的,并且我的一些数据字段是针对当前美国英语定向的数据库。

我们将不胜感激地接受任何指导。

原文链接 https://stackoverflow.com/questions/8886615

点赞
stackoverflow用户107090
stackoverflow用户107090

在 Lua 中使用翻译表非常简单。首先编写代码,使得每个需要翻译的字符串都通过函数调用来使用,例如 i18n"Hello World"。然后为要支持的语言编写翻译表。例如,English={["Hello World"]="Hello World"}(或者添加一个索引元方法,只返回键,以避免重复字符串),以及 French={["Hello World"]="Salut le monde"}。最后编写 function i18n(s) return Language[s] end,然后在需要时设置 Language=French

2012-01-16 23:11:25
stackoverflow用户513763
stackoverflow用户513763

我基本上是以lhf在bib.lua中的回答方式解决这个问题的,使用一个定义字符串表的模块。我想分享一下,这样你就可以看到一些真正使用类似东西的代码了。

它在bib/trans.lua中。

我使用的一些方法可能还可以添加以下内容:

  1. 检查使用的翻译是否完整,例如在使用的语言中定义了所有在“参考”语言中定义的字符串。或者更好的是,甚至检查程序中定义的所有字符串是否都已定义。

2.在不同的“非参考”语言上使用metatable机制来发出警告,并返回“参考”语言标签,如果在使用的语言中不可用。

除了这些事情之外,我觉得现在就很舒适了。唯一的困难是,如果字符串块由于语言结构的差异而不完全匹配,我不知道该怎么解决。

2012-01-17 07:58:44
stackoverflow用户312586
stackoverflow用户312586

有人可以把上面的示例代码稍微讲清楚一些吗?

当然可以。

在一个文件中,您定义了一个带有以下方法的 i18n 变量:

local i18n = { locales = {} }

local currentLocale = 'en' -- 默认语言

function i18n.setLocale(newLocale)
  currentLocale = newLocale
  assert(i18n.locales[currentLocale], ("未知的语言环境:%q"):format(newLocale))
end

local function translate(id)
  local result = i18n.locales[currentLocale][id]
  assert(result, ("当前语言环境(%q)中未找到id%q"):format(currentLocale, id))
  return result
end

i18n.translate = translate

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

return i18n

在同一个文件中或其他文件中,您需要包含所需的语言环境在 i18n.locales 中。

local i18n = require 'i18n' -- 如果在之前的文件中,请删除此行。

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' -- 如果使用单独的文件用于语言环境,请也需要将其引入。

print( i18n.translate('helloWorld') ) -- Hello world
i18n.setLocale('es')
-- 使用 i18n() 而不是 i18n.translate()
print( i18n('helloWorld') ) -- Hola mundo
2012-01-17 08:28:52