Reemplazando la torre de Babel: herramientas para multilingüismo en R

Maëlle Salmon, rOpenSci

¡Bon dia!

Em dic Maëlle.

No vaig a parlar catalá, ni francés. 😌

https://babel-bcn.netlify.app/

letras de una teclado formando la palabra 'hello'

¡Barcelona!

Dando una charla sobre desarrollo de paquetes R en el RUG de Barcelona en 2017

¡Barcelona!

Dando una charla sobre rmarkdown en R-Ladies Barcelona en 2017

Trabajo con rOpenSci

rOpenSci fomenta una cultura que valora la investigación abierta y reproducible utilizando datos compartidos y software reutilizable con una infraestructura técnica y una infraestructura social

Recursos / proyectos de rOpenSci

Aprende más sobre/con rOpenSci

Colabora con rOpenSci

🌻 https://contributing.ropensci.org/

🌻 https://ropensci.org/donate

flores amarillas

Empecemos con una historia…

la Sagrada Familia en construcción

Lo que dice Yaveh en el mito

He aquí que todos forman un solo pueblo y todos hablan una misma lengua; siendo este el principio de sus empresas, nada les impedirá que lleven a cabo todo lo que se propongan. Pues bien, descendamos y allí mismo confundamos su lenguaje de modo que no se entiendan los unos con los otros

https://es.wikipedia.org/wiki/Torre_de_Babel#Relato_b%C3%ADblico

Nuestro mundo ahora…

Nuestro mundo ahora…

Utilizar inglés nos puede costar

https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.3002184

The manifold costs of being a non-native English speaker in science, Tatsuya Amano et al, 2023, PLOS Biology.

“those of moderate and low English proficiency nationalities spend a median 93.7% (2.5 to 97.5 percentiles: 54.7% to 145.2%) and 38.0% (10.8% to 69.6%) more time, respectively, preparing an oral presentation in English than native English speakers do”

¿Tenemos que usar solo inglés cuando usamos R?

No! Hay cosas que ya existen, y esfuerzos para mejorar la situación.

Picture by Pixabay on Pexels.

escaleras

R en español

Sys.getenv("LANG")
[1] "en_US.utf8"

R en español, un poquito

# En inglés
1/a
Error in eval(expr, envir, enclos): object 'a' not found

R en español, un poquito

