fmt:
en comparación con tinyformat.
¿Se está trabajando en esto?
Tengo el puerto inicial funcionando localmente, pero no he tenido tiempo de pulirlo y probarlo correctamente (por ejemplo, todas las cadenas de traducción deben actualizarse, así que estaba usando esto como un buen punto para hacer que las cadenas se extraigan automáticamente del código con xgettext como objetivo de compilación, etc.)
También reveló una serie de políticas de traducción "malas", por ejemplo, unir fragmentos de texto traducidos en lugar de hacer la cadena incorrecta a la vez (por ejemplo, algo como "formato (tr ("% s,% s "), formato (tr (" % s cosa es% d de "), objeto, recuento), formato (tr (de"% d total "), número));
Lo que resultaría en cadenas completamente inútiles para los traductores:
"% s% s"
"% s es% d"
"de% d total"
cuando realmente debería traducirse como una sola llamada, por lo que la cadena extraída debería ser:
"% s cosa es% d de% d total" (o "{0} cosa está {1} de {2} total" en la forma fmtlib de hacer las cosas)
Por lo que puedo deducir, tiene que haber dos subsistemas de formato distintos:
{fmt}
(dado que, en mi opinión, hay pocos beneficios en la traducción de mensajes de registro potencialmente cambiantes, y sería un poco afectado para el rendimiento enrutarlos a través de boost::locale
.boost::locale::format
para cadenas de interfaz de usuario localizables (ya que tiene soporte para formas plurales).Propondría implementarlos en pequeños pasos: primero cambie a {fmt}
luego trate con cadenas localizables.
No estoy seguro de si boost :: locale realmente será tan útil para nosotros en el futuro; es excelente para aplicaciones estáticas con bases de datos de traducción estáticas, pero he tenido problemas para encontrar dónde puedo conectarme a su base de datos de mensajes para agregar nuevos mensajes desde mods.
Creo que solo es posible agregar una base de datos completamente nueva en un nuevo dominio de traducción, y luego nos metemos en problemas al tratar de averiguar con qué dominio deberíamos traducir una cadena, sin hacer algo como probar / todos / mod dominios en orden hasta que encontrar una coincidencia
Entonces, mi plan actual es tratar de separar cada una de las tareas, similar a lo que mencionó:
Tengo casi todas las etapas anteriores a nivel local en varios estados; probablemente tenga sentido para mí intentar ponerlas en un estado utilizable, y ahora tengo un poco de tiempo este fin de semana largo, supongo que será mi próxima tarea :)
Una vez que todo esté hecho, podemos comenzar a preocuparnos por cómo funcionarían los mods que agregan nuevas cadenas
Convierta todas / traducidas / cadenas del estilo% printf a {fmt} / boost :: estilo local (creo que son funcionalmente iguales, ya que actualmente no tenemos ninguna anotación pleural o similar)
En realidad, solo se ven similares: boost::locale
presenta una indexación basada en 1 y una gramática de formato muy diferente. Si no fuera por las formas plurales, iría con {fmt}
ya que encuentro que su soporte para el argumento con nombre es una buena ayuda para los traductores que agregan un contexto valioso, por ejemplo:
Delay = {seconds}
Range = {meters:2.1}m.
Aunque encuentro mucho más valioso el apoyo a las formas plurales.
Sí, recuerdo que la indexación me lanzó para empezar :)
TBH en el futuro, creo que el formato boost :: locale está listo, estoy seguro de que podemos solucionar los problemas del contexto del mod en el futuro.
O al menos entonces, cuando encontremos el "siguiente" problema, todas las cadenas traducidas estarán en un formato mucho más sano y no entremezcladas con texto formateado no traducido.
Además, honestamente, toda la clase UString debería ser un conjunto de ayudantes alrededor de un std :: basic_string
Estoy dispuesto a reemplazarlo todo con un std :: string (IE std :: basic_string
Actualmente, 'sucede' que funciona, ya que tiendo a probar en plataformas que ya usan utf8 en las API de su sistema, pero sospecho que actualmente se romperá si intentamos hacer algo hoy como abrir un nombre de archivo con una ruta no ascii en Windows