2014-10-09 7 views
7

La domanda dice tutto. Se metto HTML direttamente nel file di traduzione (in formato JSON), in questo modo:node.js: non c'è modo di inserire l'HTML nei file di traduzione JSON di i18n-node?

"test_html" : "click <a href='http://stackoverflow.com/'>here</a>", 

ottengo questo nel mio HTML:

click &lt;a href=&#39;http://stackoverflow.com/&#39;&gt;here&lt;/a&gt; 

Ho anche provato che unisce questo nel mio file di traduzione:

"test_html_placeholder" : "click %shere%s", 

Con questo nel mio HTML:

<%= __('test_html_placeholder', '<a href="http://stackoverflow.com">', '</a>') %> 

Ma ha ottenuto risultati simili.

L'unica cosa che posso andare al lavoro è questo goffaggine:

"test_html_pre" : "click ", 
"test_html_link" : "here", 
"test_html_post" : ".", 

con questo:

<%= __('test_html_pre') %><a href="http://stackoverflow.com"><%= __('test_html_link') %></a><%= __('test_html_post') %> 

Ma è così ingombrante da essere quasi non vale la pena di fare, e per di più l'ordine delle parole in alcune lingue mi costringerebbe a inserire alcune stringhe vuote nei miei file di traduzione, cosa che a i18n-node non sembra piacere quando sputa il nome della chiave (attributo) quando lo incontra una stringa vuota.

Ho anche provato a utilizzare "\" come carattere di escape davanti ai simboli, ma ho ricevuto un errore JSON non valido quando ho sollevato le vele (riavviato il server).

Qualche idea, soluzioni alternative? Sto usando sails.js, non è stata una mia decisione, ma sono bloccato con esso e viene fornito con i18n-node. È un po 'tardi durante il giorno in questo progetto prendere in considerazione l'utilizzo di un'altra libreria, ma non completamente fuori questione.

risposta

9

fianco di ogni discussione imminente se includere il codice (HTML-) in file di lingua o no:

tenta di utilizzare

<%- __('<a href="#">click</a>') %> 

invece di

<%= __('<a href="#">click</a>') %> 

nel ejs (la vele motore di template predefinito) a '<% =' sfuggirà qualsiasi tag html mentre '<% -' colloca l'output così com'è senza toccarlo. Sono abbastanza sicuro che troverai un codice HTML senza caratteri nei tuoi file .json. i18n non esegue alcuna trasformazione diversa da JSON.stringify() ma quasi tutti i motori di template sfuggono le stringhe per impostazione predefinita per impedire xssi.

+0

"a fianco di ogni discussione imminente se includere il codice (HTML-) in file di lingua o no:" Sembra che tu stia suggerendo che è una cattiva idea per altri motivi, presumibilmente manutenibilità? Le vele predefinite mi offrono un altro modo per escludere l'HTML dai miei file di lingua? – jasper

+1

ovviamente questo parere, ma come regola empirica uso i file di lingue solo per frasi brevi e complete e cerco di separarli dal contesto. Le frasi più grandi successive vanno in partial o anche fino a viste separate. Ma: per tradurre semplicemente "" fai clic su here "' Anche io romperò le mie stesse regole :) –

+0

@jasper Hai mai risolto questo problema?Cioè, trovare una soluzione diversa da quella "hack" che hai menzionato nella tua domanda? – olefrank

0

Per coloro che utilizzano pug/giada, è possibile utilizzare

!{ __('key_for_your_text') }