# En inglés
1/a
Error in eval(expr, envir, enclos): object 'a' not found
# Ahora en español
withr::with_language("es", {
  1/a
})
Error in withr::with_language("es", {: objeto 'a' no encontrado

En aparte: withr 📦

Paquete muy útil para cambiar opciones/variables de entorno/otras cosas solo para una pieza de código (ejemplo, test).

https://withr.r-lib.org/ (mantenido por Lionel Henry)

withr::with_options(blop = TRUE, {<codigo>})
# o
test_that("blabla", {
  withr::local_options(blop = TRUE)
  <codigo>
})

¿Cómo se traduce R?

https://contributor.r-project.org/translations

“En un mundo que se nutre de la interconexión y la comunicación global, la traducción desempeña un papel fundamental para salvar las barreras lingüísticas. La traducción, el arte de pasar de una lengua a otra, rompe esos límites y abre un mundo de posibilidades de entendimiento y colaboración.”

¿Qué se traduce de R?

https://contributor.r-project.org/translations

Todas las salidas en R base y paquetes recomendados (como los mensajes emitidos por stop(), warning(), o message()) son elegibles para la traducción, al igual que las etiquetas de menú en la GUI.

¿Cómo se traduce R?

Páginas específicas para cada idioma:

💬 Español

💬 Català

Qué hay que traducir después de R base…

Todas las partes donde se encuentra lenguaje humano 😉

  • Mensajes de paquetes;
  • Documentación (páginas de ayuda; sitios; libros…);
  • (no visto aún) Nombres de funciones?

Traducción exitosa de documentación: R4DS

https://es.r4ds.hadley.nz/

  • Traducción comunitaria

  • También traducción de datos

¿Qué significa traducir?

Mucho trabajo 😅

  • 📏 Reglas sobre
    • el proceso,
    • el contenido;
  • 🧰 Herramientas para
    • presentar más de un idioma, cambiar el idioma;
    • la traducción misma.

Fuera de R base: mensajes en paquetes

Por ejemplo data.table.

Picture by Pixabay on Pexels.

paquetes, etiqueta con las palabras 'just for you'

Cómo traducir mensajes de paquetes: potools

Paquete potools de Michael Chirico y Hadley Wickham.

📦 roxygen2 para crear documentación sin preocuparse de archivos .Rd.

📦 potools para tener mensajes multilingües sin preocuparse de archivos de traducción (.po, .pot, .mo).

Porqué saber como se usa potools

Porqué saber como se usa potools

💪 Para traducir sus propios paquetes

🙋 Para ayudar a traducir un paquete

🙏 Para preguntar si un paquete puede ser multilingüe

Como usar potools

floras, carta, brújula

https://masalmon.eu/2023/10/06/potools-mwe/

Registra el uso de potools en DESCRIPTION

Config/potools/style: explicit

Crea función interna

tr_ <- function(...) {
  enc2utf8(gettext(paste0(...), domain = "R-pockage"))
}

Usa la función

En vez de

cli::cli_alert_info("Hello {name}!")

escribir

cli::cli_alert_info(tr_("Hello {name}!"))

Crea el archivo general de traducción

potools::po_extract()

Crea po/R-pockage.pot.

Crea el archivo de traducción en francés

potools::po_create("fr")

Crea po/R-fr.po.

Llena po/R-fr.po

<metadata>
#: mensaje.R:9
msgid "user"
msgstr "utilisateur·rice"

#: mensaje.R:10
msgid "Hello {name}!"
msgstr "Salut {name} !"

Compila la traducción

potools::po_compile()

Crea inst/po/fr/LC_MESSAGES/R-pockage.mo (binary).

Testea la traducción

pockage::speak()
ℹ Hello Maëlle Salmon!
withr::with_language("fr", pockage::speak())
ℹ Salut Maëlle Salmon !

Añade idiomas

  • potools::po_create(c("es", "ca"))

  • Modifica po/R-es.po y po/R-ca.po.

  • potools::po_compile().

  • Instala el paquete de nuevo.

withr::with_language("es", pockage::speak())
ℹ Hola Maëlle Salmon!

Traduce más texto

  • Pone más texto dentro de tr_().
  • potools::po_extract() otra vez.
  • potools::po_update().
  • Modifica po/R-fr.po, po/R-es.po, po/R-ca.po.
  • potools::po_compile().

Resumen de uso de potools (1/2)

  • Registra el estilo de uso de potools en DESCRIPTION;
  • Crea y utiliza tr_() para empaquetar texto que traducir;
  • Usa potools::po_extract() cuando empezas a traducir y cada vez que el texto dentro de tr_() cambia, aparece, desaparece;
  • Usa potools::po_create() cada vez que quieres añadir un idioma;

Resumen de uso de potools (2/2)

  • Usa potools::po_update() después de potools::po_extract() cada vez que el texto dentro de tr_() cambia, aparece, desaparece;
  • Usa potools::po_compile() cada vez que cambias las traducciones.

potools tiene documentación muy bien hecha.

Documentación: páginas de ayuda

Páginas de ayuda en cualquier idioma: Si se puede.

Páginas de ayuda multilingües: No existe aún, proyecto de Elio Campitelli y Renata Hirota.

Documentación: pkgdown

pkgdown es un paquete para construir sitios de documentación de paquetes.

Captura de pantalla del sitio pkgdown del paquete purrr

En aparte: “aprender pkgdown”

Primeros pasos (puede ser suficiente!)

# En tu ordenador
usethis::use_pkgdown()
pkgdown::build_site()

# Para activar la construcción automática
usethis::use_pkgdown_github_pages()

Para configurar más, https://pkgdown.r-lib.org/

Documentación: lo que puede pkgdown

Si la documentación es en español,

en _pkgdown.yml

lang: es

Asi no dice “Developed by” pero “Desarrollado por” por ejemplo.

Documentación: lo que puede pkgdown

Catalan en la versión de desarrollo! 🙏 Joan Maspons y Lluís Revilla.

Documentación: lo que no puede pkgdown

No se puede crear sitios multilingües con pkgdown.

https://github.com/r-lib/pkgdown/issues/2258

¿Qué es un sitio multilingüe?

  • Fuente de la web en más de una idioma.
  • Se construye todo.
  • En cada página, enlace hasta las versiones en otras idiomas.

Picture by Yan Krukau on Pexels.

ordenador sobre una mesa

Sitios web multilingües: Hugo

Con Hugo se pueden crear sitios multilingües.

Elije un tema multilingüe (o crealo).

Picture by Ann poan on Pexels.

ordenador

Sitios web multilingües: Quarto

No se puede con Quarto solo, pero si con babelquarto. ¡Experimental!

Sitios web multilingües: Quarto

https://www.joelnitta.com/

Captura de pantalla del sitio web de Joel Nitta en japonés

Libros multilingües

No se puede con Quarto solo, pero si con babelquarto. ¡Experimental!

Libros multilingües

https://devdevguide.netlify.app/

Captura de pantalla del dev guide rOpenSci, versión de desarrollo

Libros multilingües con babelquarto

Cada capítulo: filepath.qmd y filepath.es.qmd.

  • babelquarto::register_main_language("en")

  • babelquarto::register_further_languages(c("es", "pt"))

  • babelquarto::render_book()

_quarto.yml

Con la ayuda de babelquarto::register_,

babelquarto:
  mainlanguage: en
  languages: ['es', 'pt']
title-es: title in es
description-es: description in es
author-es: author in es
title-pt: title in pt
description-pt: description in pt
author-pt: author in pt

Cómo funciona babelquarto

  • Construye los dos sitios.

  • Añade los enlaces con {xml2}: XPath para modificar HTML.

Cómo traducir Markdown

  • Traducir Markdown desde cero? 😭

  • Copiar y pegar en DeepL o Google Translate? 😭

  • Usar babeldown y después revisión por humanos! 🎉

Traducir Markdown con babeldown

  • Respecta el formato Markdown.

  • Envia texto a la API de DeepL.

Picture by Heiner on Pexels.

buzón

Usar babeldown

  • Registra con DeepL.

  • Hello World.

Sys.setenv(DEEPL_API_KEY = keyring::key_get("deepl"))
Sys.setenv("DEEPL_API_URL" = "https://api.deepl.com")
babeldown::deepl_translate_markdown_string(
  "Je suis contente d'être à **Barcelone**",
  source_lang = "fr",
  target_lang = "es",
  formality = "less"
)
[1] "Me alegro de estar en **Barcelona**"

Como usamos babeldown en rOpenSci

Para nuestra guía de desarrollo de paquetes (el “dev guide”), ahora traducido en español

  • Primera traducción con babeldown;
  • Primera revisión por un ser humano;
  • Segunda revisión por un ser humano.

Traducion en portugés también.

Usar babeldown, con git y GitHub

https://ropensci.org/es/blog/2023/09/26/c%C3%B3mo_traducir_una_entrada_de_blog_de_hugo_con_babeldown/

Usar babeldown, con git y GitHub (1/3)

Diagrama de dos partes. A la izquierda una carpeta de hojas de Hugo en la rama new-post con el artículo en español con el texto 'Hola' y una imagen; a la derecha la carpeta de hojas de Hugo en la misma rama con el post en español con el texto 'Hola', el post con el nombre de archivo de destino en inglés con el texto 'Hola', y la imagen.

Usar babeldown, con git y GitHub (2/3)

Diagrama con dos partes. A la izquierda la carpeta de hojas de Hugo en la rama de auto-translate con el artículo en español con el texto 'Hola', el post con el nombre de archivo de destino en inglés con el texto 'Hola', y la imagen; a la derecha lo único que cambió es que el contenido del post con el nombre de archivo de destino en inglés es ahora 'Hello'.

Usar babeldown, con git y GitHub (3/3)

Dibujo del pull request de la rama auto-translate a la rama new-post donde la diferencia es que ahora se ha traducido al inglés el contenido de la entrada con el nombre de archivo de destino en inglés.

Cómo funciona babeldown

  • Transforma Markdown en XML usando {tinkr} ({commonmark} + {xml2} + {xslt}).
  • Protege algunas cosas (Hugo shortcodes).
  • Envia XML a la API de DeepL.
  • Envia también fragmentos de YAML a la API de DeepL.
  • Crea Markdown de nuevo.

Guía de traducción de rOpenSci

En inglés y español.

https://translationguide.ropensci.org/

brujula

Lo que queda por hacer para el multilinguismo en R

Mucho 😁

  • Más idiomas;
  • Páginas de ayuda;
  • Sitios pkgdown multilingües;
  • Mantenerlo todo.

Conferencias no solo en inglés

¿Se acuerdan?

He aquí que todos forman un solo pueblo y todos hablan una misma lengua; siendo este el principio de sus empresas, nada les impedirá que lleven a cabo todo lo que se propongan. Pues bien, descendamos y allí mismo confundamos su lenguaje de modo que no se entiendan los unos con los otros

https://es.wikipedia.org/wiki/Torre_de_Babel#Relato_b%C3%ADblico

En conclusión

¡Con más multilingüismo en R, nada nos impedirá que llevemos a cabo todo lo que nos propongamos!

Gracias / Gràcies

https://babel-bcn.netlify.app/

  • Yanina Bellini Saibene

  • Lluís Revilla Sancho + otros e otras organisadores de la conferencia