2010-03-17 20 views
10

Ho familiarità con l'uso di NSLocalizedString() per localizzare le stringhe, ma il problema che ho oggi richiede un po 'più finezza. La mia situazione è simile a questo:Localizzazione di stringhe concatenate o dinamiche

NSString *userName; //the users name, entered by the user. Does not need localized 
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized 

NSString *summary = [NSString stringWithFormat:@"%@'s favorite food is %@", userName, favoriteFood]; 

Questo funziona bene per l'inglese, ma non ogni lingua usa la stessa parola ordinamento come l'inglese, per esempio, una traduzione parola per parola dello stesso sentance dal giapponese in inglese sarebbe leggere: la pizza cibo preferito

di UserName è

senza contare che 's è non fare un possessivo in tutte le lingue.

Quali tecniche sono disponibili per la localizzazione di questo tipo di frase concatenata?

AGGIORNAMENTO PER IL VANTAGGIO DEGLI ALTRI: @Jon Reed ha ragione, gli specificatori di posizione sono molto importanti per la localizzazione. Il documento che ha linkato contiene solo un riferimento al fatto che possono essere usati con NSString, NSLog, altri, il link in realtà non dice COME usarli.

Ho trovato this link, che lo spiega bene. Spiega anche la mia domanda meglio di me. Dal link:

stringhe di formato per printf e sprintf (vedi Printf) presentano un problema particolare per la traduzione. Si consideri il seguente : 1

printf(_"String `%s' has %d characters\n", 
      string, length(string))) A possible German 

traduzione per questo potrebbe essere:

"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem 

dovrebbe essere ovvio: l'ordine delle specifiche di formato è diverso dall'originale! Anche se gettext può restituire la stringa tradotta al runtime , non può modificare l'ordine nella chiamata a printf.

Per risolvere questo problema, formato printf prescrittori possono avere un elemento opzionale aggiuntiva, che noi chiamiamo una specifica posizionale . Ad esempio:

"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the 

specificatore posizionale è costituito da un conteggio intero che indica che argomento da utilizzare, e un ‘$’. I conteggi sono basati su uno e la stringa di formato non è inclusa. Così, nel seguente esempio, 'stringa' è il primo argomento e 'length (stringa)' è secondo:

$ gawk 'BEGIN { 
>  string = "Dont Panic" 
>  printf _"%2$d characters live in \"%1$s\"\n", 
>       string, length(string) 
> }' 
-| 10 characters live in "Dont Panic" 

risposta

27

Per specificare l'ordine di sostituzione, utilizzare %[email protected] e %[email protected] come specificatori di formato. La stringa di formato localizzata può utilizzarli in qualsiasi ordine. Ad esempio, supponi che la tua chiave di stringa sia "FavoriteFood". Chiama il numero

NSString *summary = 
      [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
             userName, favoriteFood]; 

La localizzazione colloca gli specificatori di formato ovunque abbia senso per le sue impostazioni internazionali. Esempio:

"FavoriteFood" = "%[email protected] is the favorite food of %[email protected]"; 

Vedi String Format Specifiers

+0

Ho seguito il tuo collegamento e ho letto anche Localizing String Resources (http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/StringsFiles.html). Non ho visto alcun riferimento agli specificatori di formato che hai citato (% 2 $ @) Puoi spiegarlo un po 'per favore? – SooDesuNe

+1

Segui il link e cerca "specificatori posizionali". Inoltre, provalo. Questo è uno strumento essenziale per la localizzazione. –

+0

Il '% $ 1 @' dovrebbe essere '% 1 $ @' alla fine dell'esempio. – bovine

-1

Applicando NSLocalizedString() alla stringa di formato @"%@'s favorite food is %@" dovrebbe consentire di sostituire con l'appropriato ordine delle parole e possessivi per la lingua locale.

+0

Forse mi fraintendono NSLocalizedString. Come fa a cambiare l'ordine delle variabili di sostituzione? – SooDesuNe

+0

@SooDesuNe, non penso che lo faccia; ma il tuo esempio non ha questo problema. Ci sono delle lingue che mettono l'oggetto davanti al soggetto? Wikipedia mi dice che ci sono alcune lingue native brasiliane e Klingon ... forse non è un grosso problema? –

+0

@SooDesuNe: come nella risposta di Jon Reid, è possibile utilizzare gli specificatori di formato stringa specifici della posizione per risolvere il problema degli ordini. – Isaac

Problemi correlati