2009-07-23 9 views
0

ASP.NET MVC, presque terminée, il a été décidé qu'il avait besoin d'un commutateur de langue. Ce sera simplement deux langues: anglais et japonais. Ils devraient être en mesure de basculer entre les deux, mais si l'un n'est pas sélectionné, il devrait choisir la langue par défaut du navigateur.Création d'un commutateur de langue - 2 langues seulement - ASP.NET MVC

Je me demande quelle serait la meilleure solution dans ce cas.

Première pensée, routes! Donc, je change les routes pour avoir un /{l} à la fin de chaque route, et par défaut l = "". Ensuite, dans mon BaseController (chaque contrôleur est basé sur celui-ci), je vérifie la variable l dans la route. Chaque action renvoie une vue basée sur la langue. Je voulais simplement pouvoir pirater/ja-jp à la fin de l'url, et montrer la vue en japonais. Il n'a pas vraiment semblé diriger correctement. Ensuite, j'étais vraiment méchant dans mes opinions et j'ai codé à la main les liens ... Je ne pouvais pas vraiment obtenir l'aide pour produire les bons liens au début ... et j'ai pris la mauvaise habitude de les coder à la main. Donc, je devrais re-coder chaque lien à nouveau - pour hacker la variable de langue à la fin.

Deuxième pensée ... ok, utilisez jQuery pour ajouter la variable de langage à toutes les href de l'ancre. Cela semble trop maladroit et difficile dans certaines situations où les hrefs sont cachés jusqu'à ce que nécessaire, etc ...

Alors ... à ce stade, j'ai décidé de faire tout ce qu'il faut. Quelle est la manière la plus élégante de basculer entre deux langues - sans utiliser de fichiers de ressources? Je veux simplement que l'action ait le choix entre 2 vues, en fonction du langage. Est-ce que je réécris chaque lien que j'ai pour utiliser l'assistant Html, puis que les routes fonctionnent? Puis dans le BaseController il suffit de définir la langue en anglais si leur valeur n'est pas?

Tout conseil est très apprécié, merci.

+0

vu cette ?: http://oddiandeveloper.blogspot.com/2008/11/localization-with-aspnet- mvc.html – grenade

Répondre

2

Je pense que l'une des méthodes les plus simples et les plus conviviales consiste à utiliser le domaine (sous-domaine en fait) pour identifier la langue qu'il parle. Il n'a pas besoin de changer presque n'importe quoi dans l'aide Html (ces HTML.ActionLink) car cela ne fonctionne que relativement au domaine. En outre, il peut sembler intéressant à l'utilisateur que lorsqu'il voit ce domaine, il sache exactement quelle langue il est censé être, et sans faire l'URL trop longtemps. Tout ce que vous devez faire est de faire quelque chose dans le sélecteur de langue pour travailler.

Quelle que soit l'approche, je déconseille fortement d'utiliser la seconde pensée, puisque vous ne pouvez pas refuser (même 0,1%) aux personnes n'ayant pas javascript de travailler sur votre site web japonais, n'est-ce pas?

+0

Corriger ... pas vraiment même une vraie pensée, juste une idée. J'aime aussi les sous-domaines ... hmmm. Si je fais des sous-domaines, je voudrais quelque chose comme en.domain.com || jp.domain.com. Comment puis-je obtenir la variable de langue sur le nom de domaine? – Chaddeus

+1

Voici un article sur le routage de sous-domaine dans MVC: http://blogs.securancy.com/post/ASPNET-MVC-Subdomain-Routing.aspx Fondamentalement, la traduction de sous-domaine en culture, vous pouvez simplement mettre ces règles dans le Fichier web.config. Ainsi, par exemple, vous pouvez mapper en.domain.com à en-nous et ainsi de suite. – xandy

+0

Oh, encore une chose à ajouter. Je me souviens juste que wikipedia utilise un sous-domaine pour les langues ... bien que ce ne soit pas simplement une traduction entre les langues. – xandy

1

Nous avons constaté en créant notre site que ce n'était pas seulement la langue qui avait besoin de changement, mais que les points de vue de nos clients internationaux devaient être différents. C'EST À DIRE. notre bureau de Hong Kong a demandé différentes quantités d'espace et de données pour les données de vue, puis notre bureau en anglais. Le fait de changer un peu la langue à propos de la disposition de la vue m'a causé quelques problèmes.

What we ended up doing was this

Avec une très petite quantité de codage vous pouvez remplacer le routage à votre point de vue et envoyer l'anglais à un ensemble de vues et japonais à l'autre quelles que soient les circonstances que vous aimez. Pas besoin de changer l'URL ou de le faire côté client ou même de changer vos actions.

EDIT: Après relecture je pense que ce sera très approprié pour votre site que vous utilisez deux ensembles de vues, un pour chaque langue.

+0

hmm ... mes actions exécutent déjà le switch. Dans mon contrôleur de base, j'ai défini un booléen, IsEnglish. Alors c'est essentiellement: return (IsEnglish)? Voir ("EnglishView"): Voir ("JapaneseView"); Mon principal problème est de dire aux contrôleurs quelle langue, et comment la garder à la langue jusqu'à ce qu'elle change de nouveau (par visite). – Chaddeus

2

Ne pas mettre la langue à la fin de votre itinéraire. Mettez-le au début. Cela facilite le travail avec différentes routes pouvant contenir des paramètres facultatifs.

Le paramètre de langue ne devrait vraiment changer que le transfert.

Si vos utilisateurs japonais ont des règles spécifiques (prix, options de livraison, etc.), vous devez implémenter les spécificités de la langue et du pays. Un pays est quelque chose que vous trouvez sous "application multi tennant" il n'est pas détecté par la langue du navigateur.

Un utilisateur japonais pourrait naviguer sur le site anglais et voir le contenu anglais dans une traduction japanes

routes.MapRoute(
     // Route name 
     "LocalizedRoute", 
     // URL with parameters        
     ("{language}/{controller}/{action}"), 
     // Parameter defaults 
    new 
    { 

      action = "Index", 
      language = "de" 

     }, 
        //Parameter constraints 
     new { language = @"en-us|ja-jp" } 
+0

hmm ... mon problème est que mes routes ressemblent déjà à ceci: routes.MapRoute ("BaseRoute", ("{b}/{controller}/{action}") ... ce qui veut dire que ça finirait par ressembler : routes.MapRoute ("BaseRoute", ("{lan}/{b}/{controller}/{action}") ... Que se passerait-il si lang manquait? L'URL typique ressemblerait à: www.domain.com/Controller/Action/Id, l'itinéraire appliquerait Controller au jeton lang.;/ – Chaddeus

+1

Comment définissez-vous une URL typique? Elle ne devrait être définie dans MapRoute que si vous utilisez des Helpers Html et Url pour la génération de liens (vous devriez vraiment faites-le) vous pouvez être sûr que tous vos liens ont le bon formulaire une fois que vous changez MapRoute Si aucune langue n'est encore choisie, la valeur par défaut est prise –

+0

oui, le problème est que j'ai été paresseux ... n'a pas utilisé l'URL Travailler sur un sélecteur de langue basé sur un sous-domaine, mais cela semble être un échec pour moi maintenant ... Je vais juste devoir l'aspirer et revenir à travers mes liens vers les configurer correctement. Je vous remercie! – Chaddeus

Questions connexes