Hoy se me ha planteado una curiosa situación: necesitaba definir el modelo de datos necesario para unas noticias que iban en varios idiomas y cada una necesitaba tener por URL el título sluggabilizado(¿?) en ese idioma.

Cuando necesito internacionalizar los campos de una tabla uso el behaviour I18 de Doctrine. Por otro lado, cuando necesito URL amigables acudo al behaviour Sluggable. En este caso el problema es que los behaviours están anidados, esto es, la tabla noticias debe ser i18n pero a su vez, el slug se debe construir a partir del campo título internacionalizado.

Después de todo este jaleo, la solución ha resultado ser más simple de lo que me espera:

NewsItem:
  actAs:
    I18n:
      fields: [title, body]
      actAs:
        Sluggable:
          unique: true
          fields:  [title]
          canUpdate: true
  columns:
    title:            string(255)
    body:             clob
    published_at:     date

Supongamos que tenemos un modelo de datos que queremos internacionalizar, por ejemplo, ciudades (para hacerlo más simple). El nombre de la ciudad variará en función del idioma, así, Londres para el español y London para el inglés.

El archivo schema.yml en este caso es tremendamente simple:

City:
  actAs:
    I18n: { fields: [name] }
  columns:
    name: { type: string(255) }

Algo que no he sido capaz de encontrar ni en la documentación de Doctrine ni en la de symfony es cómo construir el archivo fixtures.yml para cargar estos datos. La solución a continuación:

City:
  city_01:
    # aqui irían el resto de campos que no fuesen internacionalizados
    Translation:
      en: { name: "London" }
      es: { name: "Londres" }
Symfony y Desarrollo Web © Copyright 2009, All Rights Reserved.