es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

xgettext interpreta incorrectamente ‘c-format’ en archivos cpp.

Tengo un montón de archivos .cpp que contienen texto, incluyendo el símbolo de porcentaje literal. Esos archivos no usan printf en absoluto, utilizan cosas de iostream:

std::cout << _( “El 50 % de 10 es 5” ) << std::endl;

Sin embargo, las cadenas que contienen % siguen siendo marcadas como formato c por xgettext:


:test.cpp:5 , formato c msgid "El 50 % de 10 es 5" msgstr ""

Esta plantilla luego se procesa mediante msgmerge y se traduce, y las herramientas de traducción (por ejemplo, Poedit) se quejan de tales entradas:


:test.cpp:5 , formato c msgid "El 50 % de 10 es 5" msgstr "El 50 % de 10 es 5"

La especificación de formato en ‘msgid’ y ‘msgstr’ no coincide

Eliminar manualmente los comentarios de ‘, formato c’ ayuda, pero vuelven después de cada fusión. ¿Cómo puedo hacer que xgettext o msgmerge eliminen esos comentarios? Sé que puedo filtrarlos con sed, pero ¿hay una forma más inteligente de hacerlo que mantenga esos comentarios para las cadenas que provienen de archivos C?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una solución a este problema es utilizar la opción --c++ al ejecutar xgettext. Esto le indicará a xgettext que trate los archivos de entrada como archivos de C++ y aplique reglas específicas de C++ para extraer las cadenas. En este caso, no marcará las cadenas que contengan el signo de porcentaje como c-format.

    Para solucionar los archivos .pot existentes, podemos utilizar la opción --no-wrap al ejecutar msgmerge. Esto evitará que msgmerge agregue los comentarios #, c-format a los archivos .pot.

    Utilizar estas opciones juntas asegurará que los comentarios c-format solo se agreguen a las cadenas provenientes de archivos de C y no de archivos de C++.

    Aquí tienes un ejemplo de comando para extraer las cadenas utilizando xgettext con la opción --c++:

    xgettext --c++ -o myapp.pot *.cpp

    Y aquí tienes un ejemplo de comando para fusionar las traducciones utilizando msgmerge con la opción --no-wrap:

    msgmerge --no-wrap myapp.pot myapp_fr.po -o myapp_fr.po

Comments are closed.