Maison  >  Article  >  cadre php  >  Discutez de la façon dont Laravel implémente une base de données multilingue

Discutez de la façon dont Laravel implémente une base de données multilingue

PHPz
PHPzoriginal
2023-04-10 14:16:23972parcourir

Laravel est un framework d'application Web PHP populaire qui fournit un ensemble de syntaxes puissantes, élégantes et simples, rendant le développement et la maintenance d'applications Web plus faciles et plus agréables. Laravel fournit de nombreuses fonctionnalités utiles, dont la prise en charge intégrée du développement d'applications multilingues. Dans cet article, nous explorerons comment Laravel implémente les bases de données polyglottes.

  1. Internationalisation (i18n) et localisation (l10n) dans Laravel

Dans Laravel, l'internationalisation et la localisation sont deux concepts de base. L'internationalisation fait référence à la conception d'une application pour prendre en charge plusieurs langues et pratiques culturelles, tandis que la localisation fait référence à l'adaptation d'une application à un lieu spécifique. Laravel possède des outils et des classes intégrés qui peuvent nous aider à implémenter i18n et l10n.

  1. Comment implémenter Laravel multilingue

Il existe de nombreuses façons d'implémenter des applications multilingues Laravel. Nous présenterons l'une des méthodes d'implémentation, qui consiste à utiliser une base de données pour implémenter le multilingue.

Tout d'abord, créez une table dans la base de données pour stocker les multiples langues prises en charge par le système, par exemple :

CREATE TABLE `languages` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `code` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `is_default` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Dans cette table, le champ name stocke le nom de la langue et le champ code stocke le code de la langue (tel que comme en, zh, etc.), le champ is_default spécifie la langue par défaut.

Ensuite, ajoutez plusieurs champs au tableau nécessitant une prise en charge multilingue, correspondant à du texte dans différentes langues, par exemple :

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name_zh` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `description_en` text COLLATE utf8mb4_unicode_ci,
  `description_zh` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Dans ce tableau, les champs name_en et name_zh stockent les noms de produits anglais et chinois, description_en et description_zh respectivement. Les champs stockent les descriptions de produits respectivement en anglais et en chinois.

Ensuite, nous devons apporter quelques modifications à ces tableaux pour prendre en charge plusieurs langues :

  1. Dans le fichier app/Http/Kernel.php, enregistrez un middleware pour définir dynamiquement la langue actuellement utilisée :
protected $middleware = [
    ...
    \App\Http\Middleware\SetLanguage::class,
];
  1. Créez un Middleware SetLanguage :
<?php

namespace App\Http\Middleware;

use Closure;
use App;

class SetLanguage
{
    public function handle($request, Closure $next)
    {
        $language = $request->get('lang', '');
        if ($language != '') {
            App::setLocale($language);
        }
        return $next($request);
    }
}

La fonction de ce middleware est d'obtenir le paramètre lang du paramètre de requête et de définir la langue actuellement utilisée.

  1. Créer un modèle de langue :
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Language extends Model
{
    protected $table = &#39;languages&#39;;
    public $timestamps = false;

    public static function getDefault()
    {
        return self::where(&#39;is_default&#39;, true)->first();
    }

    public static function getCurrent()
    {
        $code = app()->getLocale();
        return self::where('code', $code)->first();
    }
}

Ce modèle est utilisé pour obtenir les informations de langue actuellement utilisées, les informations de langue par défaut, etc.

  1. Créez une méthode getLocalizedAttribute dans le Modèle :
public function getLocalizedAttribute($value)
{
    $lang = Language::getCurrent();
    $field = $this->getLocalizedFieldName($lang->code);
    return $this->$field;
}

protected function getLocalizedFieldName($langCode)
{
    $fallback = $this->getDefaultFieldName();
    return "{$this->$fallback}_{$langCode}";
}

protected function getDefaultFieldName()
{
    return 'name_en';
}

Cette méthode permet d'obtenir le champ correspondant à la langue actuelle Par exemple : si la langue actuelle est le chinois et que le modèle correspond au nom du produit anglais, alors retournez. Le champ chinois correspondant au nom du produit.

  1. Dans le fichier modèle Blade, vous pouvez utiliser des chaînes multilingues comme celle-ci :
<h1>{{ $product->localized }}</h1>

Cette déclaration obtiendra automatiquement le nom du produit dans la langue correspondante en fonction de la langue actuellement utilisée.

À ce stade, nous avons terminé l'implémentation multilingue de la base de données Laravel et pouvons facilement créer des applications Web multilingues.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn