es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para cambiar a una traducción de slug, puedes seguir los siguientes pasos:

    1. Crea una función de cambio de idioma en tu controlador o como un componente separado, como el LangHelper.php en el código de ejemplo.
    2. 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 Yii Yii::$app->language.

    3. Encuentra el modelo PortfolioLang correspondiente para el slug y el ID de idioma dado. Si existe, obtén el modelo asociado Portfolio de él.

    4. 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:

    use yii\helpers\Url;
    
    ...
    
    public function actionView($slug, $_lang = null)
    {
        if ($_lang !== null) {
            Yii::$app->language = $_lang;
        }
    
        $langList = Lang::getList();
    
        $portfolioLang = PortfolioLang::findOne([
            'slug' => $slug,
            'lang_id' => Yii::$app->language,
        ]);
    
        if ($portfolioLang === null) {
            throw new NotFoundHttpException();
        }
    
        $model = $portfolioLang->portfolio;
    
        // Comprueba si el modelo encontrado es el mismo que el solicitado
        $isSameModel = ($model->slug === $slug);
    
        if (!$isSameModel) {
            // Redirige a la URL correcta con el slug traducido
            $url = Url::to(['portfolio/view', 'slug' => $model->slug, '_lang' => Yii::$app->language]);
            return $this->redirect($url);
        }
    
        $pictures = PortfolioPicture::find()
            ->where(['portfolio_id' => $model->id])
            ->orderBy(['sorting' => SORT_ASC])
            ->all();
    
        return $this->render('view', [
            'model' => $model,
            'picture' => $pictures,
            'langList' => $langList,
        ]);
    }
    

    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.

Comments are closed.