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.)

The Fixer’s Manifesto

Das Manifest (als PDF) für alle, die Geräte lieber reparieren statt wegzuschmeißen.


The_fixers_manifest

Das Manifest der „Reparierer“

1. Wenn es kaputt ist, repariere es. Weil das tägliche, praktische Lösen von Problemen die schönste Form der Kreativität ist, die es gibt.

2. Wenn es nicht kaputt ist, verbessere es. Eine kleine, clevere Optimierung kann die Funktion von etwas für die kommenden Jahre verbessern.

3. Verlängere das Leben deiner Produkte. Wenn wir die Lebensdauer unseres Krams verdoppeln, halbieren wir die Müllhalden.

4. Reparieren bedeutet Freiheit und Unabhängigkeit. Wenn du Dinge reparierst, musst du dir keine Sorgen um die Abnutzung machen. Nichts bleibt neu, also vergiss Perfektion.

5. Widerstehe Trends und nutzlosen Verbesserungen. Sie fördern die Wegwerfkultur.

6. Lass dich nicht von Firmen als passiver Konsument behandeln. Jedes Mal, wenn wir Geld ausgeben stimmen wir auch über die Produkte ab, die Erfolg haben sollen. Kaufe Produkte, die repariert werden können.

7. Eine reparierte Sache ist etwas Schönes. Jede Reparatur, egal ob kunstvoll oder improvisiert, erzählt eine Geschichte.

8. Wenn du eine Idee hast, fange klein an und mache es gut. Wenn es richtig ist, wird es wachsen.

9. Pflege deine Neugierde. Probiere Dinge, die du noch nie zuvor gemacht hast. Es ist gut für dein Gehirn und deine Seele. Habe keine Angst zu scheitern – es macht den Erfolg nur umso süßer.

10. Alle Menschen sind unterschiedlich. Produkte sollten es auch sein. Alles kann verbessert oder individuell angepasst werden.

11. Die Lebensdauer eines Produktes ist eine Entscheidung, keine Eigenschaft. Kunststoffe sind nicht böse, aber wir setzen sie falsch ein. Behandele sie mit Respekt.

12. Lass andere an deinen Idee, deinem Enthusiasmus und deinen Fähigkeiten teilhaben. Wenn du die Freude am Reparieren entdeckt hast, gib sie weiter. Es ist ein Talent.

Von den Erfindern von sugru.
Inspiriert durch das Manifest von Platform 21, ifixit, Holstee und den Cult of Done.

Why do I blog this? Weil das Reparieren eine der schönsten Tätigkeiten ist die man so machen kann. Am Ende steht ein wieder funktionierendes Ding, das einem das Leben leichter macht. Außerdem übt es einen darin die Dinge zu verstehen. Leider werden immer mehr Produkte hergestellt, bei denen es das Hauptdesignziel ist, dem Kunden das Reparieren so schwer wie nur irgend möglich zu machen. Denn wir sollen alles was wir kaufen möglichst schnell wegwerfen, damit wir was Neues brauchen. Oft werden Dinge sogar aktiv kaputt gemacht vom Hersteller z.B. bei dem Einbau von Elektrolyt-Kondensatoren in TV-Geräten, die ganz gezielt an Stellen untergebracht werden an denen sie Wärmeemission ausgesetzt werden, um kaputt zu gehen. Es lohnt sich zu also wissen, wie man diese Elko’s selber austauschen und reparieren kann.

Smartphone-Do-it-yourself (DIY) Buchscanner

Ich wollte heute einem Freund helfen. Der brauchte unbedingt Info aus einem Buch, das ich hier habe. Paar Seiten daraus. Problem ich kann sie ihm nicht gedruckt vorbeibringen, dafür ist er zu weit weg also muss das digital sein. Weiteres Problem, es sind mehr als nur paar Seiten, so etwa 30-40 Seiten.

Also hab ich mir überlegt, wie machste das am einfachsten? Und hab mir kurzerhand einen LoTec-DIY-Buchscanner gebaut.

LoTec DIY-Buchscanner: Aufbau Gesamtansicht

scanner_perspective_550

LoTec DIY-Buchscanner: Pre-Processing

Man nehme & tue:

  1. Eine flache Pappkiste, die einen Deckel hat der an einer Seite hochklappbar ist (ich hatte so eine Kiste rumliegen, in der ich mal so Werbeflyer-Demomaterial bestellt hatte)
  2. Die Pappkiste stelle man neben eine größere Kiste (ein Laserdrucker tut es auch)
  3. In die Pappkiste legt man einen oder 2 leere Aktenordner (die bilden genau den richtigen Winkel wenn man die mit der dicken Seite nach außen reinlegt)
  4. Dann braucht man einen Abstandhalter, der zwischen das auf die Pappkistenschräge aufgelegte Dokument kommt und die Wand des großen Pappkartons bzw. Laserdruckers (ich hab dafür zwei iPhones genommen die beide eine Antirutsch-Gummihülle hatten, so verschiebt sich der Abstandhalter nicht und iPhones liegen bei mir natürlicherweise überall rum)
  5. Dann nimmt man ein Billigstativ/Dreibein und spannt da das iPhone #3 ein (ich hab so ein Stativ mal kostenlos mit einem USB-Mikroskop bekommen. Das Ding is billig und kann auch fast nix.)
  6. Dann richtet man das Dreibein mit Phone und die Abstandhalter für das Dokument so aus, dass das Dokument ohne große Verzerrung im Display des Phone zu sehen ist.
  7. Dann zoomt man in mit der Kamera des Phone so rein, dass alles Sreenfüllend drauf ist.
  8. Jetzt den Autofocus fokussieren lassen und dann Finger im Autofocusbreich paar Sekunden ruhen lassen, bis die AF-Sperre (Autofocussperre) aktiv wird. Das stellt auch gleichzeitig Belichtungsschwankungen ab zwischen dem Umblättern.
  9. Letzter Schritt: Dokument aufschlagen und entsprechend lagern und jedes Mal ein Bild machen.

Das Ergebnis sieht dann ungefähr so aus… (Ich hab 2 Seiten mal als Beispiel zusammenmontiert mit GFX-Bearbeitung)


diy_scanner_result_550

LoTec DIY-Buchscanner: Post-Processing

Man bearbeite nach (Mac):

  1. Die Bilder vom iPhone mit der App „Digitale Bilder“ überspielen
  2. Bilder falls nötig in der „Vorschau“ App drehen (CMD-R drücken für rechts drehen)
  3. Bilder in richtige Reihenfolge ziehen links in der Miniaturenübersicht
  4. Bilder alle auswählen in der Miniaturenübersicht
  5. Auf Drucken gehen im Menu
  6. Drucken/Speichern als PDF wählen
  7. Das PDF nochmal durch PDFCompress schicken
  8. Fertig ist das PDF Dokument

Ergebnis: PDF-HD, PDF-compressed

LoTec DIY-Buchscanner: Aufbau Draufsicht

scanner_top_550

Why do I blog this? Manchmal sind Lösungen so schön LoTec dass ich sie liebe. Kein großes Geraffel aber funzt. Das hat Spaß gemacht da eine Lösung zu suchen und zu finden. Und hätte ich icht vorher schonmal das ein Buchscanner in Paris auf dem 30c3 gesehen, wäre ich nicht drauf gekommen.