Saltar al contenido
Development

Cómo corregí la pluralización, y por qué casi elijo la API equivocada de Apple

Por Victor Da Luz
swiftiosi18ndev-logdeep-cut-atlas

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