J'ai eu du mal avec cette question depuis quelques mois maintenant, mais je n'ai pas été dans une situation que j'avais besoin d'explorer toutes les options possibles avant. Maintenant, je me sens comme il est temps d'apprendre à connaître les possibilités et de créer mon propre préférence personnelle pour les utiliser dans mes projets à venir.
Permettez-moi d'abord de l'esquisse de la situation, je suis à la recherche d'
Je suis sur le point de mettre à niveau/réaménager un système de gestion de contenu qui, je l'ai utilisé pendant un bon moment maintenant. Cependant, je me sens multi-langue est une grande amélioration par rapport à ce système. Avant que je n'utilise pas toute les cadres, mais je vais utiliser Laraval4 pour le projet à venir. Laravel semble le meilleur choix d'une manière plus propre de code PHP. Sidenote: Laraval4 should be no factor in your answer
. Je suis à la recherche de façons générales de la traduction qui sont de plate-forme/cadre indépendant.
Ce qui devrait être traduit
Comme le système, je suis à la recherche de besoins pour être aussi convivial que possible, la méthode de gestion de la traduction doit être à l'intérieur de la CMS. Il devrait y avoir aucun besoin pour démarrer une connexion FTP pour modifier les fichiers de traduction ou tout code html/php analysé les modèles.
Par ailleurs, je suis à la recherche de la façon la plus simple de traduire plusieurs tables de base de données peut-être sans la nécessité de procéder à d'autres tables.
Qu'ai-je venir avec moi
Comme je l'ai été à la recherche, de lecture et d'essayer des choses moi-même déjà. Il ya un couple d'options que j'ai. Mais je n'ai toujours pas l'impression que j'ai atteint une meilleure méthode pratique pour ce que je suis vraiment à la recherche. Maintenant, c'est ce que je suis venu avec, mais cette méthode a aussi des effets secondaires.
- PHP Analysé les Modèles: le modèle du système doit être interprété par PHP. De cette façon, je suis capable d'insérer la traduction des paramètres dans le code HTML sans avoir à ouvrir les modèles et les modifier. En outre, PHP analysé les modèles me donne la possibilité d'avoir 1 modèle de site web complet, au lieu d'avoir un sous-dossier pour chaque langue (que j'ai eu avant). La méthode pour atteindre cette cible peut être de Smarty, TemplatePower, Laravel de la Lame ou tout autre modèle de l'analyseur. Comme je l'ai dit, ce doit être indépendant de l'écrit solution.
-
Base de données: peut-être que je n'ai pas besoin de le mentionner à nouveau. Mais la solution doit être piloté par base de données. Le CMS est destinée à être orientée objet et MVC, donc j'aurais besoin de penser à une logique de structure de données pour les cordes. Comme mes modèles serait structuré: templates/Controller/View.php peut-être que cette structure aurait plus de sens:
Controller.View.parameter
. La table de base de données ont ces champs avec unvalue
champ. Dans les modèles que nous pourrions utiliser une sorte de méthode commeecho __('Controller.View.welcome', array('name', 'Joshua'))
et le paramètre contientWelcome, :name
. Ainsi, le résultat étantWelcome, Joshua
. Cela semble une bonne façon de le faire, parce que les paramètres tels que :le nom est facile à comprendre par l'éditeur. -
Faible Charge de Base de données: bien sûr, le système ci-dessus serait la cause de charge de charge de base de données si ces chaînes sont en cours de chargement sur la route. Donc j'aurais besoin d'un système de cache qui re-rend la langue des fichiers dès qu'ils sont édités/enregistré dans l'administration de l'environnement. Parce que les fichiers sont générés, aussi un bon système de fichiers de mise en page est nécessaire. Je crois que l'on peut aller avec
languages/en_EN/Controller/View.php
ou .ini, qui vous convient le mieux. Peut-être un .ini est encore analysée plus rapide à la fin. Cette fould doit contenir les données dans l'format parameter=value;
. Je suppose que c'est la meilleure façon de le faire, puisque chaque point de Vue qui est rendu peut inclure sa propre langue de fichier s'il existe. Les paramètres de langue, puis devrait être chargé d'un point de vue spécifique et non pas dans une portée globale pour prévenir les paramètres d'écraser les uns les autres. -
Table de base de données de traduction: c'est en fait la chose dont je suis le plus inquiet. Je suis à la recherche d'un moyen de créer des traductions des News/Pages/etc. aussi rapidement que possible. Avoir deux tables pour chaque module (par exemple,
News
etNews_translations
) est une option, mais il ressemble à beaucoup de travail pour obtenir un bon système. Une des choses que je suis venu avec est basé sur undata versioning
système que j'ai écrit: il y a une table de base de données nom de l'Translations
, cette table possède une combinaison unique d'language
,tablename
etprimarykey
. Par exemple: en_En / News / 1 (en se Référant à la version anglaise de l'article avec l'ID=1). Mais il y a 2 inconvénients majeurs de cette méthode: tout d'abord ce tableau tend à devenir assez longue avec un grand nombre de données dans la base de données et d'autre part qu'il serait un enfer d'un emploi pour utiliser cette configuration pour la recherche de la table. E. g. la recherche pour le SEO slug de l'objet serait une recherche en texte intégral, qui est assez bête. Mais d'un autre côté: c'est un moyen rapide de créer des chaînes traduisibles dans chaque table très rapide, mais je ne crois pas que ce pro overweights la con. - Avant la fin de l': Aussi le front-end aurait besoin d'un peu de réflexion. Bien sûr, nous aurions stocker les langues disponibles dans une base de données et (de)active de ceux que nous avons besoin. De cette façon, le script peut générer une liste déroulante pour sélectionner une langue et le back-end peut décider automatiquement ce que les traductions peuvent être faites à l'aide de la CMS. La langue choisie (par exemple, en_EN) pourrait alors être utilisé lors de l'obtention de la langue de fichier d'une vue ou d'obtenir le droit de traduction d'un élément de contenu sur le site web.
Donc, ils sont là. Mes idées jusqu'à présent. Ils n'ont même pas inclure les options de localisation pour les dates etc, mais comme mon serveur prend en charge PHP5.3.2+, la meilleure option est d'utiliser l'extension intl, comme expliqué ici: http://devzone.zend.com/1500/internationalization-in-php-53/ - mais ce serait de l'utiliser à tout stade de développement. Pour l'instant, la question principale est de savoir comment avoir le meilleur practics de traduction du contenu dans un site web.
En plus de tout ce que j'ai expliqué ici, j'ai encore une autre chose que je n'ai pas encore décidé, ça ressemble à une question simple, mais en fait ça a été de me donner des maux de tête:
Traduction de l'URL? Faut-il le faire ou pas? et de quelle manière?
Si.. si j'ai cette url: http://www.domain.com/about-us
et l'anglais est ma langue par défaut. Si cette URL est traduit en http://www.domain.com/over-ons
lorsque je choisis le néerlandais comme langue? Ou devons-nous aller à la route facile et il suffit de changer le contenu de la page qui est visible à l' /about
. La dernière chose ne semble pas une option valide parce que ce serait de générer plusieurs versions de la même URL, ce indexation du contenu va échouer le droit chemin.
Une autre option est d'utiliser http://www.domain.com/nl/about-us
à la place. Cela génère au moins une URL unique pour chaque contenu. Aussi ce serait plus facile d'aller à une autre langue, par exemple l' http://www.domain.com/en/about-us
et l'URL fournie est plus facile à comprendre pour les deux Google et les visiteurs de l'Homme. L'utilisation de cette option, que faisons-nous avec les langues par défaut? Si la langue par défaut de supprimer la langue sélectionnée par défaut? Afin de rediriger http://www.domain.com/en/about-us
de http://www.domain.com/about-us
... À mes yeux c'est la meilleure solution, car quand le CMS est le programme d'installation pour une seule langue, il n'est pas nécessaire d'avoir cette identification de la langue dans l'URL.
Et une troisième option est une combinaison de deux options: à l'aide de la "langue-identification-moins"-URL (http://www.domain.com/about-us
) pour la langue principale. Et l'utilisation d'une URL avec une traduction SEO slug pour les sous-langues: http://www.domain.com/nl/over-ons
& http://www.domain.com/de/uber-uns
J'espère que ma question reçoit vos têtes à la fissuration, ils ont craqué le mien, c'est sûr! Il ne m'aide déjà des choses à travailler comme une question ici. M'a donné la possibilité d'examiner les méthodes que j'ai utilisé avant et à l'idée que je vais avoir pour mon prochain CMS.
Je vous remercie déjà d'avoir pris le temps de lire ce tas de texte!
// Edit #1
:
J'ai oublié de mentionner: le __() la fonction est un alias de traduire une chaîne donnée. Dans cette méthode, il y a évidemment devrait être une sorte de repli de la méthode où le texte par défaut est chargé lorsqu'il n'y a pas de traductions disponibles pour le moment. Si la traduction est manquant, il devrait être inséré ou le fichier de traduction doit être régénéré.