Dr0ptp4kt has submitted this change and it was merged.

Change subject: Add text progress to migration Move migration to background 
thread / context Hold reference to schema convertor
......................................................................


Add text progress to migration
Move migration to background thread / context
Hold reference to schema convertor

Change-Id: I1297bb95e943749a28a99ba7488bd8d35acaf901
---
M OldDataSchema/Data/ArticleDataContextSingleton.h
M OldDataSchema/Data/ArticleDataContextSingleton.m
M Wikipedia.xcodeproj/project.pbxproj
M WikipediaUnitTests/OldDataSchemaMigratorTests.m
M wikipedia/Data/OldDataSchemaMigrator.h
M wikipedia/Data/OldDataSchemaMigrator.m
M wikipedia/View Controllers/DataMigration/DataMigrationProgressViewController.m
M wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.xib
M wikipedia/ca.lproj/Localizable.strings
M wikipedia/de.lproj/Localizable.strings
M wikipedia/en.lproj/Localizable.strings
M wikipedia/es.lproj/Localizable.strings
M wikipedia/fi.lproj/Localizable.strings
M wikipedia/fr.lproj/Localizable.strings
M wikipedia/he.lproj/Localizable.strings
M wikipedia/id.lproj/Localizable.strings
M wikipedia/it.lproj/Localizable.strings
M wikipedia/ja.lproj/Localizable.strings
M wikipedia/ko.lproj/Localizable.strings
M wikipedia/lb.lproj/Localizable.strings
M wikipedia/mk.lproj/Localizable.strings
M wikipedia/ms.lproj/Localizable.strings
M wikipedia/nl.lproj/Localizable.strings
M wikipedia/pt-br.lproj/Localizable.strings
M wikipedia/pt.lproj/Localizable.strings
M wikipedia/qqq.lproj/Localizable.strings
M wikipedia/ro.lproj/Localizable.strings
M wikipedia/ru.lproj/Localizable.strings
M wikipedia/sv.lproj/Localizable.strings
M wikipedia/tr.lproj/Localizable.strings
M wikipedia/vi.lproj/Localizable.strings
M wikipedia/zh-hans.lproj/Localizable.strings
32 files changed, 311 insertions(+), 213 deletions(-)

Approvals:
  Dr0ptp4kt: Looks good to me, approved
  Mhurd: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/OldDataSchema/Data/ArticleDataContextSingleton.h 
b/OldDataSchema/Data/ArticleDataContextSingleton.h
index ef7f512..1f188ce 100644
--- a/OldDataSchema/Data/ArticleDataContextSingleton.h
+++ b/OldDataSchema/Data/ArticleDataContextSingleton.h
@@ -5,9 +5,13 @@
 
 @interface ArticleDataContextSingleton : NSObject
 
++ (ArticleDataContextSingleton *)sharedInstance;
+
 @property (nonatomic, retain) NSManagedObjectContext *mainContext;
 
-+ (ArticleDataContextSingleton *)sharedInstance;
+- (NSManagedObjectContext*)backgroundContext;
+
+- (void)saveContextAndPropagateChangesToStore:(NSManagedObjectContext*)context 
completionBlock:(void(^)(NSError* error))completionBlock;
 
 - (id)createArticleDataModel:(Class)modelClass;
 
diff --git a/OldDataSchema/Data/ArticleDataContextSingleton.m 
b/OldDataSchema/Data/ArticleDataContextSingleton.m
index 697aca0..812f948 100644
--- a/OldDataSchema/Data/ArticleDataContextSingleton.m
+++ b/OldDataSchema/Data/ArticleDataContextSingleton.m
@@ -80,6 +80,15 @@
     self.masterContext.persistentStoreCoordinator = persistentStoreCoordinator;
 }
 
+- (NSManagedObjectContext*)backgroundContext{
+    
+    NSManagedObjectContext* newContext = [[NSManagedObjectContext alloc] 
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
+    newContext.parentContext = self.masterContext;
+
+    return newContext;
+}
+
+
 - (NSString *)documentRootPath
 {
     NSArray* documentPaths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
@@ -87,7 +96,36 @@
     return documentRootPath;
 }
 
+- (void)saveContextAndPropagateChangesToStore:(NSManagedObjectContext*)context 
completionBlock:(void(^)(NSError* error))completionBlock{
+    
+    [context performBlock:^{
+        
+        __block NSError* errorToSend = nil;
+        
+        NSError* error = nil;
+        if([context save:&error]){
+            [self.masterContext performBlock:^{
+                NSError *masterError = nil;
+                if (![self.masterContext save:&masterError]) {
+                    errorToSend = masterError;
+                }
+            }];
+        }else{
+            errorToSend = error;
+        }
+
+        if(completionBlock){
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                completionBlock(errorToSend);
+            });
+        }
+    }];
+}
+
+
 - (void)propagateMainSavesToMaster{
+    
     [self.masterContext performBlock:^{
         NSError *masterError = nil;
         if (![self.masterContext save:&masterError]) {
diff --git a/Wikipedia.xcodeproj/project.pbxproj 
b/Wikipedia.xcodeproj/project.pbxproj
index 891d779..b3dbec8 100644
--- a/Wikipedia.xcodeproj/project.pbxproj
+++ b/Wikipedia.xcodeproj/project.pbxproj
@@ -744,9 +744,6 @@
                08D631F91A69B8CD00D87AD0 /* WMFImageGalleryCollectionViewCell.m 
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; name = WMFImageGalleryCollectionViewCell.m; path = "Image 
Gallery/WMFImageGalleryCollectionViewCell.m"; sourceTree = "<group>"; };
                0EA4402C1AA6281200B09DBA /* NSDateFormatter+WMFExtensions.h */ 
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.h; name = "NSDateFormatter+WMFExtensions.h"; path = 
"Wikipedia/Categories/NSDateFormatter+WMFExtensions.h"; sourceTree = 
SOURCE_ROOT; };
                0EA4402D1AA6281200B09DBA /* NSDateFormatter+WMFExtensions.m */ 
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; name = "NSDateFormatter+WMFExtensions.m"; path = 
"Wikipedia/Categories/NSDateFormatter+WMFExtensions.m"; sourceTree = 
SOURCE_ROOT; };
-               0ED01D611AC1DD3200B6947B /* OldDataSchemaMigrator.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
OldDataSchemaMigrator.h; sourceTree = "<group>"; };
-               0ED01D621AC1DD3200B6947B /* OldDataSchemaMigrator.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= OldDataSchemaMigrator.m; sourceTree = "<group>"; };
-               0ED01D631AC1DD3200B6947B /* OldDataSchemaMigrator_Private.h */ 
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.h; path = OldDataSchemaMigrator_Private.h; sourceTree = "<group>"; 
};
                17A2F22335C5256576CEDBDD /* 
Pods-WikipediaUnitTests.release.xcconfig */ = {isa = PBXFileReference; 
includeInIndex = 1; lastKnownFileType = text.xcconfig; name = 
"Pods-WikipediaUnitTests.release.xcconfig"; path = "Pods/Target Support 
Files/Pods-WikipediaUnitTests/Pods-WikipediaUnitTests.release.xcconfig"; 
sourceTree = "<group>"; };
                357504E50DA104E39C6ACFEB /* Pods.release.xcconfig */ = {isa = 
PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = 
Pods.release.xcconfig; path = "Pods/Target Support 
Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
                8CE61C6963F825760822A28A /* libPods-WikipediaUnitTests.a */ = 
{isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; 
path = "libPods-WikipediaUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -2033,17 +2030,6 @@
                        name = "Image Gallery";
                        sourceTree = "<group>";
                };
-               0ED01D601AC1DD3200B6947B /* OldDataSchemaMigrator */ = {
-                       isa = PBXGroup;
-                       children = (
-                               0ED01D611AC1DD3200B6947B /* 
OldDataSchemaMigrator.h */,
-                               0ED01D621AC1DD3200B6947B /* 
OldDataSchemaMigrator.m */,
-                               0ED01D631AC1DD3200B6947B /* 
OldDataSchemaMigrator_Private.h */,
-                       );
-                       name = OldDataSchemaMigrator;
-                       path = OldDataSchema/OldDataSchema;
-                       sourceTree = SOURCE_ROOT;
-               };
                BC8309941A7BF935003FC5C7 /* WikipediaUnitTests */ = {
                        isa = PBXGroup;
                        children = (
@@ -2406,7 +2392,6 @@
                                D4EE00BB182445670090790F /* mw-support */,
                                C9180EC118AED30C006C1DCA /* mw-utils */,
                                049566BF18F5F4CB0058EA12 /* Zero */,
-                               0ED01D601AC1DD3200B6947B /* 
OldDataSchemaMigrator */,
                        );
                        name = Wikipedia;
                        path = wikipedia;
diff --git a/WikipediaUnitTests/OldDataSchemaMigratorTests.m 
b/WikipediaUnitTests/OldDataSchemaMigratorTests.m
index c58f861..a1be3b1 100644
--- a/WikipediaUnitTests/OldDataSchemaMigratorTests.m
+++ b/WikipediaUnitTests/OldDataSchemaMigratorTests.m
@@ -172,12 +172,8 @@
 
 - (void)verifyArticleSectionAndLeadImages:(MWKArticle*)migratedArticle 
correspondsToOldArticle:(Article*)oldArticle {
     NSArray* oldArticleImages = [oldArticle allImages];
-
-    // if the article has a thumbnail, it will be the first element, followed 
by the images from each section
     NSUInteger const thumbnailModifier = oldArticle.thumbnailImage ? 1 : 0;
-
-    assertThat(@(migratedArticle.images.count), is(@(oldArticleImages.count + 
thumbnailModifier)));
-
+    assertThat(@(migratedArticle.images.count), 
is(equalToInt(oldArticleImages.count + thumbnailModifier)));
     for (NSUInteger i = thumbnailModifier; i < oldArticleImages.count; i++) {
         Image* oldImage         = oldArticleImages[i];
         MWKImage* migratedImage = migratedArticle.images[i + 
thumbnailModifier];
diff --git a/wikipedia/Data/OldDataSchemaMigrator.h 
b/wikipedia/Data/OldDataSchemaMigrator.h
index 2c51954..626fceb 100644
--- a/wikipedia/Data/OldDataSchemaMigrator.h
+++ b/wikipedia/Data/OldDataSchemaMigrator.h
@@ -25,13 +25,29 @@
 
 @end
 
+@protocol OldDataSchemaMigratorProgressDelegate <NSObject>
+
+-(void)oldDataSchema:(OldDataSchemaMigrator *)schema 
didUpdateProgressWithArticlesCompleted:(NSUInteger)completed 
total:(NSUInteger)total;
+
+-(void)oldDataSchemaDidFinishMigration:(OldDataSchemaMigrator *)schema;
+
+-(void)oldDataSchema:(OldDataSchemaMigrator *)schema 
didFinishWithError:(NSError*)error;
+
+@end
+
+
 
 @interface OldDataSchemaMigrator : NSObject
 
 @property (weak) id<OldDataSchemaDelegate> delegate;
+@property (weak) id<OldDataSchemaMigratorProgressDelegate> progressDelegate;
 
-- (BOOL)exists;
-- (void)migrateData;
-- (void)removeOldData;
+-(BOOL)exists;
+
+/**
+ *  This runs asynchronously. 
+ *  Use the progress delegate methods to get notifified when the migration 
completes.
+ */
+-(void)migrateData;
 
 @end
diff --git a/wikipedia/Data/OldDataSchemaMigrator.m 
b/wikipedia/Data/OldDataSchemaMigrator.m
index 22c2e0b..73e9db9 100644
--- a/wikipedia/Data/OldDataSchemaMigrator.m
+++ b/wikipedia/Data/OldDataSchemaMigrator.m
@@ -13,40 +13,48 @@
 #import "NSManagedObjectContext+SimpleFetch.h"
 #import "Article+ConvenienceAccessors.h"
 
-@implementation OldDataSchemaMigrator {
-    ArticleDataContextSingleton* context;
-    NSMutableSet* savedTitles;
-}
+@interface OldDataSchemaMigrator ()
 
-- (instancetype)init {
+@property (nonatomic, strong) ArticleDataContextSingleton *context;
+@property (nonatomic, strong) NSMutableSet *savedTitles;
+
+@end
+
+@implementation OldDataSchemaMigrator
+
+-(instancetype)init
+{
     self = [super init];
     if (self) {
-        savedTitles = [[NSMutableSet alloc] init];
+        _savedTitles = [[NSMutableSet alloc] init];
         if (self.exists) {
-            context = [ArticleDataContextSingleton sharedInstance];
+            _context = [ArticleDataContextSingleton sharedInstance];
         } else {
-            context = nil;
+            _context = nil;
         }
     }
     return self;
 }
 
-- (NSString*)sqlitePath {
-    NSArray* documentPaths     = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-    NSString* documentRootPath = [documentPaths objectAtIndex:0];
-    NSString* filePath         = [documentRootPath 
stringByAppendingPathComponent:@"articleData6.sqlite"];
+-(NSString *)sqlitePath
+{
+    NSArray *documentPaths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *documentRootPath = [documentPaths objectAtIndex:0];
+    NSString *filePath = [documentRootPath 
stringByAppendingPathComponent:@"articleData6.sqlite"];
     return filePath;
 }
 
-- (BOOL)exists {
-    NSString* filePath = [self sqlitePath];
+-(BOOL)exists
+{
+    NSString *filePath = [self sqlitePath];
     return [[NSFileManager defaultManager] fileExistsAtPath:filePath];
 }
 
-- (void)removeOldData {
-    NSString* filePath   = [self sqlitePath];
-    NSString* backupPath = [filePath stringByAppendingString:@".bak"];
-    NSError* err         = nil;
+-(void)removeOldData
+{
+    NSString *filePath = [self sqlitePath];
+    NSString *backupPath = [filePath stringByAppendingString:@".bak"];
+    NSError *err = nil;
     [[NSFileManager defaultManager] moveItemAtPath:filePath
                                             toPath:backupPath
                                              error:&err];
@@ -55,35 +63,69 @@
     }
 }
 
-- (void)migrateData {
+-(void)migrateData
+{
     // TODO
     // 1) Go through saved article list, saving entries and (articles and 
images)
     // 2) Go through page reading history, saving entries and (articles and 
images) when not already transferred
+        
+    NSManagedObjectContext* context = [self.context backgroundContext];
+    
+    [context performBlock:^{
+        
+        NSFetchRequest *req = [NSFetchRequest 
fetchRequestWithEntityName:@"Saved"];
+        req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@"dateSaved" ascending:YES]];
+        NSError *err;
+        NSArray *savedEntries = [context executeFetchRequest:req error:&err];
+        
+        if (err) {
+            NSLog(@"Error reading old Saved entries: %@", err);
+        }
+        
+        NSFetchRequest *req2 = [NSFetchRequest 
fetchRequestWithEntityName:@"History"];
+        req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@"dateVisited" ascending:YES]];
+        NSError *err2;
+        NSArray *historyEntries = [context executeFetchRequest:req2 
error:&err2];
+        
+        if (err2) {
+            NSLog(@"Error reading old History entries: %@", err2);
+        }
+        
+        NSUInteger totalArticlesToMigrate = [savedEntries count] + 
[historyEntries count];
+        __block NSUInteger numberOfArticlesMigrated = 0;
+        
+        void (^incrementAndNotify)(void) = ^void(void) {
+            
+            numberOfArticlesMigrated++;
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [self.progressDelegate oldDataSchema:self 
didUpdateProgressWithArticlesCompleted:numberOfArticlesMigrated 
total:totalArticlesToMigrate];
+            });
+        };
+        
+        for (Saved *saved in savedEntries) {
+            [self migrateSaved:saved];
+            [self migrateArticle:saved.article];
+            incrementAndNotify();
+        }
+        
+        for (History *history in historyEntries) {
+            [self migrateHistory:history];
+            incrementAndNotify();
+        }
+        
+        [self.context saveContextAndPropagateChangesToStore:context 
completionBlock:^(NSError *error) {
+           
+            [self removeOldData];
 
-    NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@"Saved"];
-    req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@"dateSaved" 
ascending:YES]];
-    NSError* err;
-    NSArray* savedEntries = [context.mainContext executeFetchRequest:req 
error:&err];
-    if (err) {
-        NSLog(@"Error reading old Saved entries: %@", err);
-    }
-    for (Saved* saved in savedEntries) {
-        [self migrateSaved:saved];
-        [self migrateArticle:saved.article];
-    }
-
-    NSFetchRequest* req2 = [NSFetchRequest 
fetchRequestWithEntityName:@"History"];
-    req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@"dateVisited" ascending:YES]];
-    NSError* err2;
-    NSArray* historyEntries = [context.mainContext executeFetchRequest:req2 
error:&err2];
-    if (err2) {
-        NSLog(@"Error reading old History entries: %@", err2);
-    }
-    for (History* history in historyEntries) {
-        [self migrateHistory:history];
-        [self migrateArticle:history.article];
-    }
-}
+            if(error){
+                [self.progressDelegate oldDataSchema:self 
didFinishWithError:error];
+            }else{
+                [self.progressDelegate oldDataSchemaDidFinishMigration:self];
+            }
+        }];
+    }];
+    
+   }
 
 - (MWKSite*)migrateArticleSite:(Article*)article {
     return [[MWKSite alloc] initWithDomain:@"wikipedia.org" 
language:article.domain];
@@ -93,43 +135,41 @@
     return [[self migrateArticleSite:article] titleWithString:article.title];
 }
 
-- (void)migrateSaved:(Saved*)saved {
-    NSDictionary* dict = [self exportSaved:saved];
+-(void)migrateSaved:(Saved *)saved
+{
+    NSDictionary *dict = [self exportSaved:saved];
     [self.delegate oldDataSchema:self migrateSavedEntry:dict];
 }
 
-- (void)migrateHistory:(History*)history {
-    NSDictionary* dict = [self exportHistory:history];
+-(void)migrateHistory:(History *)history
+{
+    NSDictionary *dict = [self exportHistory:history];
     [self.delegate oldDataSchema:self migrateHistoryEntry:dict];
 }
 
-- (void)migrateArticle:(Article*)article {
-    NSString* key = [NSString stringWithFormat:@"%@:%@", article.domain, 
article.title];
-    if ([savedTitles containsObject:key]) {
+-(void)migrateArticle:(Article *)article
+{
+    NSString *key = [NSString stringWithFormat:@"%@:%@", article.domain, 
article.title];
+    if ([self.savedTitles containsObject:key]) {
         // already imported this article
     } else {
         // Record for later to avoid dupe imports
-        [savedTitles addObject:key];
+        [self.savedTitles addObject:key];
 
         MWKArticle* migratedArticle = [self.delegate oldDataSchema:self 
migrateArticle:[self exportArticle:article]];
 
-        Image* thumbnail = article.thumbnailImage;
+        Image *thumbnail = article.thumbnailImage;
         if (thumbnail) {
             [self migrateThumbnailImage:thumbnail article:article 
newArticle:migratedArticle];
         }
         // HACK: setting thumbnailURL after migration prevents it from being 
added to the image list twice
         migratedArticle.thumbnailURL = thumbnail.sourceUrl;
 
-        for (Section* section in [article sectionsBySectionId]) {
-            for (SectionImage* sectionImage in [section sectionImagesByIndex]) 
{
+        for (Section *section in [article sectionsBySectionId]) {
+            for (SectionImage *sectionImage in [section sectionImagesByIndex]) 
{
                 [self migrateImage:sectionImage newArticle:migratedArticle];
             }
         }
-
-        NSAssert(!thumbnail
-                 || [[migratedArticle.images imageURLAtIndex:0] 
isEqualToString:thumbnail.sourceUrl],
-                 @"Thumbnail was present, but it wasn't first in the article's 
image list: %@",
-                 [migratedArticle.images dataExport]);
 
         // set the lead image to the first non-thumb image
         if ([migratedArticle.images count]) {
@@ -147,39 +187,44 @@
     }
 }
 
-- (void)migrateThumbnailImage:(Image*)thumbnailImage article:(Article*)article 
newArticle:(MWKArticle*)newArticle {
-    NSDictionary* dict = [self exportThumbnailImage:thumbnailImage 
article:article];
+-(void)migrateThumbnailImage:(Image *)thumbnailImage article:(Article 
*)article newArticle:(MWKArticle *)newArticle
+{
+    NSDictionary *dict = [self exportThumbnailImage:thumbnailImage 
article:article];
     [self.delegate oldDataSchema:self migrateImage:dict newArticle:newArticle];
 }
 
-- (void)migrateImage:(SectionImage*)sectionImage 
newArticle:(MWKArticle*)newArticle {
-    NSDictionary* dict = [self exportImage:sectionImage];
+-(void)migrateImage:(SectionImage *)sectionImage newArticle:(MWKArticle 
*)newArticle
+{
+    NSDictionary *dict = [self exportImage:sectionImage];
     [self.delegate oldDataSchema:self migrateImage:dict newArticle:newArticle];
 }
 
-- (NSDictionary*)exportSaved:(Saved*)saved {
+-(NSDictionary *)exportSaved:(Saved *)saved
+{
     return @{
-               @"domain": @"wikipedia.org",
-               @"language": saved.article.domain,
-               @"title": saved.article.title,
-               @"date": [[NSDateFormatter wmf_iso8601Formatter] 
stringFromDate:saved.dateSaved]
-    };
+             @"domain": @"wikipedia.org",
+             @"language": saved.article.domain,
+             @"title": saved.article.title,
+             @"date": [[NSDateFormatter wmf_iso8601Formatter] 
stringFromDate:saved.dateSaved]
+             };
 }
 
-- (NSDictionary*)exportHistory:(History*)history {
+-(NSDictionary *)exportHistory:(History *)history
+{
     return @{
-               @"domain": @"wikipedia.org",
-               @"language": history.article.domain,
-               @"title": history.article.title,
-               @"date": [[NSDateFormatter wmf_iso8601Formatter] 
stringFromDate:history.dateVisited],
-               @"discoveryMethod": history.discoveryMethod,
-               @"scrollPosition": history.article.lastScrollY
-    };
+             @"domain": @"wikipedia.org",
+             @"language": history.article.domain,
+             @"title": history.article.title,
+             @"date": [[NSDateFormatter wmf_iso8601Formatter] 
stringFromDate:history.dateVisited],
+             @"discoveryMethod": history.discoveryMethod,
+             @"scrollPosition": history.article.lastScrollY
+             };
 }
 
-- (NSDictionary*)exportArticle:(Article*)article {
+-(NSDictionary *)exportArticle:(Article *)article
+{
     NSParameterAssert(article);
-    NSMutableDictionary* dict = [@{} mutableCopy];
+    NSMutableDictionary *dict = [@{} mutableCopy];
 
     if (article.redirected) {
         dict[@"redirected"] = article.redirected;
@@ -189,9 +234,9 @@
     }
     if (article.lastmodifiedby) {
         dict[@"lastmodifiedby"] = @{
-            @"name": article.lastmodifiedby,
-            @"gender": @"unknown"
-        };
+                                    @"name": article.lastmodifiedby,
+                                    @"gender": @"unknown"
+                                    };
     }
     if (article.articleId) {
         dict[@"id"] = article.articleId;
@@ -204,8 +249,8 @@
     }
     if (article.protectionStatus) {
         dict[@"protection"] = @{
-            @"edit": article.protectionStatus
-        };
+                                @"edit": article.protectionStatus
+                                };
     }
     if (article.editable) {
         dict[@"editable"] = @"";
@@ -218,22 +263,23 @@
         for (int i = 0; i < numSections; i++) {
             dict[@"sections"][i] = [NSNull null]; // stub out
         }
-        for (Section* section in article.section) {
+        for (Section *section in article.section) {
             int sectionId = [section.sectionId intValue];
             dict[@"sections"][sectionId] = [self exportSection:section];
         }
     }
 
     return @{
-               @"language": article.domain,
-               @"title": article.title,
-               @"dict": dict
-    };
+             @"language": article.domain,
+             @"title": article.title,
+             @"dict": dict
+             };
 }
 
-- (NSDictionary*)exportSection:(Section*)section {
+-(NSDictionary *)exportSection:(Section *)section
+{
     NSParameterAssert(section);
-    NSMutableDictionary* dict = [@{} mutableCopy];
+    NSMutableDictionary *dict = [@{} mutableCopy];
 
     if (section.tocLevel) {
         dict[@"toclevel"] = section.tocLevel;
@@ -258,16 +304,17 @@
     return dict;
 }
 
-- (NSDictionary*)exportThumbnailImage:(Image*)image article:(Article*)article {
+-(NSDictionary *)exportThumbnailImage:(Image *)image article:(Article *)article
+{
     NSParameterAssert(image);
     NSParameterAssert(article);
-    ImageData* imageData = image.imageData;
+    ImageData *imageData = image.imageData;
 
-    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
+    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
 
-    dict[@"domain"]   = @"wikipedia.org";
+    dict[@"domain"] = @"wikipedia.org";
     dict[@"language"] = article.domain;
-    dict[@"title"]    = article.title;
+    dict[@"title"] = article.title;
 
     dict[@"sectionId"] = @(-1);
 
@@ -279,18 +326,19 @@
     return dict;
 }
 
-- (NSDictionary*)exportImage:(SectionImage*)sectionImage {
+-(NSDictionary *)exportImage:(SectionImage *)sectionImage
+{
     NSParameterAssert(sectionImage);
-    Section* section     = sectionImage.section;
-    Article* article     = section.article;
-    Image* image         = sectionImage.image;
-    ImageData* imageData = image.imageData;
+    Section *section = sectionImage.section;
+    Article *article = section.article;
+    Image *image = sectionImage.image;
+    ImageData *imageData = image.imageData;
 
-    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
+    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
 
-    dict[@"domain"]   = @"wikipedia.org";
+    dict[@"domain"] = @"wikipedia.org";
     dict[@"language"] = article.domain;
-    dict[@"title"]    = article.title;
+    dict[@"title"] = article.title;
 
     dict[@"sectionId"] = section.sectionId;
 
diff --git a/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.m 
b/wikipedia/View Controllers/DataMigration/DataMigrationProgressViewController.m
index 5294ed1..7312b9d 100644
--- a/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.m
+++ b/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.m
@@ -23,24 +23,21 @@
     BUTTON_INDEX_SUBMIT  = 1
 } MigrationButtonIndexIds;
 
-@interface DataMigrationProgressViewController ()
+@interface DataMigrationProgressViewController 
()<OldDataSchemaMigratorProgressDelegate>
 
-@property (readonly) OldDataSchemaMigrator* oldDataSchema;
-@property (readonly) DataMigrator* dataMigrator;
+@property (nonatomic, strong) SchemaConverter* schemaConvertor;
+@property (nonatomic, strong) OldDataSchemaMigrator* oldDataSchema;
+@property (nonatomic, strong) DataMigrator* dataMigrator;
 
 @end
 
-@implementation DataMigrationProgressViewController {
-    OldDataSchemaMigrator* _oldDataSchema;
-    DataMigrator* _dataMigrator;
-}
-
+@implementation DataMigrationProgressViewController
 
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
 
-    self.progressLabel.text = MWLocalizedString(@"update-progress-label", nil);
+    self.progressLabel.text = 
MWLocalizedString(@"migration-update-progress-label", nil);
 }
 
 - (void)didReceiveMemoryWarning {
@@ -51,7 +48,14 @@
 - (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
 
-    [self asyncMigration];
+    if([self.oldDataSchema exists]){
+        
+        [self runNewMigration];
+        
+    }else if ([self.dataMigrator hasData]){
+        
+        [self runOldMigration];
+    }
 }
 
 - (OldDataSchemaMigrator*)oldDataSchema {
@@ -68,68 +72,71 @@
     return _dataMigrator;
 }
 
+- (SchemaConverter*)schemaConvertor{
+    if(!_schemaConvertor){
+        _schemaConvertor = [[SchemaConverter alloc] 
initWithDataStore:[SessionSingleton sharedInstance].dataStore];
+    }
+    return _schemaConvertor;
+}
+
 - (BOOL)needsMigration {
     return [self.oldDataSchema exists] || [self.dataMigrator hasData];
 }
 
-- (void)syncMigration {
+- (void)runNewMigration {
     // Middle-Ages Converter
     // From the native app's initial CoreData-based implementation,
     // which now lives in OldDataSchema subproject.
-    if ([self.oldDataSchema exists]) {
-        SchemaConverter* schemaConverter = [[SchemaConverter alloc] 
initWithDataStore:[SessionSingleton sharedInstance].dataStore];
-        self.oldDataSchema.delegate = schemaConverter;
-        NSLog(@"begin migration");
-        [self.oldDataSchema migrateData];
-        NSLog(@"end migration");
+    self.oldDataSchema.delegate         = self.schemaConvertor;
+    self.oldDataSchema.progressDelegate = self;
+    NSLog(@"begin migration");
+    [self.oldDataSchema migrateData];
+}
 
-        [self.oldDataSchema removeOldData];
-
-        // hack for history fix
-        [[SessionSingleton sharedInstance].userDataStore reset];
-
-        return;
-    }
-
+- (void)runOldMigration {
+    
     // Ye Ancient Converter
     // From the old PhoneGap app
     // @fixme: fix this to work again
-    if ([self.dataMigrator hasData]) {
-        NSLog(@"Old data to migrate found!");
-        NSArray* titles           = [self.dataMigrator extractSavedPages];
-        ArticleImporter* importer = [[ArticleImporter alloc] init];
-
-        for (NSDictionary* item in titles) {
-            NSLog(@"Will import saved page: %@ %@", item[@"lang"], 
item[@"title"]);
-        }
-
-        [importer importArticles:titles];
-
-        [self.dataMigrator removeOldData];
-
-        return;
+    NSLog(@"Old data to migrate found!");
+    NSArray* titles           = [self.dataMigrator extractSavedPages];
+    ArticleImporter* importer = [[ArticleImporter alloc] init];
+    
+    for (NSDictionary* item in titles) {
+        NSLog(@"Will import saved page: %@ %@", item[@"lang"], item[@"title"]);
     }
-
-    NSLog(@"No old data to migrate.");
+    
+    [importer importArticles:titles];
+    
+    [self.dataMigrator removeOldData];
 }
 
-- (void)asyncMigration {
-    __weak DataMigrationProgressViewController* weakSelf = self;
-    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
0), ^() {
-        @try {
-            [weakSelf syncMigration];
-        }@catch (NSException* ex) {
-            NSLog(@"Migration failure: %@", ex);
-            dispatch_async(dispatch_get_main_queue(), ^() {
-                [weakSelf displayErrorCondition];
-            });
-            return;
-        }
+- (void)oldDataSchema:(OldDataSchemaMigrator*)schema 
didUpdateProgressWithArticlesCompleted:(NSUInteger)completed 
total:(NSUInteger)total {
+    NSString* lineOne = MWLocalizedString(@"migration-update-progress-label", 
nil);
 
-        dispatch_async(dispatch_get_main_queue(), ^() {
-            [weakSelf.delegate dataMigrationProgressComplete:weakSelf];
-        });
-    });
+    NSString* lineTwo = 
MWLocalizedString(@"migration-update-progress-count-label", nil);
+
+    lineTwo = [lineTwo stringByReplacingOccurrencesOfString:@"$1" 
withString:[NSString stringWithFormat:@"%lu", (unsigned long)completed]];
+
+    lineTwo = [lineTwo stringByReplacingOccurrencesOfString:@"$2" 
withString:[NSString stringWithFormat:@"%lu", (unsigned long)total]];
+
+    NSString* progressString = [NSString stringWithFormat:@"%@\n%@", lineOne, 
lineTwo];
+
+    self.progressLabel.text = progressString;
+}
+
+
+- (void)oldDataSchemaDidFinishMigration:(OldDataSchemaMigrator *)schema{
+    [[SessionSingleton sharedInstance].userDataStore reset];
+    [self.delegate dataMigrationProgressComplete:self];
+    NSLog(@"end migration");
+}
+
+
+-(void)oldDataSchema:(OldDataSchemaMigrator *)schema 
didFinishWithError:(NSError*)error{
+    [self displayErrorCondition];
+    [self.delegate dataMigrationProgressComplete:self];
+    NSLog(@"end migration");
 }
 
 - (void)displayErrorCondition {
diff --git a/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.xib 
b/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.xib
index c8928cc..0a0dd30 100644
--- a/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.xib
+++ b/wikipedia/View 
Controllers/DataMigration/DataMigrationProgressViewController.xib
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" 
toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" 
propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" 
toolsVersion="6751" systemVersion="14C1510" targetRuntime="iOS.CocoaTouch" 
propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" 
version="6247"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" 
version="6736"/>
     </dependencies>
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" 
userLabel="File's Owner" customClass="DataMigrationProgress">
@@ -20,7 +20,8 @@
                 <activityIndicatorView opaque="NO" contentMode="scaleToFill" 
horizontalHuggingPriority="750" verticalHuggingPriority="750" 
hidesWhenStopped="YES" animating="YES" style="gray" 
translatesAutoresizingMaskIntoConstraints="NO" id="59a-LK-cye">
                     <rect key="frame" x="150" y="274" width="20" height="20"/>
                 </activityIndicatorView>
-                <label opaque="NO" userInteractionEnabled="NO" 
contentMode="left" horizontalHuggingPriority="251" 
verticalHuggingPriority="251" misplaced="YES" text="" 
lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" 
adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" 
id="9Bj-11-8XX">
+                <label opaque="NO" userInteractionEnabled="NO" 
contentMode="left" horizontalHuggingPriority="251" 
verticalHuggingPriority="251" text="3 / 40 Imported" textAlignment="center" 
lineBreakMode="tailTruncation" numberOfLines="0" 
baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" 
translatesAutoresizingMaskIntoConstraints="NO" id="9Bj-11-8XX">
+                    <rect key="frame" x="101" y="233" width="118.5" 
height="20.5"/>
                     <fontDescription key="fontDescription" type="system" 
pointSize="17"/>
                     <color key="textColor" 
cocoaTouchSystemColor="darkTextColor"/>
                     <nil key="highlightedColor"/>
@@ -28,10 +29,10 @@
             </subviews>
             <color key="backgroundColor" white="1" alpha="1" 
colorSpace="custom" customColorSpace="calibratedWhite"/>
             <constraints>
+                <constraint firstItem="59a-LK-cye" firstAttribute="top" 
secondItem="9Bj-11-8XX" secondAttribute="bottom" constant="20" id="6hU-0D-UYa"/>
                 <constraint firstAttribute="centerY" secondItem="59a-LK-cye" 
secondAttribute="centerY" id="N5m-um-eCk"/>
                 <constraint firstAttribute="centerX" secondItem="59a-LK-cye" 
secondAttribute="centerX" id="N9Z-be-UDt"/>
                 <constraint firstAttribute="centerX" secondItem="9Bj-11-8XX" 
secondAttribute="centerX" id="cRM-yQ-ug6"/>
-                <constraint firstItem="9Bj-11-8XX" firstAttribute="top" 
secondItem="59a-LK-cye" secondAttribute="bottom" constant="8" id="rG3-Pf-Ut1"/>
             </constraints>
             <point key="canvasLocation" x="673" y="442"/>
         </view>
diff --git a/wikipedia/ca.lproj/Localizable.strings 
b/wikipedia/ca.lproj/Localizable.strings
index 42d0dc0..2c797e8 100644
--- a/wikipedia/ca.lproj/Localizable.strings
+++ b/wikipedia/ca.lproj/Localizable.strings
@@ -253,7 +253,6 @@
 "nearby-location-updates-settings-menu" = "Privadesa > Serveis d'ubicació > 
Viquipèdia";
 "nearby-location-general-error" = "No es pot determinar la ubicació. 
Arrossegueu per refrescar-la o torneu-ho a provar més endavant.";
 "nearby-wifi" = "Si activeu la Wi-Fi pot ajudar el vostre dispositiu a 
determinar millor la vostra localització.";
-"update-progress-label" = "S'estan actualitzant les dades locals";
 "image-gallery-unknown-owner" = "El carregador no és conegut.";
 "hockeyapp-alert-question" = "Voldríeu enviar un informe de fallada a $1 per 
tal que Wikimedia ho revisi?";
 "hockeyapp-alert-question-with-response-field" = "Voldríeu enviar un informe 
de fallada a $1 per tal que Wikimedia ho revisi? Descriviu què va passar quan 
va produir-se la fallada.";
@@ -262,3 +261,4 @@
 "hockeyapp-alert-always-send" = "Envia sempre";
 "hockeyapp-alert-do-not-send" = "No enviïs";
 "hockeyapp-alert-privacy" = "Privadesa de $1";
+"migration-update-progress-label" = "S'estan actualitzant les dades locals";
diff --git a/wikipedia/de.lproj/Localizable.strings 
b/wikipedia/de.lproj/Localizable.strings
index 09b16b1..2c512e9 100644
--- a/wikipedia/de.lproj/Localizable.strings
+++ b/wikipedia/de.lproj/Localizable.strings
@@ -247,7 +247,7 @@
 "nearby-location-updates-settings-menu" = "Datenschutz > Ortungsdienste > 
Wikipedia";
 "nearby-location-general-error" = "Standort konnte nicht bestimmt werden. Zum 
Aktualisieren ziehen oder später erneut versuchen.";
 "nearby-wifi" = "Das Aktivieren von Wi-Fi kann dabei helfen, den Standort 
deines Gerätes besser zu bestimmen.";
-"update-progress-label" = "Aktualisiere lokale Daten";
+"migration-update-progress-label" = "Aktualisiere lokale Daten";
 "image-gallery-unknown-owner" = "Hochlader unbekannt.";
 "hockeyapp-alert-question" = "Möchtest du einen Absturzbericht an $1 senden, 
so dass Wikimedia deinen Absturz überprüfen kann?";
 "hockeyapp-alert-question-with-response-field" = "Möchtest du einen 
Absturzbericht an $1 senden, so dass Wikimedia deinen Absturz überprüfen kann? 
Bitte beschreibe, was passiert ist, als der Absturz aufgetreten ist:";
diff --git a/wikipedia/en.lproj/Localizable.strings 
b/wikipedia/en.lproj/Localizable.strings
index e54416f..5230a09 100644
--- a/wikipedia/en.lproj/Localizable.strings
+++ b/wikipedia/en.lproj/Localizable.strings
@@ -280,7 +280,9 @@
 "nearby-location-general-error" = "Unable to determine location. Pull to 
refresh or try again later.";
 "nearby-wifi" = "Enabling Wi-Fi can help your device better determine your 
location.";
 
-"update-progress-label" = "Upgrading local data";
+"migration-update-progress-label" = "Upgrading local data";
+"migration-update-progress-count-label" = "Migrating Article $1 of $2";
+
 
 "image-gallery-unknown-owner" = "Uploader unknown.";
 
diff --git a/wikipedia/es.lproj/Localizable.strings 
b/wikipedia/es.lproj/Localizable.strings
index 2417646..c562107 100644
--- a/wikipedia/es.lproj/Localizable.strings
+++ b/wikipedia/es.lproj/Localizable.strings
@@ -253,11 +253,11 @@
 "nearby-location-updates-settings-menu" = "Privacidad > Servicios de 
localización > Wikipedia";
 "nearby-location-general-error" = "No se puede determinar la ubicación. Tira 
para actualizar o inténtalo más tarde.";
 "nearby-wifi" = "Activar wifi puede ayudar a que tu dispositivo determine 
mejor tu ubicación.";
-"update-progress-label" = "Actualización de datos locales";
 "image-gallery-unknown-owner" = "Cargador desconocido.";
 "hockeyapp-alert-question" = "¿Te gustaría enviar un informe a $1 para que 
Wikimedia pueda revisar tu fallo?";
 "hockeyapp-alert-question-with-response-field" = "¿Te gustaría enviar un 
informe a $1 para que Wikimedia pueda revisar tu fallo? Describe lo que pasó en 
el momento del fallo:";
 "hockeyapp-alert-title" = "La aplicación falló la última vez";
+"migration-update-progress-label" = "Actualización de datos locales";
 "hockeyapp-alert-send-report" = "Enviar informe";
 "hockeyapp-alert-always-send" = "Enviar siempre";
 "hockeyapp-alert-do-not-send" = "No enviar";
diff --git a/wikipedia/fi.lproj/Localizable.strings 
b/wikipedia/fi.lproj/Localizable.strings
index fc84ffb..7f10bbc 100644
--- a/wikipedia/fi.lproj/Localizable.strings
+++ b/wikipedia/fi.lproj/Localizable.strings
@@ -249,6 +249,6 @@
 "nearby-location-updates-settings-menu" = "Yksityisyys > Sijaintipalvelut > 
Wikipedia";
 "nearby-location-general-error" = "Sijainnin määritys ei onnistu. Vedä 
päivittääksesi tai yritä uudelleen myöhemmin.";
 "nearby-wifi" = "Langattoman verkkoyhteyden käyttöönotto voi auttaa laitettasi 
määrittämään sijaintisi paremmin.";
-"update-progress-label" = "Päivitetään paikallisia tietoja";
 "hockeyapp-alert-always-send" = "Lähetä aina";
 "hockeyapp-alert-do-not-send" = "Älä lähetä";
+"migration-update-progress-label" = "Päivitetään paikallisia tietoja";
diff --git a/wikipedia/fr.lproj/Localizable.strings 
b/wikipedia/fr.lproj/Localizable.strings
index 58f2935..acbd21a 100644
--- a/wikipedia/fr.lproj/Localizable.strings
+++ b/wikipedia/fr.lproj/Localizable.strings
@@ -254,7 +254,7 @@
 "nearby-location-updates-settings-menu" = "Confidentialité > Services 
d’emplacement > Wikipédia";
 "nearby-location-general-error" = "Impossible de déterminer l’emplacement. 
Tirer pour rafraîchir ou réessayer ultérieurement.";
 "nearby-wifi" = "L’activation du wifi peut aider votre appareil à mieux 
déterminer votre emplacement.";
-"update-progress-label" = "Mise à jour des données locales";
+"migration-update-progress-label" = "Mise à jour des données locales";
 "image-gallery-unknown-owner" = "Téléchargeur inconnu.";
 "hockeyapp-alert-question" = "Voulez-vous envoyer un rapport de plantage à $1 
pour que Wikipédia puisse l’étudier ?";
 "hockeyapp-alert-question-with-response-field" = "Voulez-vous envoyer un 
rapport de plantage à $1 pour que Wikipédia puisse l’étudier ? Veuillez décrire 
ce qui s’est produit lorsque le plantage s’est produit :";
diff --git a/wikipedia/he.lproj/Localizable.strings 
b/wikipedia/he.lproj/Localizable.strings
index 3bc95d0..34ab147 100644
--- a/wikipedia/he.lproj/Localizable.strings
+++ b/wikipedia/he.lproj/Localizable.strings
@@ -250,7 +250,7 @@
 "nearby-location-updates-settings-menu" = "פרטיות > שירותי מיקום > ויקיפדיה";
 "nearby-location-general-error" = "לא ניתן להבין מה המיקום. נא למשוך לרענון או 
לנסות מאוחר יותר.";
 "nearby-wifi" = "הפעלת וייפיי יכולה לעזור למכשיר שלך להבין את המיקום טוב 
יותר.";
-"update-progress-label" = "שדרוג נתונים מקומיים";
+"migration-update-progress-label" = "שדרוג נתונים מקומיים";
 "image-gallery-unknown-owner" = "המעלֶה אינו ידוע.";
 "hockeyapp-alert-question" = "האם לשלוח דיווח קריסה אל $1 כדי שוויקימדיה תוכל 
לתקן את הקריסה שלך?";
 "hockeyapp-alert-question-with-response-field" = "האם לשלוח דיווח קריסה אל $1 
כדי שוויקימדיה תוכל לבדוק את הקריסה שלך? נא לתאר מה קרה בזמן שאירעה הקריסה:";
diff --git a/wikipedia/id.lproj/Localizable.strings 
b/wikipedia/id.lproj/Localizable.strings
index 3a07de2..b3963ef 100644
--- a/wikipedia/id.lproj/Localizable.strings
+++ b/wikipedia/id.lproj/Localizable.strings
@@ -254,5 +254,5 @@
 "nearby-location-updates-settings-menu" = "Privasi > Layanan Lokasi > 
Wikipedia";
 "nearby-location-general-error" = "Tidak dapat menentukan lokasi. Tarik untuk 
menyegarkan atau coba lagi nanti.";
 "nearby-wifi" = "Mengaktifkan Wi-Fi dapat membantu perangkat Anda menentukan 
lokasi Anda lebih baik.";
-"update-progress-label" = "Meningkatkan data lokal";
+"migration-update-progress-label" = "Meningkatkan data lokal";
 "image-gallery-unknown-owner" = "Pengunggah tidak diketahui.";
diff --git a/wikipedia/it.lproj/Localizable.strings 
b/wikipedia/it.lproj/Localizable.strings
index c4cebff..9f337cc 100644
--- a/wikipedia/it.lproj/Localizable.strings
+++ b/wikipedia/it.lproj/Localizable.strings
@@ -256,11 +256,11 @@
 "nearby-location-updates-settings-menu" = "Privacy > Localizzazione > 
Wikipedia";
 "nearby-location-general-error" = "Impossibile determinare la posizione. Tira 
su per ricaricare o riprova più tardi.";
 "nearby-wifi" = "Abilitando il WiFi, aiuti il dispositivo a determinar meglio 
la tua posizione.";
-"update-progress-label" = "Aggiornamento di dati locali";
 "image-gallery-unknown-owner" = "Uploader sconosciuto.";
 "hockeyapp-alert-question" = "Desideri inviare una segnalazione di crash a $1 
in modo che Wikimedia sia in grado di esaminare il crash?";
 "hockeyapp-alert-question-with-response-field" = "Desideri inviare una 
segnalazione di crash a $1 in modo che Wikimedia sia in grado di esaminare il 
crash? Per favore descrivi ciò che è successo quando si è verificato il crash:";
 "hockeyapp-alert-title" = "Siamo spiacenti, l'ultima volta l'app è andata in 
stallo";
+"migration-update-progress-label" = "Aggiornamento di dati locali";
 "hockeyapp-alert-send-report" = "Invia segnalazione";
 "hockeyapp-alert-always-send" = "Invia sempre";
 "hockeyapp-alert-do-not-send" = "Non inviare";
diff --git a/wikipedia/ja.lproj/Localizable.strings 
b/wikipedia/ja.lproj/Localizable.strings
index d5804fe..b5ba77c 100644
--- a/wikipedia/ja.lproj/Localizable.strings
+++ b/wikipedia/ja.lproj/Localizable.strings
@@ -252,7 +252,7 @@
 "nearby-location-updates-settings-menu" = "プライバシー > 位置情報サービス > ウィキペディア";
 "nearby-location-general-error" = "位置を特定できません。引っ張って更新するか、後ほどもう一度試してみてください。";
 "nearby-wifi" = "Wi-Fi を有効にすると、位置情報の精度をより高めることができます。";
-"update-progress-label" = "ローカルデータをアップグレード中";
+"migration-update-progress-label" = "ローカルデータをアップグレード中";
 "image-gallery-unknown-owner" = "アップロード者不明。";
 "hockeyapp-alert-question" = "クラッシュレポートを $1 に送信しますか? 
そうすることであなたの前回のクラッシュをWikimediaがレビューできるようになります。";
 "hockeyapp-alert-question-with-response-field" = "クラッシュレポートを $1 に送信しますか? 
そうすることであなたの前回のクラッシュをWikimediaがレビューできるようになります。クラッシュが発生した際に何が起こったか記述してください。";
diff --git a/wikipedia/ko.lproj/Localizable.strings 
b/wikipedia/ko.lproj/Localizable.strings
index 06e7be6..28486d0 100644
--- a/wikipedia/ko.lproj/Localizable.strings
+++ b/wikipedia/ko.lproj/Localizable.strings
@@ -249,5 +249,5 @@
 "nearby-location-updates-settings-menu" = "개인 정보 보호 > 위치 서비스 > 위키백과";
 "nearby-location-general-error" = "위치를 확정할 수 없습니다. 새로 고치려면 당기거나 나중에 다시 시도하세요.";
 "nearby-wifi" = "Wi-Fi를 활성화하면 장치가 위치를 더 정확하도록 도울 수 있습니다.";
-"update-progress-label" = "로컬 데이터 업그레이드";
+"migration-update-progress-label" = "로컬 데이터 업그레이드";
 "image-gallery-unknown-owner" = "업로더 모름";
diff --git a/wikipedia/lb.lproj/Localizable.strings 
b/wikipedia/lb.lproj/Localizable.strings
index 6db61fc..51fcd84 100644
--- a/wikipedia/lb.lproj/Localizable.strings
+++ b/wikipedia/lb.lproj/Localizable.strings
@@ -232,7 +232,7 @@
 "nearby-location-updates-denied" = "Dës App huet net d'Recht fir 
Aktualisatiounen iwwer d'Plaz wou e grad ass ze kréien.";
 "nearby-location-general-error" = "D'Plaz wou Dir sidd konnt net festgestallt 
ginn. Dréckt fir z'aktualiséieren oder probéiert méi spéit nach eng Kéier.";
 "nearby-wifi" = "D'Aschalte vum Wifi kann Ärem Apparat hëllefen d'Plaz wou Dir 
sidd besser festzeleeën.";
-"update-progress-label" = "Aktualiséiere vu lokalen Donnéeën";
+"migration-update-progress-label" = "Aktualiséiere vu lokalen Donnéeën";
 "image-gallery-unknown-owner" = "Eroplueder onbekannt.";
 "hockeyapp-alert-question" = "Wëllt Dir e Rapport vum Crash u $1 schécken fir 
datt Wikimedia Äre Crash ënnersiche kann?";
 "hockeyapp-alert-title" = "Leider ass d'App déi leschte Kéier ofgestierzt";
diff --git a/wikipedia/mk.lproj/Localizable.strings 
b/wikipedia/mk.lproj/Localizable.strings
index 0efbaad..66e70c8 100644
--- a/wikipedia/mk.lproj/Localizable.strings
+++ b/wikipedia/mk.lproj/Localizable.strings
@@ -248,7 +248,7 @@
 "nearby-location-updates-settings-menu" = "Приватност > Местоположбени услуги 
> Википедија";
 "nearby-location-general-error" = "Не можам да ја утврдам местоположбата. 
Повлечете за да превчитате или обидете се повторно.";
 "nearby-wifi" = "Ако ја вклучите безжичната линија (Wi-Fi), уредот ќе може 
подобро да ја утврди вашата местоположба.";
-"update-progress-label" = "Надградба на месните податоци";
+"migration-update-progress-label" = "Надградба на месните податоци";
 "image-gallery-unknown-owner" = "Подигачот е непознат";
 "hockeyapp-alert-question" = "Дали би сакале да испратите пријава за уривање 
на $1 за Викимедија да ви го разгледа проблемот?";
 "hockeyapp-alert-question-with-response-field" = "Дали би сакале да испратите 
пријава за уривање на $1 за Викимедија да ви го арзгледа проблемот? Опишете што 
се случи кога настана уривањето:";
diff --git a/wikipedia/ms.lproj/Localizable.strings 
b/wikipedia/ms.lproj/Localizable.strings
index 5908ed1..f77f0be 100644
--- a/wikipedia/ms.lproj/Localizable.strings
+++ b/wikipedia/ms.lproj/Localizable.strings
@@ -234,4 +234,4 @@
 "nearby-location-updates-settings-menu" = "Privasi > Perkhidmatan Lokasi > 
Wikipedia\n(Privacy > Location Services > Wikipedia)";
 "nearby-location-general-error" = "Lokasi tidak dapat ditentukan. Sila tarik 
untuk muat semula atau cuba lagi nanti.";
 "nearby-wifi" = "Memasang Wi-Fi boleh membantu peranti anda menentukan lokasi 
anda dengan lebih baik.";
-"update-progress-label" = "Menaiktaraf data setempat";
+"migration-update-progress-label" = "Menaiktaraf data setempat";
diff --git a/wikipedia/nl.lproj/Localizable.strings 
b/wikipedia/nl.lproj/Localizable.strings
index a1bd9f3..11dc693 100644
--- a/wikipedia/nl.lproj/Localizable.strings
+++ b/wikipedia/nl.lproj/Localizable.strings
@@ -249,4 +249,4 @@
 "nearby-location-updates-settings-menu" = "Privacy > Locatievoorzieningen > 
Wikipedia";
 "nearby-location-general-error" = "Kan locatie niet bepalen. Trek naar beneden 
om bij te werken of probeer het later opnieuw.";
 "nearby-wifi" = "Het inschakelen van Wi-Fi zorgt voor een nauwkeuriger 
locatie.";
-"update-progress-label" = "Lokale gegevens bijwerken";
+"migration-update-progress-label" = "Lokale gegevens bijwerken";
diff --git a/wikipedia/pt-br.lproj/Localizable.strings 
b/wikipedia/pt-br.lproj/Localizable.strings
index db52024..e5b5b50 100644
--- a/wikipedia/pt-br.lproj/Localizable.strings
+++ b/wikipedia/pt-br.lproj/Localizable.strings
@@ -252,4 +252,4 @@
 "nearby-location-updates-settings-menu" = "Privacidade > Serviços de 
localização > Wikipédia";
 "nearby-location-general-error" = "Não foi possível determinar a localização. 
Puxe para atualizar ou tente novamente mais tarde.";
 "nearby-wifi" = "Ativar o WiFi pode ajudar o seu dispositivo a determinar a 
sua localização.";
-"update-progress-label" = "Atualizando dados locais";
+"migration-update-progress-label" = "Atualizando dados locais";
diff --git a/wikipedia/pt.lproj/Localizable.strings 
b/wikipedia/pt.lproj/Localizable.strings
index 8ae96d6..96d9855 100644
--- a/wikipedia/pt.lproj/Localizable.strings
+++ b/wikipedia/pt.lproj/Localizable.strings
@@ -251,7 +251,7 @@
 "nearby-location-updates-settings-menu" = "Privacidade > Serviços de 
localização > Wikipédia";
 "nearby-location-general-error" = "Não foi possível determinar a localização. 
Puxe para atualizar ou tente novamente mais tarde.";
 "nearby-wifi" = "Ativar o WiFi pode ajudar o seu dispositivo a determinar a 
sua localização.";
-"update-progress-label" = "A atualizar dados locais";
+"migration-update-progress-label" = "A atualizar dados locais";
 "image-gallery-unknown-owner" = "Autor desconhecido.";
 // Fuzzy
 "hockeyapp-alert-question" = "Deseja enviar um relatório da falha de $1 para 
que possamos resolver o problema?";
diff --git a/wikipedia/qqq.lproj/Localizable.strings 
b/wikipedia/qqq.lproj/Localizable.strings
index ae05b8c..730147a 100644
--- a/wikipedia/qqq.lproj/Localizable.strings
+++ b/wikipedia/qqq.lproj/Localizable.strings
@@ -254,7 +254,8 @@
 "nearby-location-updates-settings-menu" = "Menu items to tap in the iOS 
Settings App to enable the Wikipedia App to get location updates. Please check 
on an iOS device to ensure correct menu text.";
 "nearby-location-general-error" = "General location determination error 
message";
 "nearby-wifi" = "Alert text telling user how to improve location accuracy";
-"update-progress-label" = "Label shown during automatic upgrade of local data 
to new internal format. May be on screen very briefly or for a few seconds.";
+"migration-update-progress-label" = "Label shown during automatic upgrade of 
local data to new internal format. May be on screen very briefly or for a few 
seconds.";
+"migration-update-progress-count-label" = "Shows the progress of article 
migration in text: 4 / 15, 5 / 15, etc…";
 "image-gallery-unknown-owner" = "Fallback text for when an item in the image 
gallery doesn't have a specified owner.";
 "hockeyapp-alert-question" = "Alert dialog question asking user whether to 
send a crash report to HockeyApp crash reporting server. $1 will be replaced 
programmatically with the constant string 'HockeyApp'";
 "hockeyapp-alert-question-with-response-field" = "Alert dialog question asking 
user whether to send a crash report to HockeyApp crash reporting server, and 
asking the user to describe what happened when the crash occurred. $1 will be 
replaced programmatically with the constant string 'HockeyApp'";
diff --git a/wikipedia/ro.lproj/Localizable.strings 
b/wikipedia/ro.lproj/Localizable.strings
index c6dd8be..38d76fb 100644
--- a/wikipedia/ro.lproj/Localizable.strings
+++ b/wikipedia/ro.lproj/Localizable.strings
@@ -246,7 +246,7 @@
 "nearby-location-updates-settings-menu" = "Intimitate > Servicii de localizare 
> Wikipedia";
 "nearby-location-general-error" = "Nu s-a putut efectua localizarea. Trageți 
pentru a reîmprospăta sau reîncercați mai târziu.";
 "nearby-wifi" = "Activarea conexiunii WiFi poate ajuta dispozitivul 
dumnevoastră să vă localizeze mai precis.";
-"update-progress-label" = "Se face upgrade datelor locale";
+"migration-update-progress-label" = "Se face upgrade datelor locale";
 "image-gallery-unknown-owner" = "Încărcare de la o persoană necunoscută.";
 "hockeyapp-alert-question" = "Ați dori să trimiteți un raport de blocare a 
aplicației către $1, astfel încât Wikimedia să studieze problema?";
 "hockeyapp-alert-question-with-response-field" = "Ați dori să trimiteți un 
raport de blocare a aplicației către $1, astfel încât Wikimedia să studieze 
problema? Vă rugăm să descrieți împrejurarea în care s-a produs blocarea:";
diff --git a/wikipedia/ru.lproj/Localizable.strings 
b/wikipedia/ru.lproj/Localizable.strings
index 598dee5..110ebdd 100644
--- a/wikipedia/ru.lproj/Localizable.strings
+++ b/wikipedia/ru.lproj/Localizable.strings
@@ -253,7 +253,7 @@
 "nearby-location-updates-settings-menu" = "Приватность > Службы геолокации > 
Википедия";
 "nearby-location-general-error" = "Не удаётся определить местоположение. 
Потяните, чтобы обновить или повторите попытку позже.";
 "nearby-wifi" = "Включение Wi-Fi может помочь устройству лучше определить ваше 
местоположение.";
-"update-progress-label" = "Обновление локальных данных";
+"migration-update-progress-label" = "Обновление локальных данных";
 "image-gallery-unknown-owner" = "Загрузивший файл неизвестен.";
 "hockeyapp-alert-question" = "Не хотели бы вы отправить отчет в $1, чтобы Фонд 
Викимедиа смог изучить ваш случай «падения»?";
 "hockeyapp-alert-question-with-response-field" = "Не хотели бы вы отправить 
отчет в $1, чтобы Фонд Викимедиа смог изучить ваш случай «падения»? Пожалуйста, 
опишите, что могло привести к этому:";
diff --git a/wikipedia/sv.lproj/Localizable.strings 
b/wikipedia/sv.lproj/Localizable.strings
index 8ab7dbe..b5308af 100644
--- a/wikipedia/sv.lproj/Localizable.strings
+++ b/wikipedia/sv.lproj/Localizable.strings
@@ -255,7 +255,7 @@
 "nearby-location-updates-settings-menu" = "Sekretess > Platstjänster > 
Wikipedia";
 "nearby-location-general-error" = "Det gick inte att bestämma plats. Dra för 
att uppdatera eller försök igen senare.";
 "nearby-wifi" = "Att aktivera wifi kan hjälpa din enhet att bättre avgöra din 
position.";
-"update-progress-label" = "Uppgraderar lokal data";
+"migration-update-progress-label" = "Uppgraderar lokal data";
 "image-gallery-unknown-owner" = "Okänd uppladdare.";
 "hockeyapp-alert-question" = "Vill du skicka en kraschrapport till $1 så kan 
Wikimedia kan undersöka din krasch?";
 "hockeyapp-alert-question-with-response-field" = "Vill du skicka en 
kraschrapport till $1 så att Wikimedia  undersöka din krasch? Beskriv vad som 
hände när kraschen inträffade:";
diff --git a/wikipedia/tr.lproj/Localizable.strings 
b/wikipedia/tr.lproj/Localizable.strings
index c1208d8..a06b8eb 100644
--- a/wikipedia/tr.lproj/Localizable.strings
+++ b/wikipedia/tr.lproj/Localizable.strings
@@ -252,7 +252,7 @@
 "nearby-location-updates-settings-menu" = "Gizlilik > Konum Servisleri > 
Wikipedia";
 "nearby-location-general-error" = "Konum belirlenemiyor. Yenilemek için aşağı 
çekin veya daha sonra tekrar deneyin.";
 "nearby-wifi" = "Kablosuz bağlantıyı etkinleştirmek, cihazınızın konumunuzu 
daha iyi belirlemesine yardımcı olabilir.";
-"update-progress-label" = "Yerel veri güncelleniyor";
+"migration-update-progress-label" = "Yerel veri güncelleniyor";
 "image-gallery-unknown-owner" = "Yükleyen bilinmiyor.";
 "hockeyapp-alert-question" = "Oluşan hatayı Wikimedia'nın inceleyebilmesi için 
$1'e çökme raporu göndermek ister misiniz?";
 "hockeyapp-alert-question-with-response-field" = "Oluşan hatayı Wikimedia'nın 
inceleyebilmesi için $1'e çökme raporu göndermek ister misiniz? Lütfen çökme 
gerçekleştiği sırada ne olduğunu tanımlayabilir misiniz:";
diff --git a/wikipedia/vi.lproj/Localizable.strings 
b/wikipedia/vi.lproj/Localizable.strings
index 1831a30..7554da4 100644
--- a/wikipedia/vi.lproj/Localizable.strings
+++ b/wikipedia/vi.lproj/Localizable.strings
@@ -249,7 +249,7 @@
 "nearby-location-updates-settings-menu" = "Bảo mật > Địa điểm > Wikipedia";
 "nearby-location-general-error" = "Không thể xác định vị trí. Kéo xuống để làm 
mới hoặc thử lại sau.";
 "nearby-wifi" = "Bật lên Wi-Fi để giúp thiết bị của bạn xác định vị trí của 
bạn một cách chính xác hơn.";
-"update-progress-label" = "Đang nâng cấp dữ liệu địa phương";
+"migration-update-progress-label" = "Đang nâng cấp dữ liệu địa phương";
 "image-gallery-unknown-owner" = "Người tải lên không rõ.";
 // Fuzzy
 "hockeyapp-alert-question" = "Bạn có muốn gửi bản báo cáo sự cố cho $1 để giúp 
chúng tôi sửa lỗi này?";
diff --git a/wikipedia/zh-hans.lproj/Localizable.strings 
b/wikipedia/zh-hans.lproj/Localizable.strings
index 74f277f..425e13e 100644
--- a/wikipedia/zh-hans.lproj/Localizable.strings
+++ b/wikipedia/zh-hans.lproj/Localizable.strings
@@ -253,7 +253,7 @@
 "nearby-location-updates-settings-menu" = "隐私 > 位置服务 > 维基百科";
 "nearby-location-general-error" = "无法确定位置。下拉刷新或稍后重试。";
 "nearby-wifi" = "启用Wi-Fi可使您的设备更好的确定您的位置。";
-"update-progress-label" = "升级本地数据";
+"migration-update-progress-label" = "升级本地数据";
 "image-gallery-unknown-owner" = "上传者未知。";
 "hockeyapp-alert-question" = "您想要将崩溃报告发送至$1,这样维基媒体可以复查您的崩溃么?";
 "hockeyapp-alert-question-with-response-field" = 
"您想要将崩溃报告发送至$1,这样维基媒体可以复查您的崩溃么?请描述崩溃发生时出现了什么现象:";

-- 
To view, visit https://gerrit.wikimedia.org/r/199299
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I1297bb95e943749a28a99ba7488bd8d35acaf901
Gerrit-PatchSet: 6
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Fjalapeno <[email protected]>
Gerrit-Reviewer: Bgerstle <[email protected]>
Gerrit-Reviewer: Dr0ptp4kt <[email protected]>
Gerrit-Reviewer: Mhurd <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to