Utilizando Complete C++ i18n gettext() “hello world” example Cambié la configuración regional de "es_MX
" a "pl_PL
" y el texto de "¡Hola, mundo!" a "Invalid input. Ingrese una cadena de al menos 20 caracteres de longitud". La traducción polaca contiene varios caracteres que provocan errores de "secuencia multibyte no válida" de msgfmt, "łąźó". El texto traducido fue copiado de una página web.msgfmt error de "secuencia multibyte no válida" en un texto polaco
Supongo que utf8 es el problema. Si es así, ¿qué debería usarse en su lugar?
cat >plt.cxx <<EOF
// plt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main(){
setlocale(LC_ALL, "");
bindtextdomain("plt", ".");
textdomain("plt");
std::cout << gettext("Invalid input. Enter a string at least 20 characters long.") << std::endl;
}
EOF
g++ -o plt plt.cxx
xgettext --package-name plt --package-version 1.2 --default-domain plt --output plt.pot plt.cxx
msginit --no-translator --locale pl_PL --output-file plt_polish.po --input plt.pot
sed --in-place plt_polish.po --expression='/#: /,$ s/""/"Nieprawidłowo wprowadzone dane. Wprowadź ciąg przynajmniej 20 znaków."/'
mkdir --parents ./pl_PL.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./pl_PL.utf8/LC_MESSAGES/plt.mo plt_polish.po
LANGUAGE=pl_PL.utf8 ./plt
Agregar " sed --in-place plt.pot --expression = 's/CHARSET/UTF-8 /' "justo antes de msginit. –
Sugiero aplicar la edición al archivo .po, en lugar del archivo pot. –