loc
Aprašysiu kaip paversti shell scenarijų lokalizuojamu.

Pasiruošimas

Scenarijuje tereikia pridėti kelias eilutes:

TEXTDOMAINDIR=/usr/share/locale
TEXTDOMAIN=programa
. gettext.sh

TEXTDOMAINDIR – kur ieškoti vertimo failo (priimta naudoti /usr/share/locale arba /usr/local/share/locale aplankus)
TEXTDOMAIN – kaip pavadintas vertimo failas (be galūnės „.mo“). Galima nenaudoti ir tą argumentą perduoti funkcijos argumentuose, pvz. gettext -d programa „hello world“
gettext.sh – tame faile aprašytos gettext funkcijos, funkcijos „gettext“ ir „ngettext“ veikia ir be to failo

Išvesties aprašymas

Žodis kurį reikia versti aprašomas funkcijomis:
1. $““ (pasenęs būdas, bet kodas lengviau skaitomas)
2. gettext, ngettext. Jei eilutėj yra kintamasis reikia naudoti eval_gettext arba eval_ngettext funkcijas, jei nėra, galima naudoti gettext ir ngettext
Galima rašyt:

echo $(gettext "string")

bet lygiai taip pat gerai veiks ir

gettext "string"; echo #gettext grąžina tekstą kuris nesibaigia nauja eilute, todėl reikia pridėt „; echo“

Pavyzdinis scenarijus (programa.sh):

#!/bin/bash
TEXTDOMAINDIR=/usr/share/locale
TEXTDOMAIN=programa
export TEXTDOMAIN
. gettext.sh
echo $"Hello" #tiesiog tekstas
echo $(gettext "world") #tiesiog tekstas, aprašytas su rekomenduojama funkcija
num=$(ls |wc -l) #skaičius kuris bus pateikiamas tekstui su daugiskaitos forma
echo $(eval_ngettext "in this folder there is 1 file" "in this folder there are $num files" $num) #daugiskaitos forma
echo -e $(gettext "hello nworld nmulti nline string") #kelios eilutės

Vertimo failai .pot/.po

Scenarijus parašytas, dabar reikia sukurti vertimo šabloną:

xgettext programa.sh

bus sukurtas šablonas „messages.po“, galim naudot ir tokį variantą, bet geriau sugeneruot gražų šabloną (su visa reikalinga informacija):

xgettext --from-code=utf-8 -L shell -o programa.pot programa.sh --copyright-holder=gymka --package-name=programa --package-version=1.0 --msgid-bugs-address=programa@bugs.lt

Atveriam „programa.pot“ su tam skirta programa (poedit, gtranslator, lokalize, ir t.t.), išverčiam, išsaugom kaip „lt.po“.

Vertimo diegimas

Dabar reikia įdiegti tą kalbą, kad programa ją rastų:

sudo msgfmt lt.po -o /usr/share/locale/lt/LC_MESSAGES/programa.mo

realioj programoj tai atrodys maždaug taip:

locales="lt ru ja fr it pl"
for i in $locales
do
sudo msgfmt $i.po -o /usr/share/locale/$i/LC_MESSAGES/programa.mo
done

taip bus įdiegiamos iškart visos kalbos (lt.po ru.po…)

Testavimas

Kadangi programa išversta ir jos vertimas įdiegtas, galima paleisti:

$ ./programa.sh
Labas
pasauli
šiame aplanke yra 11 failų
labas
pasauli
kelių eilučių
sakinys
$ env LANG=en ./programa.sh
Hello
world
in this folder there are 11 files
hello
world
multi
line string

Naudoti failai

Likę pavyzdiniai failai:

$ cat programa.pot
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR gymka
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <email@address>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: programa 1.0n"
"Report-Msgid-Bugs-To: programa@bugs.ltn"
"POT-Creation-Date: 2013-03-28 13:45+0200n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn"
"Last-Translator: FULL NAME <email@address>n"
"Language-Team: LANGUAGE <ll@li.org>n"
"Language: n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=CHARSETn"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;n"

#: programa.sh:5
msgid "Hello"
msgstr ""

#: programa.sh:6
msgid "world"
msgstr ""

#: programa.sh:8
#, sh-format
msgid "in this folder there is 1 file"
msgid_plural "in this folder there are $num files"
msgstr[0] ""
msgstr[1] ""

#: programa.sh:9
msgid "hello \nworld \nmulti \nline string"
msgstr ""
$ cat lt.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR gymka
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <email@address>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: programa 1.0n"
"Report-Msgid-Bugs-To: programa@bugs.ltn"
"POT-Creation-Date: 2013-03-28 13:39+0200n"
"PO-Revision-Date: 2013-03-28 13:43+0300n"
"Last-Translator: Algimantas Margevičius <margevicius.algimantas@gmail.com>n"
"Language-Team: LANGUAGE <ll@li.org>n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);n"
"X-Generator: Poedit 1.5.4n"

#: programa.sh:5
msgid "Hello"
msgstr "Labas"

#: programa.sh:6
msgid "world"
msgstr "pasauli"

#: programa.sh:8
#, sh-format
msgid "in this folder there is 1 file"
msgid_plural "in this folder there are $num files"
msgstr[0] "šiame aplanke yra 1 failas"
msgstr[1] "šiame aplanke yra $num failai"
msgstr[2] "šiame aplanke yra $num failų"

#: programa.sh:9
msgid "hello \nworld \nmulti \nline string"
msgstr "labas \npasauli \nkelių eilučių \nsakinys"