Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I've come up with what I think is a slightly improved version of rickerbh's accepted answer. The first thing to realize is that user defaults are organized into domains, and the <code>@"AppleLanguages"</code> key comes not from the app's domain, but from some domain higher up the hierarchy of domains. This means it is completely safe to remove it from user defaults:</p> <pre><code>NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"AppleLanguages"]; </code></pre> <p>After calling this code, you'll notice that calling <code>[defaults objectForKey:@"AppleLanguages"]</code> still returns a value. So, rather than deleting <code>@"AppleLanguages"</code> at some point later, which could be problematic depending upon the complexity of your app, you want to do the opposite: <strong>delete <code>@"AppleLanguages"</code> immediately</strong>. Essentially, this resets it back to its default value and captures any changes to it the system has made, if, for instance, the user has changed her preferred language.</p> <p>Here's what I do:</p> <pre><code>NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"AppleLanguages"]; NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; for (NSString *language in languages) { NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; [appleLanguages removeObject:languageAndRegion]; } for (NSString *language in languages) { NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; NSInteger index = [appleLanguages indexOfObject:language]; [appleLanguages insertObject:languageAndRegion atIndex:index]; } [defaults setObject:appleLanguages forKey:@"AppleLanguages"]; </code></pre> <p>(Note that <code>filteredArrayUsingPredicateFormat:</code> is an extension method I wrote. It's not rocket science to figure out what it does or how it works.)</p> <p>This creates localizations for every language in the list combined with the user's region. E.g., if the original list was <code>es en en-GB</code> and the user's region is AU, we'll get <code>es-AU es en-AU en en-GB</code>. Note that <code>es-AU</code> doesn't exist, but it makes no difference. Since the app finds no associated localizations or resources, it just ignores it.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload