large - iOS: determina se il linguaggio del dispositivo è da destra a sinistra(RTL)



uitableview large title (8)

Assicurati di restituire 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). Per verificare la direzione dei caratteri della lingua attualmente selezionata, puoi fare:

+ (BOOL)isDeviceLanguageRTL {
  return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft);
}

Probabilmente vorrai memorizzare nella cache il risultato, utilizzando dispatch_once .

Tieni presente che questa è la direzione della lingua preferita dell'utente e non necessariamente la direzione della lingua del testo. Per questo, usa una funzione C basata su u_charDirection .

https://code.i-harness.com

C'è un modo per determinare facilmente se la lingua in cui è impostato il dispositivo è da destra a sinistra (RTL)?


C'è un modo ufficiale per farlo:

if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
}

Ti consiglio di non utilizzare alcune delle altre soluzioni, perché non sempre restituiscono le impostazioni internazionali corrette. Solo perché è nella parte superiore delle lingue preferite non significa che l'applicazione lo supporti.

Fonte: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html


Ecco una versione 3 rapida:

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
        }
    }
}

Grazie alla risposta di Kevin Ballard sono riuscito a creare la seguente funzione di utilità per fare questo:

+ (BOOL)isDeviceLanguageRTL {
   return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}

Ok, anche se è una vecchia domanda con una risposta accettata, risponderò comunque.

Per coloro che desiderano verificare se la lingua del dispositivo è RTL , indipendente se l'applicazione supporta o meno questa lingua, è necessario utilizzare [NSLocale characterDirectionForLanguage:] questo modo:

+ (BOOL)isDeviceLanguageRightToLeft {

    NSLocale *currentLocale = [NSLocale currentLocale];
    NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]];
    return (direction == NSLocaleLanguageDirectionRightToLeft);
}

Il codice sopra restituirà 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 lo snippet di codice:

+ (BOOL)isAppLanguageRightToLeft {

    NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection;
    return (direction == UIUserInterfaceLayoutDirectionRightToLeft);
}

Il codice sopra restituirà NO quando la tua app supporta solo l'inglese, ma il tuo dispositivo è impostato su arabo, ad esempio.


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.

Quindi hai 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 memorizzalo in una variabile statica, usando il costruttore statico:

static BOOL s_isRtl = NO;
+ initialize
{
    s_isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft;
}

Si noti che questo in realtà condividerà la variabile statica tra qualsiasi classe che utilizza questo codice.


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 come risultato di [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] .

Aggiornare:

La domanda originale posta era come determinare se la lingua del dispositivo è RTL. Usando +[NSLocale characterDirectionForLanguage:] e +[NSLocale lineDirectionForLanguage:] è senza ambiguità 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 sia 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 .


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 Argomenti avanzati in Internazionalizzazione wwdc2014





localization