2009-07-06 7 views
13

Je veux que le code JavaScript soit séparé des vues.
j'ai eu l'obligation de mettre en œuvre la localisation pour un simple bouton d'image généré par JavaScript:Comment gérer la localisation dans les fichiers JavaScript?

<img src="..." onclick="..." title="Close" /> 

Quelle est la meilleure technique pour localiser le titre de celui-ci?

PS: J'ai trouvé a solution par Ayende. C'est la bonne direction.

Édition:
J'ai obtenu la classe d'assistance de localisation qui fournit la méthode d'extension Controller.Resource('foo').

Je pense à l'étendre (helper) afin qu'il puisse renvoyer toutes les ressources JavaScript (du sous-dossier "ClientSideResources" dans App_LocalResources) pour le contrôleur spécifié par son nom. Ensuite, appelez-le au BaseController, ajoutez-le au ViewData et affichez-le au Layout.

Est-ce que ce serait une bonne idée?

Répondre

9

EDIT

pouvez écrire les ressources localisées nécessaires à un objet JavaScript (hachage), puis l'utiliser pour la recherche de vos objets créés dynamiquement. Je pense que c'est mieux que de retourner au serveur pour les traductions. Ceci est similaire à l'ajout via viewdata, mais peut être un peu plus flexible. FWIW, je pourrais considérer que les ressources de localisation font partie de la vue, et non du contrôleur.

Dans la vue:

<script type="text/javascript" 
     src='<%= Url.Content("~/Resources/Load?translate=Close,Open" %>'></script> 

qui génèrerait quelque chose comme:

var local = {}; 
local.Close = "Close"; 
local.Open = "Open"; 

Sans arguments, il génèrerait l'ensemble de hachage de traduction. L'utilisation d'arguments vous donne la possibilité de le personnaliser par vue.

Vous pouvez ensuite l'utiliser dans vos fichiers JavaScript comme:

$(function(){ 
    $('#button').click(function() { 
     $("<img src=... title='" + local.Close + "' />") 
      .appendTo("#someDiv") 
      .click(function() { ... }); 
    }); 
}); 

En fait, je ne suis pas trop embêté de garder mon code JavaScript de mon point de vue aussi longtemps que le code JavaScript est localisé dans un conteneur . Typiquement, je vais définir ma page maître avec 4 zone de contenu: titre, en-tête, principal et scripts. Le titre, l'en-tête et la main vont là où vous vous attendez et la zone des scripts va au bas du corps.

J'ai placé tous mes includes JavaScript, y compris ceux pour viewusercontrols, dans le conteneur des scripts. Le code JavaScript spécifique à la vue vient après l'inclusion. Je refactorise le code partagé en scripts au besoin. J'ai pensé à utiliser une méthode de contrôleur pour assembler les scripts, c'est-à-dire inclure plusieurs scripts en utilisant une seule requête, mais je n'ai pas encore trouvé de solution. Ceci a l'avantage de garder le code JavaScript séparé pour plus de lisibilité, mais aussi d'injecter facilement des données de modèle ou de vue dans le code JavaScript si nécessaire.

+0

« Je javascript veux être séparé de vue. » == "Aussi une bonne pratique pour garder votre javascript séparé de votre mark up.". <= et c'est le problème pourquoi <%= foo %> ne fonctionnera pas. –

+0

Btw, pourquoi attacher le gestionnaire onclick sur JS onload est préférable? –

+0

J'ai raté la partie "généré par JS" de votre question - juste scannée juste au-dessus. Dans ce cas, je considérerais écrire les données localisées dans la vue et charger le javascript depuis un objet local. Va réécrire. – tvanfosson

1

Si vous insistez en les séparant, vous pourriez faire quelque chose comme:

//keep all of your localised vars somewhere 
var title = '{title_from_server}'; 
document.getElementById('someImage').title = title; 

Rappelez-vous, si vous utilisez le code JavaScript pour initialiser le texte des éléments, votre site se dégrade terriblement où JavaScript n'est pas disponible .

+0

Merde ... Encore une fois oublié sur le manque possible de support javascript. :( –

Questions connexes