Tại sao miền địa phương es_MX hoạt động nhưng không es?


7

Mục nhập Wikipedia cho GNU gettext cho thấy một ví dụ trong đó miền địa phương chỉ là ngôn ngữ, "fr". Trong khi đó, 'i18n gettext () thì xin chào thế giới Ví dụ' trong SO có giá trị bản địa với cả ngôn ngữ và quốc gia, " es_MX".

Tôi đã sửa đổi es_MXví dụ "" để chỉ sử dụng lanuage, "es". Điều này bao gồm việc tạo một danh mục tin nhắn "es" thay vì "'es_MX'" và gọi chương trình với biến môi trường LANG được đặt thành "es". Nhưng điều này tạo ra văn bản tiếng Anh thay vì tiếng Tây Ban Nha dự kiến.

cat >hellogt.cxx <<EOF
// hellogt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellogt", ".");
    textdomain( "hellogt");
    std::cout << gettext("hello, world!") << std::endl;
}
EOF
g++ -ohellogt hellogt.cxx
xgettext -d hellogt -o hellogt.pot hellogt.cxx
msginit --no-translator -l es -o hellogt_spanish.po -i hellogt.pot
sed --in-place hellogt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
sed --in-place hellogt_spanish.po --expression='s/PACKAGE VERSION/hellogt 1.0/'
mkdir -p ./es.utf8/LC_MESSAGES
msgfmt -c -v -o ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANG=es.utf8 ./hellogt

Theo Kiểm soát miền địa phương của bạn với các biến môi trường :

biến môi trường, LANGUAGE, chỉ được sử dụng bởi GNU gettext ... Nếu được xác định, LANGUAGE được ưu tiên hơn LC_ALL, LC_MESSAGES và LANG.

LANGUAGE=es.utf8 ./hellogt

sản xuất văn bản tiếng Tây Ban Nha dự kiến ​​chứ không phải tiếng Anh.

Nhưng điều này không giải thích tại sao "LANG = es" không hoạt động.


1
Bạn đang làm việc trên distro nào?
FerranB

1
Điều đáng chú ý là không có tiêu chuẩn cho tên địa phương. Hầu hết các thông báo xác định tên miền địa phương của biểu mẫu xx_YYtrong đó xxlà một phụ đề ngôn ngữYYlà một phụ đề khu vực, đôi khi được theo sau bởi một dấu hiệu bộ ký tự.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


4

Wikipedia có lẽ không phải là tài liệu tham khảo tốt nhất cho những thứ như thế này. Nó thường có các ví dụ rất đơn giản có thể không được áp dụng rộng rãi, được xây dựng để hiểu các khái niệm nhiều hơn là cho các cân nhắc thực tế.

Tại sao không sử dụng tài liệu riêng của gnu?

http://www.gnu.org/software/gettext/manual/gettext.html#Setting-the-POSIX-Locale

Bạn có thể đặt LANGUAGE thành "es" (hoặc thậm chí "es: fr: en" cho danh sách ưu tiên), nhưng LANG vẫn cần phải được đặt thành es_MX hoặc đại loại như thế. Các tài liệu giải thích nó khá rõ ràng.


4

Từ liên kết của Zac Thompson đến các tiện ích gettext GNU phần 2.3 Đặt Địa điểm thông qua Môi trường Biến phần phụ Biến LANGUAGE :

Trong biến môi trường LANGUAGE, nhưng không phải trong các biến môi trường khác, các kết hợp 'll_CC' có thể được viết tắt là 'll' để biểu thị phương ngữ chính của ngôn ngữ. Ví dụ: 'de' tương đương với 'de_DE' (tiếng Đức như được nói ở Đức) và 'pt' thành 'pt_PT' (tiếng Bồ Đào Nha được nói ở Bồ Đào Nha) trong ngữ cảnh này.

Làm cho điểm "es" là một từ viết tắt chỉ LANGUAGEnhưng không LANGhỗ trợ.


4

Vị trí bạn sử dụng phải được tạo trong hệ thống. Sử dụng locale -ađể xem tất cả các địa phương được tạo. Các tệp nguồn cục bộ phải được trình bày bên dưới /usr/share/i18n/locales/và theo như tôi có thể thấy, tất cả đều thuộc loại 'ngôn ngữ_COUNTRY'. Nếu bạn thực sự phải sử dụng ngôn ngữ 'es', bạn có thể chuẩn bị các tệp cần thiết, bạn có thể sửa đổi /etc/locale.genđể bao gồm 'es' và chạy locale-gen để tạo nó. Mặt khác, sử dụng ngôn ngữ địa phương với một quốc gia.


2

Điều này có thể là do tiếng Tây Ban Nha được nói ở nhiều quốc gia khác nhau và có thể có các biến thể và sự kỳ quặc giữa các phương ngữ? Tương tự như en_US, en_CA hoặc en_GB, v.v.

Trên thực tế, đây là các lựa chọn của bạn - Tôi nghĩ bạn có thể đoán hầu hết các quốc gia (AR = Argentina, BO = Bolivia, CL = Chile, v.v.)

es_AR
es_AR.iso88591
es_AR.utf8
es_BO
es_BO.iso88591
es_BO.utf8
es_CL
es_CL.iso88591
es_CL.utf8
es_CO
es_CO.iso88591
es_CO.utf8
es_CR
es_CR.iso88591
es_CR.utf8
es_DO
es_DO.iso88591
es_DO.utf8
es_EC
es_EC.iso88591
es_EC.utf8
es_ES
es_ES@euro
es_ES.iso88591
es_ES.iso885915@euro
es_ES.utf8
es_ES.utf8@euro
es_GT
es_GT.iso88591
es_GT.utf8
es_HN
es_HN.iso88591
es_HN.utf8
es_MX
es_MX.iso88591
es_MX.utf8
es_NI
es_NI.iso88591
es_NI.utf8
es_PA
es_PA.iso88591
es_PA.utf8
es_PE
es_PE.iso88591
es_PE.utf8
es_PR
es_PR.iso88591
es_PR.utf8
es_PY
es_PY.iso88591
es_PY.utf8
es_SV
es_SV.iso88591
es_SV.utf8
es_US
es_US.iso88591
es_US.utf8
es_UY
es_UY.iso88591
es_UY.utf8
es_VE
es_VE.iso88591
es_VE.utf8

1

Tôi không thực sự chắc chắn về điều này, nhưng tôi đã làm việc với Joomla và các CMS khác và mã cho tiếng Tây Ban Nha - Tây Ban Nha là: es_ES

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.