ການແປຊອບແວໂດຍໃຊ້ GNU gettext¶
GNU gettext ເປັນໜຶ່ງໃນເຄື່ອງມືທີ່ຖືກນຳໃຊ້ຢ່າງແຜ່ຫຼາຍທີ່ສຸດສຳລັບການເຮັດ Internationalization ຂອງຊອບແວເສລີ. ມັນສະໜອງວິທີທີ່ງ່າຍແຕ່ມີຄວາມຍືດຫຍຸ່ນໃນການ Localize ຊອບແວ. ມັນຮອງຮັບພົດພະຈານ (plurals) ໄດ້ດີເລີດ, ສາມາດເພີ່ມບໍລິບົດເພີ່ມເຕີມໃຫ້ກັບຂໍ້ຄວາມທີ່ແປ ແລະ ມີເຄື່ອງມືຈຳນວນຫຼາຍທີ່ສ້າງຂຶ້ນອ້ອມຮອບມັນ. ແນ່ນອນວ່າມັນໄດ້ຮັບການຮອງຮັບຢ່າງດີໃນ Weblate (ເບິ່ງຄຳອະທິບາຍຮູບແບບໄຟລ໌ GNU gettext PO (Portable Object)).
Note
ຖ້າເຈົ້າກຳລັງຈະໃຊ້ມັນໃນຊອບແວທີ່ເປັນເຈົ້າຂອງ, ກະລຸນາປຶກສາຫາລືກ່ຽວກັບໃບອະນຸຍາດກ່ອນ, ມັນອາດຈະບໍ່ເໝາະສົມກັບເຈົ້າ.
GNU gettext ສາມາດໃຊ້ໄດ້ຈາກຫຼາຍພາສາ (C, Python, PHP, Ruby, JavaScript ແລະ ອື່ນໆອີກຫຼາຍພາສາ) ແລະ ປົກກະຕິແລ້ວ UI Frameworks ກໍມີການຮອງຮັບມັນມາໃຫ້ແລ້ວ. ການນຳໃຊ້ແບບມາດຕະຖານແມ່ນຜ່ານການເອີ້ນຟັງຊັນ gettext() ເຊິ່ງມັກຈະຖືກ Aliased ເປັນ _() ເພື່ອເຮັດໃຫ້ໂຄດງ່າຍຂຶ້ນ ແລະ ອ່ານງ່າຍຂຶ້ນ.
ນອກຈາກນັ້ນ, ມັນຍັງສະໜອງການເອີ້ນ pgettext() ເພື່ອໃຫ້ບໍລິບົດເພີ່ມເຕີມແກ່ນັກແປ ແລະ ngettext() ເຊິ່ງສາມາດຈັດການກັບປະເພດພົດພະຈານຕາມທີ່ກຳນົດໄວ້ສຳລັບພາສາເປົ້າໝາຍ.
ໃນຖານະທີ່ເປັນເຄື່ອງມືທີ່ແຜ່ຫຼາຍ, ມັນມີ Wrappers ຫຼາຍຢ່າງທີ່ເຮັດໃຫ້ການນຳໃຊ້ຂອງມັນງ່າຍຂຶ້ນຫຼາຍ, ແທນທີ່ຈະເອີ້ນໃຊ້ Gettext ດ້ວຍຕົນເອງຕາມທີ່ອະທິບາຍໄວ້ຂ້າງລຸ່ມ, ເຈົ້າອາດຈະຢາກລອງໃຊ້ໜຶ່ງໃນນັ້ນ, ຕົວຢ່າງ intltool.
ພາບລວມຂອງ Workflow¶
GNU gettext ໃຊ້ໄຟລ໌ຫຼາຍຢ່າງເພື່ອຈັດການ Localization:
PACKAGE.potບັນຈຸຂໍ້ຄວາມທີ່ສະກັດມາຈາກ Source code ຂອງເຈົ້າ, ປົກກະຕິຈະໃຊ້ xgettext ຫຼື Wrappers ລະດັບສູງບາງຢ່າງເຊັ່ນ intltool.LANGUAGE.poບັນຈຸຂໍ້ຄວາມພ້ອມການແປເປັນພາສາດຽວ. ມັນຈະຕ້ອງໄດ້ຮັບການອັບເດດໂດຍ msgmerge ເມື່ອPACKAGE.potຖືກອັບເດດ. ເຈົ້າສາມາດສ້າງໄຟລ໌ພາສາໃໝ່ໂດຍໃຊ້ msginit ຫຼື ພາຍໃນ Weblate.LANGUAGE.moບັນຈຸການສະແດງຜົນໃນຮູບແບບໄບນາຣີຂອງLANGUAGE.poແລະ ຖືກນຳໃຊ້ໃນເວລາທີ່ແອັບພລິເຄຊັນເຮັດວຽກ. ປົກກະຕິແລ້ວມັນຈະບໍ່ຖືກເກັບໄວ້ພາຍໃຕ້ Version control, ແຕ່ຈະຖືກສ້າງຂຶ້ນໃນເວລາ Compiler ໂດຍໃຊ້ msgfmt. ໃນກໍລະນີທີ່ເຈົ້າຕ້ອງການໃຫ້ມັນຢູ່ໃນ Version control, ເຈົ້າສາມາດສ້າງມັນໃນ Weblate ໂດຍໃຊ້ Add-on ສ້າງໄຟລ໌ MO.
ໂດຍລວມແລ້ວ Workflow ຂອງ GNU gettext ມີລັກສະນະດັ່ງນີ້:
See also
ໂປຣແກຣມຕົວຢ່າງ¶
ໂປຣແກຣມງ່າຍໆໃນ C ທີ່ໃຊ້ Gettext ອາດມີລັກສະນະດັ່ງນີ້:
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int count = 1;
setlocale(LC_ALL, "");
bindtextdomain("hello", "/usr/share/locale");
textdomain("hello");
printf(
ngettext(
"Orangutan has %d banana.\n",
"Orangutan has %d bananas.\n",
count
),
count
);
printf("%s\n", gettext("Thank you for using Weblate."));
exit(0);
}
ການສະກັດຂໍ້ຄວາມທີ່ແປໄດ້¶
ເມື່ອເຈົ້າມີໂຄດທີ່ໃຊ້ການເອີ້ນ Gettext ແລ້ວ, ເຈົ້າສາມາດໃຊ້ xgettext ເພື່ອສະກັດຂໍ້ຄວາມຈາກມັນ ແລະ ເກັບໄວ້ໃນ .pot:
$ xgettext main.c -o po/hello.pot
Note
ມີໂປຣແກຣມທາງເລືອກອື່ນໃນການສະກັດຂໍ້ຄວາມຈາກໂຄດ, ຕົວຢ່າງ pybabel.
ສິ່ງນີ້ຈະສ້າງໄຟລ໌ Template, ເຊິ່ງເຈົ້າສາມາດໃຊ້ສຳລັບການເລີ່ມຕົ້ນການແປໃໝ່ (ໂດຍໃຊ້ msginit) ຫຼື ອັບເດດໄຟລ໌ທີ່ມີຢູ່ຫຼັງຈາກການປ່ຽນແປງໂຄດ (ເຈົ້າຈະຕ້ອງໃຊ້ msgmerge ສຳລັບສິ່ງນັ້ນ). ໄຟລ໌ທີ່ໄດ້ຮັບແມ່ນພຽງແຕ່ໄຟລ໌ຂໍ້ຄວາມທີ່ມີໂຄງສ້າງ:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-23 11:02+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""
#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""
ແຕ່ລະແຖວ msgid ກຳນົດຂໍ້ຄວາມທີ່ຈະແປ, ຂໍ້ຄວາມຫວ່າງເປົ່າພິເສດໃນຕອນເລີ່ມຕົ້ນແມ່ນ Header ຂອງໄຟລ໌ທີ່ບັນຈຸ Metadata ກ່ຽວກັບການແປ.
ການເລີ່ມຕົ້ນການແປໃໝ່¶
ເມື່ອມີ Template ຢູ່ແລ້ວ, ເຮົາກໍສາມາດເລີ່ມການແປຄັ້ງທຳອິດຂອງເຮົາໄດ້:
$ msginit -i po/hello.pot -l cs --no-translator -o po/cs.po
Created cs.po.
cs.po ທີ່ຫາກໍ່ສ້າງຂຶ້ນມີຂໍ້ມູນບາງຢ່າງຖືກຕື່ມໄວ້ແລ້ວ. ສິ່ງທີ່ສຳຄັນທີ່ສຸດຄືມັນມີການກຳນົດຮູບແບບພົດພະຈານທີ່ເໝາະສົມສຳລັບພາສາທີ່ເລືອກ ແລະ ເຈົ້າສາມາດເຫັນວ່າຈຳນວນພົດພະຈານໄດ້ປ່ຽນແປງໄປຕາມນັ້ນ:
# Czech translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Automatically generated, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-23 11:02+0200\n"
"PO-Revision-Date: 2015-10-23 11:02+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""
ໄຟລ໌ນີ້ຖືກ Compile ເປັນຮູບແບບ Binary ທີ່ປັບປຸງໃຫ້ເໝາະສົມ, ເຊິ່ງໄຟລ໌ .mo ຖືກໃຊ້ໂດຍຟັງຊັນ GNU gettext ໃນເວລາເຮັດວຽກ.
ການອັບເດດຂໍ້ຄວາມ¶
ເມື່ອເຈົ້າເພີ່ມຂໍ້ຄວາມຫຼາຍຂຶ້ນ ຫຼື ປ່ຽນຂໍ້ຄວາມບາງຢ່າງໃນໂປຣແກຣມຂອງເຈົ້າ, ເຈົ້າກໍເອີ້ນໃຊ້ xgettext ອີກຄັ້ງ ເຊິ່ງຈະສ້າງໄຟລ໌ Template ຄືນໃໝ່:
$ xgettext main.c -o po/hello.pot
ຈາກນັ້ນເຈົ້າສາມາດອັບເດດໄຟລ໌ການແປແຕ່ລະໄຟລ໌ໃຫ້ກົງກັບ Template ທີ່ສ້າງຂຶ້ນໃໝ່ (ນີ້ລວມເຖິງການຈັດລຳດັບຂໍ້ຄວາມໃໝ່ໃຫ້ກົງກັບ Template ໃໝ່):
$ msgmerge --previous --update po/cs.po po/hello.pot
Note
ເມື່ອໃຊ້ Weblate, ປົກກະຕິເຈົ້າບໍ່ຈຳເປັນຕ້ອງຮັນ msgmerge ດ້ວຍຕົນເອງ. Weblate ສາມາດຈັດການເລື່ອງນີ້ໄດ້ໂດຍອັດຕະໂນມັດຜ່ານ Add-on ອັບເດດໄຟລ໌ PO ໃຫ້ກົງກັບ POT (msgmerge), ຫຼື ເຈົ້າສາມາດອັບໂຫຼດໄຟລ໌ POT ທີ່ອັບເດດແລ້ວໂດຍໃຊ້ວິທີອັບໂຫຼດ Update source strings. ເບິ່ງ ການອັບເດດໄຟລ໌ພາສາເປົ້າໝາຍ ສຳລັບລາຍລະອຽດ.
ການນຳເຂົ້າໄປຍັງ Weblate¶
ເພື່ອນຳເຂົ້າການແປດັ່ງກ່າວເຂົ້າໄປໃນ Weblate, ສິ່ງທີ່ເຈົ້າຕ້ອງກຳນົດມີພຽງແຕ່ຊ່ອງຂໍ້ມູນຕໍ່ໄປນີ້ເມື່ອສ້າງ Component (ເບິ່ງ ການຕັ້ງຄ່າ Component ສຳລັບຄຳອະທິບາຍລາຍລະອຽດຂອງແຕ່ລະຊ່ອງ):
ຊ່ອງ |
ຄ່າ |
|---|---|
ຄັງເກັບຊອດໂຄ້ດ |
URL ຂອງ VCS repository ທີ່ມີໂຄງການຂອງເຈົ້າ |
ໜ້າກາກໄຟລ໌ |
|
ແມ່ແບບສຳລັບການແປໃໝ່ |
|
ຮູບແບບໄຟລ໌ |
ເລືອກ gettext PO file |
ພາສາໃໝ່ |
ເລືອກ Create new language file |
ແລະ ພຽງເທົ່ານັ້ນ, ຕອນນີ້ເຈົ້າກໍພ້ອມທີ່ຈະເລີ່ມແປຊອບແວຂອງເຈົ້າແລ້ວ!
See also
ເຈົ້າສາມາດພົບຕົວຢ່າງ Gettext ທີ່ມີຫຼາຍພາສາໃນໂຄງການ Weblate Hello ບົນ GitHub: <https://github.com/WeblateOrg/hello>.