Yii2 slug multilingüe y cambiador de idioma que “respetará” las url traducidas.
El problema es que no puedo averiguar cómo cambiar a una slug traducida:
He implementado slugs multilingües usando “lav45/yii2-translated-behavior”.
La base de datos es bastante simple:
Modelo “Portfolio”:
id | created_at | is_active
Modelo “PortfolioLang”:
portfolio_id | lang_id | title | content
Hasta aquí todo bien. Tengo una “actionView” que llama al contenido traducido de la siguiente manera:
protected function findModelBySlug($slug)
{
if (($model = Portfolio::findOne(['slug' => $slug])) !== null) {
return $model;
} else {
throw new NotFoundHttpException();
}
}
public function actionView($_lang, $slug)
{
$portfolioLang = PortfolioLang::findOne(['lang_id' => $_lang,'slug' => $slug]);
$model = $portfolioLang->portfolio;
$pictures = PortfolioPicture::find()->where(['portfolio_id' => $model->id])->orderBy(['sorting'=>SORT_ASC])->all();
return $this->render('view', [
'model' => $model,
'picture' => $pictures,
'langList' => Lang::getList(),
]);
}
Debo mencionar que esto funciona, “hasta que” intento cambiar entre idiomas mientras estoy viendo la entrada.
Estaba usando código de ejemplo de aquí: https://github.com/lav45/yii2-translated-behavior-demo/blob/master/frontend/components/LangHelper.php
Supongo que necesito algo más que un código de muestra (parece que funciona solo para ID actuales de entradas existentes). ¿Podría alguien darme algunas pistas para el próximo paso?
¡Gracias de antemano!
davy.ai
Para cambiar a una traducción de slug, puedes seguir los siguientes pasos:
LangHelper.php
en el código de ejemplo.En el método
actionView
, obtén el ID del idioma actual del parámetro de URL$_lang
y configúralo como el idioma para el componente de traducción de YiiYii::$app->language
.Encuentra el modelo
PortfolioLang
correspondiente para el slug y el ID de idioma dado. Si existe, obtén el modelo asociadoPortfolio
de él.Si el modelo encontrado no es el mismo que el solicitado, redirige a la URL correcta con el slug traducido.
Aquí tienes un código de ejemplo que puedes modificar y usar:
En este ejemplo, el selector de idioma no se muestra ni se implementa, pero podrías agregarlo a tus vistas o archivo de diseño, y usar
LangHelper
o una implementación personalizada para generar las URL con el parámetro de idioma correcto.