Cómo corregí la pluralización, y por qué casi elijo la API equivocada de Apple
Encontré este error mientras revisaba el backlog de Deep Cut Atlas: una revisión de diseño de la semana pasada señaló que la tarjeta de álbum arma a mano la pluralización del conteo de pistas con count == 1 ? "" : "s". El ejemplo que dieron fue que el español “canción/canciones” necesita una forma de palabra distinta al truco de sufijo del inglés. Cuando de verdad abrí el código y la traducción ya publicada, la historia resultó un poco distinta, y más interesante.
La etiqueta visible estaba bien en la superficie: “1 track” / “3 tracks” en inglés, correctamente conectada mediante un ternario. Pero la etiqueta de accesibilidad, dos líneas más abajo, no tenía ningún ternario. Simplemente decía siempre “N tracks”, así que un álbum de una sola pista se leía como “1 tracks” para VoiceOver. Ese es un error de inglés puro, sin traducción de por medio.
El lado en español también tenía su vuelta de tuerca. El ejemplo de la revisión de diseño asumía que el sustantivo sería “canción,” que sí necesita una forma plural distinta al truco de agregar una s del inglés. Pero la traducción que realmente se publicó usa “pista,” y “pista” se pluraliza como “pistas” exactamente igual que en inglés. Así que hoy nada se veía roto en la interfaz en español. El error era estructural, no visible, que es el peor tipo de error para tener agazapado en una base de código, porque nadie lo nota hasta el día en que alguien elige una palabra que no se pluraliza con un simple sufijo.
Primero recurrí a Automatic Grammar Agreement de Apple, la sintaxis Text("^[\(count) track](inflect: true)") que deja que Foundation infiera la forma plural correcta de un sustantivo en tiempo de ejecución en vez de escribirla a mano. Es ingeniosa, y el español tiene soporte desde iOS 15. Pero el soporte es por idioma y sigue expandiéndose con cada versión del sistema operativo. El portugués no lo tiene hasta iOS 18. El objetivo mínimo de esta app es iOS 17.6, y la localización al portugués ya está en cola como un issue aparte. Publicar la inflexión ahora significaría que la primera persona de habla portuguesa en un dispositivo más viejo que llegara a esta etiqueta recibiría una salida silenciosamente incorrecta, exactamente el tipo de error que estaba tratando de cerrar.
Así que cambié a “Vary by Plural” de String Catalog, el mecanismo por categoría CLDR que es el equivalente moderno de .stringsdict. Tiene menos magia: hay que escribir la forma singular y la plural a mano, por idioma. Pero funciona igual en todas las versiones del sistema operativo, y resultó que también simplificaba la corrección de accesibilidad, ya que se resuelve mediante una simple llamada a String(localized:) en vez de la conversión a AttributedString que habría necesitado la inflexión.
Un detalle: “Vary by Plural” normalmente es una acción de clic derecho en el editor de String Catalog de Xcode, no algo que se pueda manejar desde una terminal. Pero .xcstrings es solo JSON con un esquema documentado, así que escribí a mano la estructura de variación plural directamente en el archivo. El paso de compilación “Compile XCStrings” de una corrida de pruebas por CLI lo procesó sin quejarse, y el simulador mostró la forma singular y plural correcta tanto en inglés como en español.
Error pequeño, pero del tipo que sale barato corregir bien y caro dejar pasar. Cada sustantivo futuro que esta app elija para una etiqueta de conteo estaba a una mala elección de palabra de repetirlo.
Lecturas relacionadas
El error que se reportó dos veces, y la interpolación de cadenas que cambia en silencio el formato de un número
Un año de lanzamiento que se mostraba como "2.026" en un dispositivo con región Costa Rica, String(localized:) tratando un Int como si fuera una cantidad, y la clave del String Catalog que cambió de forma con la corrección.
Traducir Deep Cut Atlas al español, y el bug de binario desactualizado que no era un bug de traducción
153 strings a es-419 a mano, veinte minutos depurando un bug que no existía, y tres botones que un grep mecánico encontró y un repaso manual se había pasado por alto.
Cómo localizar el aviso de permiso de Apple Music (y el desvío de pruebas en dispositivo que eso implicó)
Una sola cadena de texto, dos hilos de foro que se contradicen, un iPhone equivocado, y el descubrimiento de que desinstalar una app no reinicia su estado de permisos, solo un reinicio completo de privacidad lo hace.