C'è un modo per determinare facilmente se la lingua del dispositivo è impostata da destra a sinistra (RTL)?iOS: consente di determinare se la lingua del dispositivo è da destra a sinistra (RTL)
risposta
In iOS 9 è possibile determinare la direzione corrente per ogni singola vista.
if #available(iOS 9.0, *) {
if UIView.userInterfaceLayoutDirection(
for: myView.semanticContentAttribute) == .rightToLeft {
// The view is shown in right-to-left mode right now.
}
} else {
// Use the previous technique
if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft {
// The app is in right-to-left mode
}
}
Questo è il modo consigliato di determinare la direzione layout in IOS 9.
WWDC 2015 Video New UIKit Support for International User Interfaces. Dopo il minuto 31:20.
NSLocale
ha due metodi +characterDirectionForLanguage:
e +lineDirectionForLanguage:
. Il primo è presumibilmente da sinistra a destra vs da destra a sinistra e il secondo è dall'alto verso il basso e dal basso verso l'alto. Puoi passarlo il risultato di [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]
.
Aggiornamento:
La domanda iniziale chiesto era quello di determinare se la lingua del dispositivo è RTL. Usare +[NSLocale characterDirectionForLanguage:]
e +[NSLocale lineDirectionForLanguage:]
è chiaramente corretto per quello; è possibile passare a [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]
o [NSLocale preferredLanguages][0]
a quello per ottenere le informazioni rilevanti (non sono sicuro se il NSLocaleLanguageCode
utilizza la lingua preferita o l'area impostata).
Tuttavia, è molto probabile che ciò che il poster originale volesse sapere è se l'interfaccia dell'applicazione debba essere presentata in RTL o LTR. Questo è molto simile a chiedere qual è la direzione della lingua, tranne che prende in considerazione le localizzazioni disponibili dell'applicazione. Se l'applicazione non è localizzata nella lingua preferita dell'utente, utilizzerà invece una lingua non preferita. E la risposta a questa domanda è usare [UIApplication sharedApplication].userInterfaceLayoutDirection
.
Purtroppo questo non è corretto; il modo migliore per farlo è attraverso '' '[UIApplication sharedApplication] .userInterfaceLayoutDirection''', come menzionato nella [risposta di seguito] (http://stackoverflow.com/a/25500099/242849). – wakachamo
Giù votando questa risposta. Vedi il commento di 'wakachamo' per il modo migliore per determinare la direzione del layout dell'interfaccia. – Sean
@wakachamo: la domanda che veniva posta era determinare se la lingua fosse RTL. '[UIApplication sharedApplication] .userInterfaceLayoutDirection' dichiara se la direzione dell'interfaccia deve essere impostata su LTR o RTL. Questa non è esattamente la stessa cosa che la domanda stava ponendo. Anche se potrebbe essere in effetti ciò che voleva il poster originale. –
Grazie alla risposta di Kevin Ballard sono stato in grado di creare la seguente funzione di utilità per fare questo:
+ (BOOL)isDeviceLanguageRTL {
return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}
Sebbene la risposta di @ Accatyyc sia tecnicamente corretta, nel mio caso non ha restituito il valore corretto. Eseguo il test su iOS8, cambio lingua in arabo ma il metodo 'userInterfaceLayoutDirection' ha restituito LTR. Così ho provato questa risposta e ha risolto il mio problema. – FormigaNinja
Assicurarsi ritorni la lingua attualmente selezionata, non la regione corrente del dispositivo. La regione e la lingua sono spesso le stesse. Tuttavia, se sono in Nord America e ho impostato la lingua giapponese, la mia regione sarà ancora inglese (Stati Uniti). Al fine di controllare la direzione di caratteri della lingua selezionata, si può fare:
+ (BOOL)isDeviceLanguageRTL {
return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft);
}
Potrebbe essere probabile che vogliono memorizzare nella cache il risultato, utilizzando dispatch_once
.
Ricordare che questa è la direzione della lingua preferita dell'utente e non necessariamente la direzione della lingua del testo. Per questo, utilizzare una funzione C basata su u_charDirection
.
Anche questa risposta è sbagliata - guarda la mia risposta. – Accatyyc
Rose Perrone è completamente corretto. Tuttavia l'uso di dispatch_once in un getter per un semplice valore booleano - è davvero troppo sovraccarico. Uso non necessario della spedizione una volta. Perché probabilmente vorrai usarlo più volte all'interno di un layout o di una funzione di disegno.
in modo da avere due opzioni più veloci:
+ (BOOL)isRtl
{
static BOOL isRtl = NO;
static BOOL isRtlFound = NO;
if (!isRtlFound)
{ // This is "safe enough". Worst case is this code will be called twice in the app's lifecycle...
isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft;
isRtlFound = YES;
}
return isRtl;
}
O semplicemente memorizzare nella cache in una variabile statica, utilizzando il costruttore statico:
static BOOL s_isRtl = NO;
+ initialize
{
s_isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft;
}
Si noti che questo sarà effettivamente condividere la variabile statica tra un qualsiasi classe che usa questo codice.
aggiornamento dispatch_once: "Questa funzione è utile per l'inizializzazione di dati globali (singleton) in un'applicazione.Tenuta sempre questa funzione prima di utilizzare o testare le variabili inizializzate dal blocco. Se chiamato contemporaneamente da più thread, questa funzione attende sincrono fino al completamento del blocco Il predicato deve puntare a una variabile memorizzata in ambito globale o statico. " – SK9
Ecco come l'ho usato:
+(NSTextAlignment) alignmentOfLanguage {
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){
return NSTextAlignmentRight;
}
return NSTextAlignmentLeft;
}
L'ultimo esempio non ha funzionato per me, ma con un po variante, ho capito rightX2.
eventuali commenti?
C'è un modo ufficiale per farlo:
if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
}
mi sento di raccomandare di non usare alcune delle altre soluzioni, perché non torneranno sempre le impostazioni internazionali corrette. Solo perché è nella parte superiore delle lingue preferite non significa che l'applicazione lo supporti.
Questo è (dato il senso poco chiaro della domanda dell'OP) molto probabilmente ciò che l'OP voleva. – Sean
Si prega di notare che Apple ha aggiornato i loro documenti, e ora raccomanda un metodo diverso che è solo iOS 9. Vedi: http://stackoverflow.com/a/31759275/785716 – Keab42
Io lo uso in certi casi, anche su iOS 9, poiché a volte semplicemente non hai un'istanza di un UIView per controllare il semanticContentAttribute. – Mike
Ok, anche se è una vecchia questione con una risposta accettata, risponderò comunque.
Per coloro che vogliono verificare se la lingua del dispositivo è RTL, indipendente se l'applicazione supporta o no questa lingua, è necessario utilizzare [NSLocale characterDirectionForLanguage:]
come questo:
+ (BOOL)isDeviceLanguageRightToLeft {
NSLocale *currentLocale = [NSLocale currentLocale];
NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]];
return (direction == NSLocaleLanguageDirectionRightToLeft);
}
Il codice di cui sopra tornerà YES
se la tua app supporta solo l'inglese, ad esempio il tuo dispositivo è impostato su arabo.
Apple consiglia di utilizzare [UIApplication sharedApplication].userInterfaceLayoutDirection
, solo perché restituisce la direzione in base alla lingua utilizzata dall'app (supporta). Ecco il frammento di codice:
+ (BOOL)isAppLanguageRightToLeft {
NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection;
return (direction == UIUserInterfaceLayoutDirectionRightToLeft);
}
Il codice di cui sopra restituirà NO
quando la vostra applicazione supporta solo inglese, ma il dispositivo è impostata su arabo, per esempio.
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) {
NSLog(@"Right to left");
}
else{
NSLog(@"left to Right");
}
} else {
/* Use the previous technique */
//Work for earlier ios 6 to ios 10
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft) {
NSLog(@"Right to left");
}
else{
NSLog(@"left to Right");
}
}
deve guardare Advanced Topics in Internationalization wwdc2014
Ecco un rapido 3 Versione:
import UIKit
extension UIView
{
/// Returns text and UI direction based on current view settings
var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection
{
if #available(iOS 9.0, *) {
return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute)
} else {
return UIApplication.shared.userInterfaceLayoutDirection
}
}
}
se si desidera controllare se il dispositivo è in esecuzione in RTL o LTR a Swift 3
if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) {
//RTL
} else {
//LTR
}
- 1. android determina se il dispositivo è in linguaggio da destra a sinistra/layout
- 2. Supporto lingua Flexslider e Destra-Sinistra
- 3. supporto da destra a sinistra (RTL) nel progetto SASS
- 4. UILabels da destra a sinistra
- 5. In da destra a sinistra la lingua (come l'arabo e l'ebraico), staffa invertito
- 6. Layout da destra a sinistra in Android
- 7. Il layout cambia se la lingua del dispositivo è l'arabo
- 8. lingua django da destra a sinistra con LANGUAGE_BIDI non funziona
- 9. lingue da destra a sinistra in Python
- 10. Iphone e testo da destra a sinistra
- 11. Caratteri inversi in una stringa con lingue miste da sinistra a destra e da destra a sinistra utilizzando SQL?
- 12. ProgressBar da destra a sinistra?
- 13. cambia la direzione della barra delle azioni da destra a sinistra
- 14. Inversione di stringhe nelle lingue da destra a sinistra (BiDirectional) in iTextSharp
- 15. destra a sinistra Bar in
- 16. Come invertire la direzione delle parentesi (per il testo da destra a sinistra) per la lingua araba
- 17. Aggiungi UIGestureRecognizer per scorrere da sinistra a destra da destra a sinistra le mie viste
- 18. Interfaccia utente da destra a sinistra in iPhone (ebraico)
- 19. Metodi di concatenamento da sinistra a destra in Haskell (opposto a destra a sinistra)
- 20. Android: supporto RTL - cifre incorporate in una frase da destra a sinistra (ebraico)
- 21. Impostazione della direzione del contenuto predefinito di TinyMCE da destra a sinistra
- 22. Come passare da sinistra a destra in un file css?
- 23. Da destra a sinistra Testo Ingresso HTML
- 24. Come posso riempire RecyclerView con GridLayoutManager da destra a sinistra
- 25. Come impedire la direzione automatica del testo da destra a sinistra per l'ebraico e l'arabo?
- 26. Haskell funziona da sinistra a destra
- 27. Come utilizzare la lingua da destra a sinistra nell'editor "Testo sublime"
- 28. Come utilizzare jqueryui per le lingue da destra a sinistra
- 29. Dissolvenza CSS da sinistra a destra
- 30. Bootstrap 3 Collapse (da sinistra a destra)
Esiste comunque una risposta come "corretta ora"? Per i posteri, la risposta che ho scelto tre anni fa era corretta al momento, ma probabilmente dovrebbe essere più in alto. – BarrettJ
@BarrettJ puoi sempre annullare l'accettazione e accettare un'altra risposta. – SmokeDispenser
È ora 'UIView.userInterfaceLayoutDirectionForSemanticContentAttribute (semanticContentAttribute) == .RightToLeft'. – ChrisB