2011-05-26 9 views
11

Sto cercando un modo semplice ed elegante per gestire il genere grammaticale con Gettext in un'applicazione Rails, allo stesso modo i plurali vengono gestiti con il metodo n_().Gestione di genere grammaticale con Gettext

Questo non ha alcun interesse in inglese, dal momento che le parole non variano in base al genere, ma lo fa quando si traduce in spagnolo. Lui/lei è un buon caso d'uso in inglese. Questo è veramente necessario quando si traduce in spagnolo.

Un esempio:

utenti Considerando Pablo (maschio) e María (femmina).

_('%{user} is tall') & {:user => user.name} 

dovrebbe essere tradotto per

'Pablo es alto' 
'María es alta' 

Naturalmente, abbiamo accesso a user.gender

Tutte le idee?

Cheers!

risposta

10

Utilizzando gettext funzioni standard di questo può essere risolto utilizzando contesti. Come chiamare appropriato:

p_('Male', '%{user} is tall') 

o

p_('Female', '%{user} is tall') 

Questo genererà due stringhe separate in cataloghi gettext contrassegnandoli con "maschio" e "femmina" contesti.

+1

Penso che questa risposta sia più corretta di quella precedentemente indicata. Grazie! – dgilperez

3

Purtroppo no. Questa è una limitazione del sistema gettext - a parte il numero, le caratteristiche linguistiche si basano sulla lingua da cui si digita. Se dovessi digitare tutte le tue corde in spagnolo, funzionerebbe.

Un'altra opzione sarebbe quella di aggiungere un carattere alla stringa per motivi di traduzione, e quindi toglierlo.

Non ho familiarità con Ruby, ma l'idea di base in pseudo-codice sarebbe:

if (user.sex == male) { 
    strip_last_char(_('%{user} is tall♂') & {:user => user.name}) 
} else { 
    strip_last_char(_('%{user} is tall♀') & {:user => user.name}) 
} 
+0

grazie per la risposta, per confermare ciò che già sospettavo, e per fornire una soluzione molto interessante! – dgilperez

+0

@dgilperez - Benvenuto! – DougW

+0

+1 per la soluzione di caratteri speciali! –

1

Che dire del meccanismo plural form di gettext. Di solito un parametro n è usato per distinguere tra forme singolari e plurali.

Ora immagina di usare n per definire il tuo sesso invece di un importo. Quindi p.ex. n = 1 significa femminile (e non singolare) e n = 2 (o n> 1) significa femminile (e non plurale).

n = user.male? ? 1 : 0 
n_('%{user} is tall', '%{user} is tall', n) & {:user => user.name} 
+0

thx per la corretta sintassi del ruby ​​dgilperez. se usi user.gender invece di n, come ho proposto, allora questo potrebbe essere usato anche per altre lingue con più due forme di genere. Inoltre, sii consapevole di configurare correttamente Plural-Forms (qui: Plural-Forms: nplurals = 2; plurale = n == 1? 0: 1;) nei tuoi messaggi.po – Knut

+2

No! Un milione di volte no! – CodeMonkey