1
0
mirror of https://github.com/minetest-mods/intllib.git synced 2025-01-23 16:30:18 +01:00

Add Selected gettext

This commit is contained in:
BrunoMine 2017-07-13 14:11:08 -03:00
parent f7a8c24fa6
commit e5636432aa
9 changed files with 169 additions and 293 deletions

View File

@ -1,20 +1,11 @@
<<<<<<< HEAD
# Lib de Internacionalização para Minetest
Por Diego Martínez (kaeza).
Lançado sob Unlicense. Veja `LICENSE.md` para detalhes.
=======
# Lib de Internacionalização para Minetest
Por Diego Martínez (kaeza).
Lançado como WTFPL.
>>>>>>> master
Este mod é uma tentativa de fornecer suporte de internacionalização para mods
(algo que Minetest atualmente carece).
<<<<<<< HEAD
Se você tiver algum comentário/sugestão, favor postar no
[tópico do fórum][topico]. Para reportar bugs, use o
@ -30,13 +21,6 @@ O mod tenta detectar o seu idioma, mas como não há atualmente nenhuma
maneira portátil de fazer isso, ele tenta várias alternativas:
Para usar este mod, basta [instalá-lo][instalando_mods]
=======
## Como usar
### Para usuários finais
Para usar este mod, basta [instalá-lo] (http://wiki.minetest.net/Installing_Mods)
>>>>>>> master
e habilita-lo na GUI.
O modificador tenta detectar o idioma do usuário, mas já que não há atualmente
@ -44,7 +28,6 @@ nenhuma maneira portátil para fazer isso, ele tenta várias alternativas, e usa
o primeiro encontrado:
* `language` definido em `minetest.conf`.
<<<<<<< HEAD
* Variável de ambiente `LANGUAGE`.
* Variável de ambiente `LANG`.
* Se todos falharem, usa `en` (inglês).
@ -65,127 +48,3 @@ Se você é um tradutor, consulte `doc/translator.md`.
[bugtracker]: https://github.com/minetest-mods/intllib/issues
[instalando_mods]: http://wiki.minetest.net/Installing_Mods/pt-br
[ISO639-1]: https://pt.wikipedia.org/wiki/ISO_639
=======
* Se isso não for definido, ele usa a variável de ambiente `LANG` (isso
é sempre definido em SO's Unix-like).
* Se todos falharem, usa `en` (que basicamente significa string não traduzidas).
Em todo caso, o resultado final deve ser um
[Código de Idioma ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
do idioma desejado. Observe também que (atualmente) somente até os dois primeiros
caracteres são usados, assim, por exemplo, os códigos `pt_BR.UTF-8`, `pt_BR`, e `pt`
são todos iguais.
Alguns códigos comuns são `es` para o espanhol, `pt` para Português, `fr` para o
francês, `It` para o italiano, `de` Alemão.
### Para desenvolvedores de mods
A fim de habilitá-lo para o seu mod, copie o seguinte trecho de código e cole no
início de seu(s) arquivo(s) fonte(s):
```lua
-- Clichê para apoiar cadeias localizadas se mod intllib está instalado.
local S
if minetest.get_modpath("intllib") then
S = intllib.Getter()
else
-- Se você não usar inserções (@1, @2, etc) você pode usar este:
S = function(s) return s end
-- Se você usar inserções, mas não usar escapes de inserção (\=, \n, etc) isso vai funcionar:
S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end
-- Use isso se você precisar de funcionalidade total:
S = function(s,a,...)if a==nil then return s end a={a,...}return s:gsub("(@?)@(%(?)(%d+)(%)?)",function(e,o,n,c)if e==""then return a[tonumber(n)]..(o==""and c or"")else return"@"..o..n..c end end) end
end
```
Você também vai precisar depender opcionalmente do mod intllib, adicionando "intllib?"
em uma linha vazia de seu depends.txt. Observe também que se intllib não estiver
instalado, a função S() é definido para retornar a string inalterada. Isto é feito
para que você não tenha que usar dezenas de 'if's (ou de estruturas semelhantes)
para verificar se a lib está realmente instalada.
Em seguida, para cada string "traduzível" em suas fontes, use a função S()
(definida no trecho anterior) para retornar uma string traduzida. Por exemplo:
```lua
minetest.register_node("mymod:meunode", {
-- String simples
description = S("Meu Node Fabuloso"),
-- String com inserção de variáveis
description = S("@1 Car", "Blue"),
-- ...
})
```
Em seguida, crie um diretório chamado `locale` dentro do diretório do seu mod,
e crie um arquivo modelo (por convenção, nomeado `template.txt`) contendo todas
as strings traduzíveis (veja *Formato de arquivo Locale* abaixo). Tradutores
irão traduzir as strings neste arquivo para adicionar idiomas ao seu mod.
### Para tradutores
Para traduzir um mod intllib-apoiado para o idioma desejado, copie o
arquivo `locale/template.txt` para`locale/IDIOMA.txt` (onde `IDIOMA` é o
[Código de Idioma ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
do idioma desejado.
Abra o novo arquivo no seu editor favorito, e traduza cada linha colocando
o texto traduzido após o sinal de igual.
Veja *Formato de arquivo Locale* abaixo para mais informações sobre o formato de arquivo.
## Formato de arquivo Locale
Aqui está um exemplo de um arquivo locale Português (`pt.txt`):
```cfg
# Um comentário.
# Outro Comentário.
Esta linha é ignorada, uma vez que não tem sinal de igual.
Hello, World! = Ola, Mundo!
String with\nnewlines = String com\nsaltos de linha
String with an \= equals sign = String com sinal de \= igual
```
Locale (ou tradução) são arquivos de texto simples que consistem em linhas da
forma `texto de origem = texto traduzido`. O arquivo deve residir no subdiretório
`locale` do mod, e deve ser nomeado com as duas letras do
[Código de Idioma ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
do idioma que deseja apoiar.
Os arquivos de tradução devem usar a codificação UTF-8.
As linhas que começam com um sinal de libra (#) são comentários e são efetivamente
ignorados pelo interpretador. Note que comentários duram apenas até o fim da linha;
não há suporte para comentários de várias linhas. Linhas sem um sinal de igual são
ignoradas também.
Caracteres considerados "especiais" podem ser "escapados" para que sejam
interpretados corretamente. Existem várias sequências de escape que podem ser usadas:
* Qualquer `#` ou `=` pode ser escapado para ser interpretado corretamente.
A sequência `\#` é útil se o texto de origem começa com `#`.
* Sequências de escape comuns são `\n` e` \t`, ou seja, de nova linha e
guia horizontal, respectivamente.
* A sequência de escape especial `\s` representa o caractere de espaço. isto
pode ser útil principalmente para adicionar espaços antes ou depois de fonte ou
textos traduzida, uma vez que estes espaços seriam removidos de outro modo.
## Palavras Finais
Obrigado por ler até este ponto.
Se você tiver quaisquer comentários/sugestões, por favor poste no
[Tópico do fórum](https://forum.minetest.net/viewtopic.php?id=4929) (em inglês). Para
relatórios de bugs, use o [Rastreador de bugs](https://github.com/minetest-mods/intllib/issues/new)
no Github.
Haja textos traduzidos! :P
\--
Atenciosamente,
Kaeza
>>>>>>> master

141
README.md
View File

@ -2,16 +2,11 @@
# Internationalization Lib for Minetest
By Diego Martínez (kaeza).
<<<<<<< HEAD
Released under Unlicense. See `LICENSE.md` for details.
=======
Released as WTFPL.
>>>>>>> master
This mod is an attempt at providing internationalization support for mods
(something Minetest currently lacks).
<<<<<<< HEAD
Should you have any comments/suggestions, please post them in the
[forum topic][topic]. For bug reports, use the [bug tracker][bugtracker]
on Github.
@ -46,139 +41,3 @@ If you are a translator, see `doc/translator.md`.
[bugtracker]: https://github.com/minetest-mods/intllib/issues
[installing_mods]: https://wiki.minetest.net/Installing_mods
[ISO639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
=======
## How to use
### For end users
To use this mod, just [install it](http://wiki.minetest.net/Installing_Mods)
and enable it in the GUI.
The mod tries to detect the user's language, but since there's currently no
portable way to do this, it tries several alternatives, and uses the first one
found:
* `language` setting in `minetest.conf`.
* If that's not set, it uses the `LANG` environment variable (this is
always set on Unix-like OSes).
* If all else fails, uses `en` (which basically means untranslated strings).
In any case, the end result should be the
[ISO 639-1 Language Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
of the desired language. Also note that (currently) only up to the first two
characters are used, so for example, the settings `de_DE.UTF-8`, `de_DE`,
and `de` are all equal.
Some common codes are `es` for Spanish, `pt` for Portuguese, `fr` for French,
`it` for Italian, `de` for German.
### For mod developers
In order to enable it for your mod, copy the following code snippet and paste
it at the beginning of your source file(s):
```lua
-- Boilerplate to support localized strings if intllib mod is installed.
local S
if minetest.get_modpath("intllib") then
S = intllib.Getter()
else
-- If you don't use insertions (@1, @2, etc) you can use this:
S = function(s) return s end
-- If you use insertions, but not insertion escapes this will work:
S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end
-- Use this if you require full functionality
S = function(s,a,...)if a==nil then return s end a={a,...}return s:gsub("(@?)@(%(?)(%d+)(%)?)",function(e,o,n,c)if e==""then return a[tonumber(n)]..(o==""and c or"")else return"@"..o..n..c end end) end
end
```
You will also need to optionally depend on intllib, to do so add `intllib?` to
an empty line in your `depends.txt`. Also note that if intllib is not installed,
the `S` function is defined so it returns the string unchanged. This is done
so you don't have to sprinkle tons of `if`s (or similar constructs) to check
if the lib is actually installed.
Next, for each translatable string in your sources, use the `S` function
(defined in the snippet) to return the translated string. For example:
```lua
minetest.register_node("mymod:mynode", {
-- Simple string:
description = S("My Fabulous Node"),
-- String with insertions:
description = S("@1 Car", "Blue"),
-- ...
})
```
Then, you create a `locale` directory inside your mod directory, and create
a "template" file (by convention, named `template.txt`) with all the
translatable strings (see *Locale file format* below). Translators will
translate the strings in this file to add languages to your mod.
### For translators
To translate an intllib-supporting mod to your desired language, copy the
`locale/template.txt` file to `locale/LANGUAGE.txt` (where `LANGUAGE` is the
[ISO 639-1 Language Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
of your language.
Open up the new file in your favorite editor, and translate each line putting
the translated text after the equals sign.
See *Locale file format* below for more information about the file format.
## Locale file format
Here's an example for a Spanish locale file (`es.txt`):
```cfg
# A comment.
# Another comment.
This line is ignored since it has no equals sign.
Hello, World! = Hola, Mundo!
String with\nnewlines = Cadena con\nsaltos de linea
String with an \= equals sign = Cadena con un signo de \= igualdad
```
Locale (or translation) files are plain text files consisting of lines of the
form `source text = translated text`. The file must reside in the mod's `locale`
subdirectory, and must be named after the two-letter
[ISO 639-1 Language Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
of the language you want to support.
The translation files should use the UTF-8 encoding.
Lines beginning with a pound sign are comments and are effectively ignored
by the reader. Note that comments only span until the end of the line;
there's no support for multiline comments. Lines without an equals sign are
also ignored.
Characters that are considered "special" can be "escaped" so they are taken
literally. There are also several escape sequences that can be used:
* Any of `#`, `=` can be escaped to take them literally. The `\#`
sequence is useful if your source text begins with `#`.
* The common escape sequences `\n` and `\t`, meaning newline and
horizontal tab respectively.
* The special `\s` escape sequence represents the space character. It
is mainly useful to add leading or trailing spaces to source or
translated texts, as these spaces would be removed otherwise.
## Final words
Thanks for reading up to this point.
Should you have any comments/suggestions, please post them in the
[forum topic](https://forum.minetest.net/viewtopic.php?id=4929). For bug
reports, use the [bug tracker](https://github.com/minetest-mods/intllib/issues/new)
on Github.
Let there be translated texts! :P
\--
Yours Truly,
Kaeza
>>>>>>> master

View File

@ -209,8 +209,18 @@ local function load_catalog(filename)
return data
end
function M.load_catalogs(path)
local langs = intllib.get_detected_languages()
function M.load_catalogs(path, first_lang)
-- add selected first lang
if first_lang then
langs = {}
table.insert(langs, first_lang)
for _, lang in ipairs(intllib.get_detected_languages()) do
langs[#langs+1] = lang
end
else
langs = intllib.get_detected_languages()
end
local cats = { }
for _, lang in ipairs(langs) do

View File

@ -178,8 +178,15 @@ function intllib.make_gettext_pair(modname)
or getter(msgid))
return do_replacements(msgstr, ...)
end
gettext_getters[modname] = { gettext_func, ngettext_func }
return gettext_func, ngettext_func
-- Get string of Selected language
local function sgettext_func(lang, msgid, ...)
local scatalogs = gettext.load_catalogs(localedir, lang)
local msgstr = (catgettext(scatalogs, msgid)
or getter(msgid))
return do_replacements(msgstr, ...)
end
gettext_getters[modname] = { gettext_func, ngettext_func, sgettext_func }
return gettext_func, ngettext_func, sgettext_func
end

View File

@ -1,7 +1,7 @@
-- Load support for intllib.
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local S, NS, SS = dofile(MP.."/intllib.lua")
local use_count = 0
@ -26,3 +26,8 @@ minetest.register_craftitem("intltest:test", {
minetest.chat_send_player(user:get_player_name(), message)
end,
})
minetest.log("action", "(nil)"..SS(nil, "Test: @1 @2", SS(nil, "Blue"), SS(nil, "Car")))
minetest.log("action", "(es) "..SS("es", "Test: @1 @2", SS("es", "Blue"), SS("es", "Car")))
minetest.log("action", "(pt) "..SS("pt", "Test: @1 @2", SS("pt", "Blue"), SS("pt", "Car")))
minetest.log("action", "(de) "..SS("de", "Test: @1 @2", SS("de", "Blue"), SS("de", "Car")))

View File

@ -1,3 +1,47 @@
-- This file should be replaced by `intllib/lib/intllib.lua`.
return dofile(minetest.get_modpath("intllib").."/lib/intllib.lua")
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext, sgettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext, sgettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
sgettext = sgettext or gettext
return gettext, ngettext, sgettext

45
intltest/locale/de.po Normal file
View File

@ -0,0 +1,45 @@
# I18N Test Mod.
# Copyright (C) 2013-2017 Diego Martínez <kaeza@users.sf.net>
# This file is distributed under the same license as the intllib mod.
# Diego Martínez <kaeza@users.sf.net>, 2013-2017.
# Diego Martnez <kaeza@users.sf.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: I18N Test Mod 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 20:40-0300\n"
"PO-Revision-Date: 2017-07-13 13:36-0300\n"
"Last-Translator: Diego Martnez <kaeza@users.sf.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.7\n"
#: init.lua
msgid "Hello, world!"
msgstr "Hallo Welt!"
#. Translators: @1 is color, @2 is object.
#: init.lua
msgid "Blue"
msgstr "Blau"
#: init.lua
msgid "Car"
msgstr "Auto"
#. Translators: @1 is color, @2 is object.
#: init.lua
msgid "Test: @1 @2"
msgstr "Test: @2 @1"
#. Translators: @1 is use count.
#: init.lua
msgid "Item has been used @1 time."
msgid_plural "Item has been used @1 times."
msgstr[0] ""
msgstr[1] ""

45
intltest/locale/pt.po Normal file
View File

@ -0,0 +1,45 @@
# I18N Test Mod.
# Copyright (C) 2013-2017 Diego Martínez <kaeza@users.sf.net>
# This file is distributed under the same license as the intllib mod.
# Diego Martínez <kaeza@users.sf.net>, 2013-2017.
# Diego Martnez <kaeza@users.sf.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: I18N Test Mod 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 20:40-0300\n"
"PO-Revision-Date: 2017-07-13 13:35-0300\n"
"Last-Translator: Diego Martnez <kaeza@users.sf.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.7\n"
#: init.lua
msgid "Hello, world!"
msgstr "Ola, mundo!"
#. Translators: @1 is color, @2 is object.
#: init.lua
msgid "Blue"
msgstr "Azul"
#: init.lua
msgid "Car"
msgstr "Carro"
#. Translators: @1 is color, @2 is object.
#: init.lua
msgid "Test: @1 @2"
msgstr "Teste: @2 @1"
#. Translators: @1 is use count.
#: init.lua
msgid "Item has been used @1 time."
msgid_plural "Item has been used @1 times."
msgstr[0] "Esse objeto foi usado @1 vez."
msgstr[1] "Esse objeto foi usado @2 vezes."

View File

@ -21,11 +21,11 @@ local function format(str, ...)
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
local gettext, ngettext, sgettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
gettext, ngettext, sgettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
@ -42,4 +42,6 @@ ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext
sgettext = sgettext or gettext
return gettext, ngettext, sgettext