How to change app locale independently from iOS system locale

Flags of european languagesI just want to share a trick on how to gain control over the Locale used for your app. The following code snippet is put in the main-method which kicks of your app.

But basically you should call this code snippet in your app and then make the user quit/terminate the app afterwards to restart with the new set default language AND set these parameters here again depending on a flag you may have stored elsewhere. Because actually all those set default values are actually already used at an earlier point in time i.e. for date formatting.

int main(int argc, char *argv[])
{
    @autoreleasepool {
        
        // OVERRIDE LOCALE (BASICALLY DO THIS WHILE APP RUNS AND LET USER RESTART APP)
        BOOL shouldOverrideLocale = NO; // LET'S TRY TO OVERRIDE IT WITH en_US
        NSString *languageIdentifier = @"en";
        NSString *countryIdentifier = @"US";
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
        if( shouldOverrideLocale ) {
            NSLog( @"OVERRIDING SYSTEM LOCALE WITH : %@_%@",languageIdentifier, countryIdentifier );
            [defaults setObject:[NSArray arrayWithObject:languageIdentifier] forKey:@"AppleLanguages"];
            [defaults setObject:[NSArray arrayWithObjects:languageIdentifier, nil] forKey:@"NSLanguages"];
            [defaults setObject:[NSString stringWithFormat:@"%@_%@", languageIdentifier, countryIdentifier] forKey:@"AppleLocale"];
            [defaults synchronize];
        }
        else {
            NSArray *keysToRemove = @[@"AppleLanguages",@"NSLanguages",@"AppleLocale"];
            NSLog( @"RESETTING TO USE SYSTEM LOCALE" );
            @try {
                for( NSString *currentKey in keysToRemove ) {
                    if( [defaults objectForKey:currentKey] ) {
                        [defaults removeObjectForKey:currentKey];
                    }
                }
            }
	        @catch (NSException *exception) {
	            // NOTHNG TO CATCH HERE
	        }
	        @finally {
				[defaults synchronize];
	        }
        }
        NSString *languageCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleLanguageCode];
        NSString *countryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
        NSLog( @"USING SYSTEM LOCALE: %@_%@", languageCode, countryCode );

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

If you use this code, keep in mind, that strings and processes related to In-App-Purchase are still delivered in the native language of the user.

See also my Example App in the Github repo called LocaleOverrider.


preview

There may exist other ways of doing this. It may also be the better approach to handle all localization on your own an reinitializing NSBundle usage.

A more advanced insight into localization issues provides help on all the NSNumberFormatter and NSDateFormatter thingys, too. It is written by Ray Lillywhite and has the title „The Nitty Gritty of iOS Internationalization and Localization“.

Update 26.12.2018
How to change language elegantly at runtime.

Why do I blog this? I mentioned this code in UISprech podcast and I want to make it available to others. But be warned, it has side effects of providing the user e.g. with inconsistent language when he enters IAP e.g. and you need to find a way to elegantly terminate the app after you configured the new default language. (Pro-Tipp: shutting down an app that is already in the background won’t be noticed as a crash.)

Bremer Bäder Öffnungszeiten 2014

Aus aktuellem Anlass mal ein vereinfachter Plan für mich.

Offizielle Infoseite der Bremer Bäder

WARNHINWEIS


Nichts is so wie es scheint!

Das was bei den Bremer Bädern gemeinhin als Öffnungszeiten bezeichnet wird bezeichnet nur den Ausnahmefall, falls keine Landesmeisterschaften, keine Polizeimeisterschaften, keine DLRG Meisterschaften, keine sonstigen Schwimmwettkämpfe oder ein zufälliger nuklearer Fallout über der Schwimmbahn zu dem Zeitpunkt stattfinden zu dem man meint man komme da rein.

News: Das Horner Bad soll angeblich am Montag 2. Juno 2014 öffnen.

Das habe ich zumindest durch einen persönlichen Besuch direkt beim Bad in Erfahrung bringen können. Dort vor Ort hing lediglich der Internettext ausgedruckt „hinter Gittern“.

horner_bad

Why do I blog this? Weil ich mich jedes Mal maßlos aufregen könnte, dass das einzige Bad in dem man Schwimmsport machen kann (50 Meter Bahn) so unzugänglich für die Öffentlichkeit ist. Und weil ich es unmöglich finde, wie eine Stadt wie Bremen zusätzlich noch die Infrastruktur der Bäder so runterwirtschaften kann. Da wird Geld zum Fenster rausgeworfen für Spaßbäder, aber für ernsthaft sporttaugliche Infrastruktur fehlt das Geld. Für mich ist ein Ausgleich zur Arbeit ein Standortfaktor und Schwimmen ist mit das gesündeste was man seinem Körper als Ausgleich geben kann. Leider ist das in Bremen nahezu unmöglich, aber das Bad ist ja eh schon von Schließung bedroht, von daher hat sich das Problem bald eh von selbst erledigt. Nur wie sollen bitte leistungsfähige Menschen Bremen als Standort ernsthaft in Betracht ziehen, wenn der wichtigste Ausgleich zur Arbeit quasi unmöglich gemacht wird? Ich könnte mich echt nur aufregen über soviel katastrophales Management. Öffnungszeitenänderungen werden mit Vorlaufzeiten von oft weniger als einer Woche durchgezogen, ich muss mich also schon eine Woche vorher informieren, ob ich am Wochenende überhaupt reinkomme oder wieder nicht. Und dann bleibt nur unter der Woche morgens zwischen 7 und 9 wie toll. Richtig Frühaufsteherfreundlich! Und wo bleiben die die eher nach 1700 oder 1800 Uhr können? Richtig am einzigen Tag wo das geht am Mittwoch… wenn nicht grade die ganze Woche das Bad für die Polizei-Landesschwimmmeisterschaften gesperrt wird. WEIL DIE POLIZEI, die kann ja NUR UNTER DER WOCHE! Ich rege mich auf…

Der 1-Sterne-Kunde

Heute möchte ich mir mal ein wenig Luft machen über sogenannte 1-Sterne-Kunden. Das sind Kunden, die prinzipiell im AppStore 1-Sterne-Reviews schreiben. Was ist die Motivation für diese Kunden? Was bringt sie dazu ein Produkt mit einem Stern zu „bewerten“?

Sterne-Koenig_550

Normalerweise würde ich mich jetzt einfach selbst fragen, wann gebe ich denn 1-Sterne-Bewertungen? Ich vergebe fast nie 1-Sterne-Wertungen, sondern als Minimum oft 2 bis 3 Sterne. Selten ist ein Produkt so schlecht, dass es die schlechteste Bewertung verdient hat die man wählen kann. Da muss z.B. eine App bei mir bereits beim Start im Crash enden und damit unbenutzbar sein. Selbst wenn eine App nur mit Facebook-Account nutzbar ist ist das noch kein 1-Sterne-Grund für mich. Ich kann die App ja nicht wirklich ausprobieren. Der Anbieter möchte eben gerne nur Facebooknutzer, das ist dann eher sein Problem als meines.

Austeilen statt Einstecken müssen

Warum aber bashen Leute dann Produkte runter? Meine Hypothese ist nach wie vor (auch nach über 4 Jahren AppStore Erfahrung) eine vergleichsweise einfache:

AppStore Reviews werden u.a. auch als sozial-psychologisches Überdruckventil missbraucht.

Meine Hypothese beruht auf den Erfahrungen die ich mit Kunden gemacht habe. Wer ernsthaft versucht seine Kunden glücklich zu machen, der muss zu ähnlichen Hypothesen gelangen, denn mit dem Produkt und seinen Eigenschaften haben die Reviews oft nicht viel zu tun.

Vielmehr haben Kunden wie jeder andere Mensch einiges an Stress im Leben. Kunden die sich bei meinen Produkten besonders durch 1-Sterne-Reviews hervorgetan haben, sind in der Regel bemitleidenswerte Gestalten gewesen. Oft haben sie gerade eine ziemlich schlechte Zeit, z.B. weil sie grade in eine Privatinsolvenz gehen, oder sie haben mächtig Stress mit ihrem Lebenspartner, oder sie haben grade andere finanzielle und existenzielle Sorgen die ihre Art zu Leben bedrohen. Oft sind es diese existenziellen Ängste, die meine Kunden zu 1-Sterne-Kunden werden lassen.

Sie wissen nicht wohin mit dem Druck an Ansprüchen ihres Umfeldes der auf ihnen lastet und da sie im AppStore vergleichsweise anonym (man kann sich eine Nutzerkennung selber wählen) Produkte bewerten können, nutzen sie die Gelegenheit endlich mal gegen einen anderen austeilen zu können. Oft in der Annahme, das Gegenüber könne sich nicht wehren, damit erleben sie zunächst ein Gefühl von Machtausübung und Kontrolle, das ihnen in ihrer augenblicklichen Lebenssituation oft verwehrt bleibt.

Gegenmaßnahmen

Doch wie geht man mit solchen im Prinzip psychologisch behandlungsbedürftigen Personen um? Hier hat sich bei meiner Arbeit ein Set von Regeln herauskristallisiert, mit dem man derartige Kunden behandeln sollte. Zunächst sollte man den Reviews hinterher gehen und recherchieren, wo sie herkommen.

  1. Bewertet der Nutzer andere Apps (egal welcher Kategorie) auch immer nur mit 1-Stern-Reviews? Sicheres Anzeichen für einen „Basher“, der ausschließlich Druck abbaut über Reviews und sich dies zuer Gewohnheit gemacht hat. Einfach ignorieren!
  2. Kann man über die Nutzerkennung Rückschlüsse auf E-Mail-Adressen gewinnen oder Realnamen? Oft hilft ein Anruf bei dieser Person (sofern man die Telefonnummer mit ein paar Klicks bei Google ermitteln kann), um das zweifelhafte Verhalten des „Kunden“ abzustellen.
  3. Bewertet der Nutzer spezifische Apps der gleichen App-Kategorie alle mit 1-Sterne Reviews hingegen eine oder wenige ausgewählte dieser Kategorie mit 5-Sterne Reviews? Dann liegt Astroturfing vor. Kann man den Astroturfer ermitteln ist das ein Grund für Apple den Entwickleraccount der dahinter steht zu sperren!
  4. Gibt der Reviewtext weitere Aufschlüsse über den Kunden selbst (Herkunftsregion, beruflicher Hintergrund, Alter, Geschlecht, etc.)? Dies kann oft ein Hinweis sein, wer aus dem Kundenkreis sich dahinter verbirgt.
  5. Taucht der Nutzername im Internet in anderen Foren und Webseiten erneut in exakt gleicher Schreibweise auf? Ist dort ein Realname assoziiert oder ein E-Mail-Kontakt möglich? Man sollte versuchen da hinterherzustalken, denn nur wenn diese Personen merken, dass sie nicht anonym sind stellen sie ihr Tun ein.
  6. Sofern man per E-Mail Kontakt erhält, sollte man dem Kunden freundlich anbieten das Produkt zurückzugeben und sein Geld zurück zu erhalten, denn das trifft diese Art Kunden am meisten und der Kunde kann dann keine weiteren Reviews mehr schreiben, wenn Apple den Kauf rückgängig macht. Sie merken dann auch, dass sich hier das Gegenüber wehrt und lassen dann zukünftig von ihrem Tun ab.
  7. Eine Bitte das Review zu entfernen sollte man unterlassen, das führt zu nichts, im Gegenteil, damit baut man den bashenden 1-Sterne Kunden noch auf in seiner „gefühlten“ Machtposition.
  8. Als letzte Maßnahme sollte man diesen Kunden mit all seinen Attacken vollständig ignorieren und sich stattdessen auf die guten Kunden konzentrieren und diesen nach Kräften helfen.

Why do I blog this? Immer mal wieder habe ich mit sogenannten 1-Sterne-Kunden zu tun. Sie sind mit die teuersten Kunden und erzeugen die meisten Kosten, daher ist ein weiser Umgang mit ihnen wichtig. Oftmals würde ich mir wünschen der AppStore hätte einen „Instant-Refund“-Funktion, mit der ich den Kauf eines Kunden aus der Ferne rückgängig machen kann. Geld zurück und App löschen! das wäre ein Killerfeature. Wenn es diese Funktion gäbe würden sich Kunden das mit den 1-Sterne-Reviews sicher dreimal überlegen. Lediglich ihre durch Apple protegierte und privilegierte Lage Reviews in einer de facto Anonymität abgeben zu können ohne Konsequenzen tragen zu müssen für das was man schreibt bringt diese Unsitte hervor. Die Decke der Zivilisation ist eben recht dünn heutzutage. Da wird in der Anonymität schnell die gute Kinderstube der Erziehung vergessen.