]> granicus.if.org Git - handbrake/commitdiff
MacGui: load the HandBrakeKit framework localized strings from the framework bundle.
authorDamiano Galassi <damiog@gmail.com>
Sat, 20 Oct 2018 11:31:06 +0000 (13:31 +0200)
committerDamiano Galassi <damiog@gmail.com>
Sat, 20 Oct 2018 11:31:06 +0000 (13:31 +0200)
14 files changed:
macosx/HBAudio.m
macosx/HBFilters+UIAdditions.m
macosx/HBFilters.m
macosx/HBJob+UIAdditions.m
macosx/HBJob.m
macosx/HBLocalizationUtilities.h [new file with mode: 0644]
macosx/HBPicture+UIAdditions.m
macosx/HBPreset.m
macosx/HBRange+UIAdditions.m
macosx/HBStateFormatter+Private.m
macosx/HBSubtitles.m
macosx/HBTitle.m
macosx/HBVideo+UIAdditions.m
macosx/HandBrake.xcodeproj/project.pbxproj

index 4daf72e36a4a12e09443d8aff68c9f46a2bd121a..ad9b4b3b87708886eee5fa684706b4064cf962d3 100644 (file)
@@ -14,6 +14,7 @@
 #import "HBAudioDefaults.h"
 
 #import "HBCodingUtilities.h"
+#import "HBLocalizationUtilities.h"
 #import "HBJob+Private.h"
 
 #include "hb.h"
@@ -44,7 +45,7 @@ NSString *HBAudioEncoderChangedNotification = @"HBAudioEncoderChangedNotificatio
 
         // Add the none and foreign track to the source array
         NSMutableArray *sourceTracks = [job.title.audioTracks mutableCopy];
-        NSDictionary *none = @{keyAudioTrackName: NSLocalizedString(@"None", @"HBAudio -> none track name")};
+        NSDictionary *none = @{keyAudioTrackName: HBKitLocalizedString(@"None", @"HBAudio -> none track name")};
         [sourceTracks insertObject:none atIndex:0];
         _sourceTracks = [sourceTracks copy];
     }
index 71ce759f8b1caa10ae9e109a6fc2e78c0c927c69..814482f8edbe252b48007f87a3d4612dadad1545 100644 (file)
@@ -5,6 +5,8 @@
  It may be used under the terms of the GNU General Public License. */
 
 #import "HBFilters+UIAdditions.h"
+#import "HBLocalizationUtilities.h"
+
 #import "hb.h"
 
 /**
@@ -21,7 +23,7 @@ static NSArray * filterParamsToNamesArray(hb_filter_param_t * (f)(int), int filt
     {
         NSString *name = @(preset->name);
         if ([name isEqualToString:@"Off"]) {
-            name = NSLocalizedString(@"Off", @"HBFilters -> off display name");
+            name = NSLocalizedStringFromTableInBundle(@"Off", nil, [NSBundle bundleForClass:[HBFilters class]], "HBFilters -> off display name");
         }
         [presets addObject:name];
     }
@@ -43,7 +45,7 @@ static NSDictionary * filterParamsToNamesDict(hb_filter_param_t * (f)(int), int
     {
         NSString *name = @(preset->name);
         if ([name isEqualToString:@"Off"]) {
-            name = NSLocalizedString(@"Off", @"HBFilters -> off display name");
+            name = NSLocalizedStringFromTableInBundle(@"Off", nil, [NSBundle bundleForClass:[HBFilters class]], "HBFilters -> off display name");
         }
         [presets setObject:@(preset->short_name) forKey:name];
     }
@@ -264,16 +266,16 @@ static NSDictionary *sharpenTypesDict = nil;
 {
     if (!deinterlaceTypesDict)
     {
-        deinterlaceTypesDict = @{NSLocalizedString(@"Off", @"HBFilters -> filter display name"):        @"off",
-                                 NSLocalizedString(@"Yadif", @"HBFilters -> filter display name"):      @"deinterlace",
-                                 NSLocalizedString(@"Decomb", @"HBFilters -> filter display name"):     @"decomb"};;
+        deinterlaceTypesDict = @{HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"):        @"off",
+                                 HBKitLocalizedString(@"Yadif", @"HBFilters -> filter display name"):      @"deinterlace",
+                                 HBKitLocalizedString(@"Decomb", @"HBFilters -> filter display name"):     @"decomb"};;
     }
     return deinterlaceTypesDict;
 }
 
 - (NSArray *)deinterlaceTypes
 {
-    return @[NSLocalizedString(@"Off", @"HBFilters -> filter display name"), NSLocalizedString(@"Yadif", @"HBFilters -> filter display name"), NSLocalizedString(@"Decomb", @"HBFilters -> filter display name")];
+    return @[HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"), HBKitLocalizedString(@"Yadif", @"HBFilters -> filter display name"), HBKitLocalizedString(@"Decomb", @"HBFilters -> filter display name")];
 }
 
 + (NSDictionary *)decombPresetsDict
@@ -316,9 +318,9 @@ static NSDictionary *sharpenTypesDict = nil;
 {
     if (!denoiseTypesDict)
     {
-        denoiseTypesDict = @{NSLocalizedString(@"Off", @"HBFilters -> filter display name"):      @"off",
-                             NSLocalizedString(@"NLMeans", @"HBFilters -> filter display name"):  @"nlmeans",
-                             NSLocalizedString(@"HQDN3D", @"HBFilters -> filter display name"):   @"hqdn3d"};;
+        denoiseTypesDict = @{HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"):      @"off",
+                             HBKitLocalizedString(@"NLMeans", @"HBFilters -> filter display name"):  @"nlmeans",
+                             HBKitLocalizedString(@"HQDN3D", @"HBFilters -> filter display name"):   @"hqdn3d"};;
     }
     return denoiseTypesDict;
 }
@@ -351,9 +353,9 @@ static NSDictionary *sharpenTypesDict = nil;
 {
     if (!sharpenTypesDict)
     {
-        sharpenTypesDict = @{NSLocalizedString(@"Off", @"HBFilters -> filter display name"):      @"off",
-                             NSLocalizedString(@"Unsharp", @"HBFilters -> filter display name"):  @"unsharp",
-                             NSLocalizedString(@"Lapsharp", @"HBFilters -> filter display name"): @"lapsharp"};;
+        sharpenTypesDict = @{HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"):      @"off",
+                             HBKitLocalizedString(@"Unsharp", @"HBFilters -> filter display name"):  @"unsharp",
+                             HBKitLocalizedString(@"Lapsharp", @"HBFilters -> filter display name"): @"lapsharp"};;
     }
     return sharpenTypesDict;
 }
@@ -382,7 +384,7 @@ static NSDictionary *sharpenTypesDict = nil;
 
 - (NSArray *)denoiseTypes
 {
-    return @[NSLocalizedString(@"Off", @"HBFilters -> filter display name"), NSLocalizedString(@"NLMeans", @"HBFilters -> filter display name"), NSLocalizedString(@"HQDN3D", @"HBFilters -> filter display name")];
+    return @[HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"), HBKitLocalizedString(@"NLMeans", @"HBFilters -> filter display name"), HBKitLocalizedString(@"HQDN3D", @"HBFilters -> filter display name")];
 }
 
 - (NSArray *)denoisePresets
@@ -397,7 +399,7 @@ static NSDictionary *sharpenTypesDict = nil;
 
 - (NSArray *)sharpenTypes
 {
-    return @[NSLocalizedString(@"Off", @"HBFilters -> filter display name"), NSLocalizedString(@"Unsharp", @"HBFilters -> filter display name"), NSLocalizedString(@"Lapsharp", @"HBFilters -> filter display name")];
+    return @[HBKitLocalizedString(@"Off", @"HBFilters -> filter display name"), HBKitLocalizedString(@"Unsharp", @"HBFilters -> filter display name"), HBKitLocalizedString(@"Lapsharp", @"HBFilters -> filter display name")];
 }
 
 - (NSArray *)sharpenPresets
@@ -478,7 +480,7 @@ static NSDictionary *sharpenTypesDict = nil;
 {
     if (self.deblock == 0)
     {
-        return NSLocalizedString(@"Off", @"HBFilters -> filter summary");
+        return HBKitLocalizedString(@"Off", @"HBFilters -> filter summary");
     }
     else
     {
index a0f1ae3f18b5bbf2784b8c05a43a550f65646efb..c6c99d2e5bdc44811147fbee65d827b9bd82c5b1 100644 (file)
@@ -6,6 +6,7 @@
 
 #import "HBFilters.h"
 #import "HBCodingUtilities.h"
+#import "HBLocalizationUtilities.h"
 #import "NSDictionary+HBAdditions.h"
 #import "HBMutablePreset.h"
 
@@ -114,9 +115,9 @@ NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
             retval = NO;
             if (outError)
             {
-                NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid custom detelecine settings.",
+                NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid custom detelecine settings.",
                                                                                         @"HBFilters -> invalid detelecine custom string description"),
-                                           NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Syntax: skip-left=s:skip-right=s:skip-top=s:skip-bottom=s:strict-breaks=s:plane=p:parity=p:disable=d\n\nDefault: skip-left=1:skip-right=1:skip-top=4:skip-bottom=4:plane=0",                                                                                                            @"HBJob -> invalid detelecine custom settings error recovery suggestion")};
+                                           NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Syntax: skip-left=s:skip-right=s:skip-top=s:skip-bottom=s:strict-breaks=s:plane=p:parity=p:disable=d\n\nDefault: skip-left=1:skip-right=1:skip-top=4:skip-bottom=4:plane=0",                                                                                                            @"HBJob -> invalid detelecine custom settings error recovery suggestion")};
                 *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
             }
         }
@@ -179,9 +180,9 @@ NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
             retval = NO;
             if (outError)
             {
-                NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid custom comb detect settings.",
+                NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid custom comb detect settings.",
                                                                                         @"HBFilters -> invalid comb detect custom string description"),
-                                           NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Syntax: mode=m:spatial-metric=s:motion-thresh=m:spatial-thresh=s:filter-mode=f:block-thresh=b:block-width=b:block-height=b:disable=d\n\nDefault: mode=3:spatial-metric=2:motion-thresh=1:spatial-thresh=1:filter-mode=2:block-thresh=40:block-width=16:block-height=16",                                                                                                            @"HBJob -> invalid comb detect custom settings error recovery suggestion")};
+                                           NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Syntax: mode=m:spatial-metric=s:motion-thresh=m:spatial-thresh=s:filter-mode=f:block-thresh=b:block-width=b:block-height=b:disable=d\n\nDefault: mode=3:spatial-metric=2:motion-thresh=1:spatial-thresh=1:filter-mode=2:block-thresh=40:block-width=16:block-height=16",                                                                                                            @"HBJob -> invalid comb detect custom settings error recovery suggestion")};
                 *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
             }
         }
@@ -288,16 +289,16 @@ NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
             {
                 if (filter_id == HB_FILTER_DEINTERLACE)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid Yadif custom settings.",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid Yadif custom settings.",
                                                                                             @"HBFilters -> invalid Yadif custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Yadif syntax: mode=m:parity=p\n\nYadif default: mode=3",                                                                                                            @"HBJob -> invalid Yadif custom settings error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Yadif syntax: mode=m:parity=p\n\nYadif default: mode=3",                                                                                                            @"HBJob -> invalid Yadif custom settings error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
                 else if (filter_id == HB_FILTER_DECOMB)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid Decomb custom settings.",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid Decomb custom settings.",
                                                                                             @"HBFilters -> invalid Decomb custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Decomb syntax: mode=m:magnitude-thresh=m:variance-thresh=v:laplacian-thresh=l:dilation-thresh=d:erosion-thresh=e:noise-thresh=n:search-distance=s:postproc=p:parity=p\n\nDecomb default: mode=7",                                                                                                            @"HBJob -> invalid Decomb custom settings error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Decomb syntax: mode=m:magnitude-thresh=m:variance-thresh=v:laplacian-thresh=l:dilation-thresh=d:erosion-thresh=e:noise-thresh=n:search-distance=s:postproc=p:parity=p\n\nDecomb default: mode=7",                                                                                                            @"HBJob -> invalid Decomb custom settings error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
             }
@@ -404,16 +405,16 @@ NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
             {
                 if (filter_id == HB_FILTER_HQDN3D)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid custom HQDN3D settings",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid custom HQDN3D settings",
                                                                                             @"HBFilters -> invalid denoise custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"HQDN3D syntax: y-spatial=y:cb-spatial=c:cr-spatial=c:y-temporal=y:cb-temporal=c:cr-temporal=c\n\nDefault settings: y-spatial=3:cb-spatial=2:cr-spatial=2:y-temporal=2:cb-temporal=3:cr-temporal=3",                                                                                                            @"HBJob -> invalid name error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"HQDN3D syntax: y-spatial=y:cb-spatial=c:cr-spatial=c:y-temporal=y:cb-temporal=c:cr-temporal=c\n\nDefault settings: y-spatial=3:cb-spatial=2:cr-spatial=2:y-temporal=2:cb-temporal=3:cr-temporal=3",                                                                                                            @"HBJob -> invalid name error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
                 else if (filter_id == HB_FILTER_NLMEANS)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid custom NLMeans settings",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid custom NLMeans settings",
                                                                                             @"HBFilters -> invalid denoise custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"NLMeans syntax: y-strength=y:y-origin-tune=y:y-patch-size=y:y-range=y:y-frame-count=y:y-prefilter=y:cb-strength=c:cb-origin-tune=c:cb-patch-size=c:cb-range=c:cb-frame-count=c:cb-prefilter=c:cr-strength=c:cr-origin-tune=c:cr-patch-size=c:cr-range=c:cr-frame-count=c:cr-prefilter=c:threads=t\n\nDefault settings: y-strength=6:y-origin-tune=1:y-patch-size=7:y-range=3:y-frame-count=2:y-prefilter=0:cb-strength=6:cb-origin-tune=1:cb-patch-size=7:cb-range=3:cb-frame-count=2:cb-prefilter=0",                                                                                                            @"HBJob -> invalid name error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"NLMeans syntax: y-strength=y:y-origin-tune=y:y-patch-size=y:y-range=y:y-frame-count=y:y-prefilter=y:cb-strength=c:cb-origin-tune=c:cb-patch-size=c:cb-range=c:cb-frame-count=c:cb-prefilter=c:cr-strength=c:cr-origin-tune=c:cr-patch-size=c:cr-range=c:cr-frame-count=c:cr-prefilter=c:threads=t\n\nDefault settings: y-strength=6:y-origin-tune=1:y-patch-size=7:y-range=3:y-frame-count=2:y-prefilter=0:cb-strength=6:cb-origin-tune=1:cb-patch-size=7:cb-range=3:cb-frame-count=2:cb-prefilter=0",                                                                                                            @"HBJob -> invalid name error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
             }
@@ -554,16 +555,16 @@ NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
             {
                 if (filter_id == HB_FILTER_UNSHARP)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid unsharp custom settings.",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid unsharp custom settings.",
                                                                                             @"HBFilters -> invalid unsharp custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unsharp syntax: y-strength=y:y-size=y:cb-strength=c:cb-size=c:cr-strength=c:cr-size=c\n\nUnsharp default: y-strength=0.25:y-size=7:cb-strength=0.25:cb-size=7",                                                                                                            @"HBJob -> invalid unsharp custom settings error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Unsharp syntax: y-strength=y:y-size=y:cb-strength=c:cb-size=c:cr-strength=c:cr-size=c\n\nUnsharp default: y-strength=0.25:y-size=7:cb-strength=0.25:cb-size=7",                                                                                                            @"HBJob -> invalid unsharp custom settings error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
                 else if (filter_id == HB_FILTER_LAPSHARP)
                 {
-                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid lapsharp custom settings.",
+                    NSDictionary *userInfo = @{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid lapsharp custom settings.",
                                                                                             @"HBFilters -> invalid lapsharp custom string description"),
-                                               NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Lapsharp syntax: y-strength=y:y-kernel=y:cb-strength=c:cb-kernel=c:cr-strength=c:cr-kernel=c\n\nLapsharp default: y-strength=0.2:y-kernel=isolap:cb-strength=0.2:cb-kernel=isolap",                                                                                                            @"HBJob -> invalid lapsharp custom settings error recovery suggestion")};
+                                               NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"Lapsharp syntax: y-strength=y:y-kernel=y:cb-strength=c:cb-kernel=c:cr-strength=c:cr-kernel=c\n\nLapsharp default: y-strength=0.2:y-kernel=isolap:cb-strength=0.2:cb-kernel=isolap",                                                                                                            @"HBJob -> invalid lapsharp custom settings error recovery suggestion")};
                     *outError = [NSError errorWithDomain:@"HBFilterError" code:0 userInfo:userInfo];
                 }
             }
index bc3ab2bd1849f2e2b7fd8c0943911edf8d6429dd..f8b273804763c71bd4f925357ca55ee2e9fd33a6 100644 (file)
@@ -18,6 +18,8 @@
 #import "HBPicture+UIAdditions.h"
 #import "HBFilters+UIAdditions.h"
 
+#import "HBLocalizationUtilities.h"
+
 #include "hb.h"
 
 // Text Styles
@@ -70,11 +72,11 @@ static NSDictionary            *shortHeightAttr;
         NSString *title = nil;
         if (container->format & HB_MUX_MASK_MP4)
         {
-            title = NSLocalizedString(@"MP4 File", @"HBJob -> Format display name");
+            title = HBKitLocalizedString(@"MP4 File", @"HBJob -> Format display name");
         }
         else if (container->format & HB_MUX_MASK_MKV)
         {
-            title = NSLocalizedString(@"MKV File", @"HBJob -> Format display name");
+            title = HBKitLocalizedString(@"MKV File", @"HBJob -> Format display name");
         }
         else
         {
@@ -126,45 +128,45 @@ static NSDictionary            *shortHeightAttr;
     if (self.range.type == HBRangeTypeChapters)
     {
         startStopString = (self.range.chapterStart == self.range.chapterStop) ?
-        [NSString stringWithFormat:NSLocalizedString(@"Chapter %d", @"Title description"), self.range.chapterStart + 1] :
-        [NSString stringWithFormat:NSLocalizedString(@"Chapters %d through %d", @"Title description"), self.range.chapterStart + 1, self.range.chapterStop + 1];
+        [NSString stringWithFormat:HBKitLocalizedString(@"Chapter %d", @"Title description"), self.range.chapterStart + 1] :
+        [NSString stringWithFormat:HBKitLocalizedString(@"Chapters %d through %d", @"Title description"), self.range.chapterStart + 1, self.range.chapterStop + 1];
     }
     else if (self.range.type == HBRangeTypeSeconds)
     {
-        startStopString = [NSString stringWithFormat:NSLocalizedString(@"Seconds %d through %d", @"Title description"), self.range.secondsStart, self.range.secondsStop];
+        startStopString = [NSString stringWithFormat:HBKitLocalizedString(@"Seconds %d through %d", @"Title description"), self.range.secondsStart, self.range.secondsStop];
     }
     else if (self.range.type == HBRangeTypeFrames)
     {
-        startStopString = [NSString stringWithFormat:NSLocalizedString(@"Frames %d through %d", @"Title description"), self.range.frameStart, self.range.frameStop];
+        startStopString = [NSString stringWithFormat:HBKitLocalizedString(@"Frames %d through %d", @"Title description"), self.range.frameStart, self.range.frameStop];
     }
 
     NSMutableString *passesString = [NSMutableString string];
     // check to see if our first subtitle track is Foreign Language Search, in which case there is an in depth scan
     if (self.subtitles.tracks.firstObject.sourceTrackIdx == 1)
     {
-        [passesString appendString:NSLocalizedString(@"1 Foreign Language Search Pass - ", @"Title description")];
+        [passesString appendString:HBKitLocalizedString(@"1 Foreign Language Search Pass - ", @"Title description")];
     }
     if (self.video.qualityType != 1 && self.video.twoPass == YES)
     {
         if (self.video.turboTwoPass == YES)
         {
-            [passesString appendString:NSLocalizedString(@"2 Video Passes First Turbo", @"Title description")];
+            [passesString appendString:HBKitLocalizedString(@"2 Video Passes First Turbo", @"Title description")];
         }
         else
         {
-            [passesString appendString:NSLocalizedString(@"2 Video Passes", @"Title description")];
+            [passesString appendString:HBKitLocalizedString(@"2 Video Passes", @"Title description")];
         }
     }
 
     if (passesString.length)
     {
-        [attrString appendString:[NSString stringWithFormat:NSLocalizedString(@" (Title %d, %@, %@) ▸ %@\n", @"Title description"),
+        [attrString appendString:[NSString stringWithFormat:HBKitLocalizedString(@" (Title %d, %@, %@) ▸ %@\n", @"Title description"),
                                   self.titleIdx, startStopString, passesString, self.outputFileName]
                   withAttributes:detailAttr];
     }
     else
     {
-        [attrString appendString:[NSString stringWithFormat:NSLocalizedString(@" (Title %d, %@) ▸ %@\n", @"Title description"),
+        [attrString appendString:[NSString stringWithFormat:HBKitLocalizedString(@" (Title %d, %@) ▸ %@\n", @"Title description"),
                                   self.titleIdx, startStopString, self.outputFileName]
                   withAttributes:detailAttr];
     }
@@ -177,7 +179,7 @@ static NSDictionary            *shortHeightAttr;
     NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] init];
 
     [attrString appendString:@"\t" withAttributes:detailAttr];
-    [attrString appendString:NSLocalizedString(@"Preset:", @"Preset description") withAttributes:detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Preset:", @"Preset description") withAttributes:detailBoldAttr];
     [attrString appendString:@" \t" withAttributes:detailAttr];
     [attrString appendString:self.presetName withAttributes:detailAttr];
     [attrString appendString:@"\n" withAttributes:detailAttr];
@@ -194,22 +196,22 @@ static NSDictionary            *shortHeightAttr;
 
     if (self.chaptersEnabled)
     {
-        [options appendString:NSLocalizedString(@", Chapter Markers", @"Format description")];
+        [options appendString:HBKitLocalizedString(@", Chapter Markers", @"Format description")];
     }
 
     if ((self.container & HB_MUX_MASK_MP4) && self.mp4HttpOptimize)
     {
-        [options appendString:NSLocalizedString(@", Web Optimized", @"Format description")];
+        [options appendString:HBKitLocalizedString(@", Web Optimized", @"Format description")];
     }
 
     if ((self.container & HB_MUX_MASK_MP4) && self.alignAVStart)
     {
-        [options appendString:NSLocalizedString(@", Align A/V Start", @"Format description")];
+        [options appendString:HBKitLocalizedString(@", Align A/V Start", @"Format description")];
     }
 
     if ((self.container & HB_MUX_MASK_MP4)  && self.mp4iPodCompatible)
     {
-        [options appendString:NSLocalizedString(@", iPod 5G Support", @"Format description")];
+        [options appendString:HBKitLocalizedString(@", iPod 5G Support", @"Format description")];
     }
 
     if ([options hasPrefix:@", "])
@@ -218,7 +220,7 @@ static NSDictionary            *shortHeightAttr;
     }
 
     [attrString appendString:@"\t"      withAttributes:detailAttr];
-    [attrString appendString:NSLocalizedString(@"Format:", @"Format description") withAttributes:detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Format:", @"Format description") withAttributes:detailBoldAttr];
     [attrString appendString:@" \t"     withAttributes:detailAttr];
     [attrString appendString:options    withAttributes:detailAttr];
     [attrString appendString:@"\n"      withAttributes:detailAttr];
@@ -231,7 +233,7 @@ static NSDictionary            *shortHeightAttr;
     NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] init];
 
     [attrString appendString:@"\t"                          withAttributes:detailAttr];
-    [attrString appendString:NSLocalizedString(@"Destination:", @"Destination description") withAttributes:detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Destination:", @"Destination description") withAttributes:detailBoldAttr];
     [attrString appendString:@" \t"                         withAttributes:detailAttr];
     [attrString appendString:self.completeOutputURL.path    withAttributes:detailAttr];
     [attrString appendString:@"\n"                          withAttributes:detailAttr];
@@ -246,10 +248,10 @@ static NSDictionary            *shortHeightAttr;
     NSString *pictureInfo = self.picture.summary;
     if (self.picture.keepDisplayAspect)
     {
-        pictureInfo = [pictureInfo stringByAppendingString:NSLocalizedString(@" Keep Aspect Ratio", @"Dimensions description")];
+        pictureInfo = [pictureInfo stringByAppendingString:HBKitLocalizedString(@" Keep Aspect Ratio", @"Dimensions description")];
     }
     [attrString appendString:@"\t"      withAttributes:detailAttr];
-    [attrString appendString:NSLocalizedString(@"Dimensions:", @"Dimensions description") withAttributes:detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Dimensions:", @"Dimensions description") withAttributes:detailBoldAttr];
     [attrString appendString:@" \t"             withAttributes:detailAttr];
     [attrString appendString:pictureInfo       withAttributes:detailAttr];
     [attrString appendString:@"\n"             withAttributes:detailAttr];
@@ -269,11 +271,11 @@ static NSDictionary            *shortHeightAttr;
     {
         if ([filters.detelecine isEqualToString:@"custom"])
         {
-            [summary appendFormat:@", %@ (%@)", NSLocalizedString(@"Detelecine", @"Dimensions description"), filters.detelecineCustomString];
+            [summary appendFormat:@", %@ (%@)", HBKitLocalizedString(@"Detelecine", @"Dimensions description"), filters.detelecineCustomString];
         }
         else
         {
-            [summary appendFormat:@", %@ (%@)", NSLocalizedString(@"Detelecine", @"Dimensions description"), [[[HBFilters detelecinePresetsDict] allKeysForObject:filters.detelecine] firstObject]];
+            [summary appendFormat:@", %@ (%@)", HBKitLocalizedString(@"Detelecine", @"Dimensions description"), [[[HBFilters detelecinePresetsDict] allKeysForObject:filters.detelecine] firstObject]];
         }
     }
     else if (![filters.deinterlace isEqualToString:@"off"])
@@ -301,13 +303,13 @@ static NSDictionary            *shortHeightAttr;
     // Deblock
     if (filters.deblock > 0)
     {
-        [summary appendFormat:@", %@ (%d)", NSLocalizedString(@"Deblock", @"Filters description"), filters.deblock];
+        [summary appendFormat:@", %@ (%d)", HBKitLocalizedString(@"Deblock", @"Filters description"), filters.deblock];
     }
 
     // Denoise
     if (![filters.denoise isEqualToString:@"off"])
     {
-        [summary appendFormat:@", %@ (%@", NSLocalizedString(@"Denoise", @"Filters description"), [[[HBFilters denoiseTypesDict] allKeysForObject:filters.denoise] firstObject]];
+        [summary appendFormat:@", %@ (%@", HBKitLocalizedString(@"Denoise", @"Filters description"), [[[HBFilters denoiseTypesDict] allKeysForObject:filters.denoise] firstObject]];
         if (![filters.denoisePreset isEqualToString:@"custom"])
         {
             [summary appendFormat:@", %@", [[[HBFilters denoisePresetDict] allKeysForObject:filters.denoisePreset] firstObject]];
@@ -329,7 +331,7 @@ static NSDictionary            *shortHeightAttr;
     // Sharpen
     if (![filters.sharpen isEqualToString:@"off"])
     {
-        [summary appendFormat:@", %@ (%@", NSLocalizedString(@"Sharpen", @"Filters description"), [[[HBFilters sharpenTypesDict] allKeysForObject:filters.sharpen] firstObject]];
+        [summary appendFormat:@", %@ (%@", HBKitLocalizedString(@"Sharpen", @"Filters description"), [[[HBFilters sharpenTypesDict] allKeysForObject:filters.sharpen] firstObject]];
         if (![filters.sharpenPreset isEqualToString:@"custom"])
         {
             [summary appendFormat:@", %@", [[[HBFilters sharpenPresetDict] allKeysForObject:filters.sharpenPreset] firstObject]];
@@ -355,7 +357,7 @@ static NSDictionary            *shortHeightAttr;
     // Grayscale
     if (filters.grayscale)
     {
-        [summary appendFormat:@", %@", NSLocalizedString(@"Grayscale", @"Filters description")];
+        [summary appendFormat:@", %@", HBKitLocalizedString(@"Grayscale", @"Filters description")];
     }
 
     if ([summary hasPrefix:@", "])
@@ -367,7 +369,7 @@ static NSDictionary            *shortHeightAttr;
     if (summary.length)
     {
         [attrString appendString:@"\t"          withAttributes:detailAttr];
-        [attrString appendString:NSLocalizedString(@"Filters:", @"Filters description") withAttributes:detailBoldAttr];
+        [attrString appendString:HBKitLocalizedString(@"Filters:", @"Filters description") withAttributes:detailBoldAttr];
         [attrString appendString:@" \t"          withAttributes:detailAttr];
         [attrString appendString:summary        withAttributes:detailAttr];
         [attrString appendString:@"\n"          withAttributes:detailAttr];
@@ -382,21 +384,21 @@ static NSDictionary            *shortHeightAttr;
     NSMutableString *videoInfo = [NSMutableString string];
 
     const char *encoderName = hb_video_encoder_get_name(self.video.encoder);
-    [videoInfo appendFormat:NSLocalizedString(@"Encoder: %@, ", @"Video description"),
-                            encoderName ? @(encoderName) : NSLocalizedString(@"Unknown", @"Video description")];
+    [videoInfo appendFormat:HBKitLocalizedString(@"Encoder: %@, ", @"Video description"),
+                            encoderName ? @(encoderName) : HBKitLocalizedString(@"Unknown", @"Video description")];
 
-    [videoInfo appendString:NSLocalizedString(@"Framerate: ", @"Video description")];
+    [videoInfo appendString:HBKitLocalizedString(@"Framerate: ", @"Video description")];
 
     if (self.video.frameRate == 0)
     {
         if (self.video.frameRateMode == 0)
         {
             // we are using same as source with vfr
-            [videoInfo appendFormat:NSLocalizedString(@"Same as source (variable)", @"Video description")];
+            [videoInfo appendString:HBKitLocalizedString(@"Same as source (variable)", @"Video description")];
         }
         else
         {
-            [videoInfo appendFormat:NSLocalizedString(@"Same as source (constant)", @"Video description")];
+            [videoInfo appendString:HBKitLocalizedString(@"Same as source (constant)", @"Video description")];
         }
     }
     else
@@ -404,27 +406,27 @@ static NSDictionary            *shortHeightAttr;
         // we have a specified, constant framerate
         if (self.video.frameRateMode == 0)
         {
-            [videoInfo appendFormat:NSLocalizedString(@"Peak %@ (may be lower)", @"Video description"), @(hb_video_framerate_get_name(self.video.frameRate))];
+            [videoInfo appendFormat:HBKitLocalizedString(@"Peak %@ (may be lower)", @"Video description"), @(hb_video_framerate_get_name(self.video.frameRate))];
         }
         else
         {
-            [videoInfo appendFormat:NSLocalizedString(@"Peak %@ (constant frame rate)", @"Video description"), @(hb_video_framerate_get_name(self.video.frameRate))];
+            [videoInfo appendFormat:HBKitLocalizedString(@"Peak %@ (constant frame rate)", @"Video description"), @(hb_video_framerate_get_name(self.video.frameRate))];
         }
     }
 
     if (self.video.qualityType == 0) // ABR
     {
         [videoInfo appendFormat:@", "];
-        [videoInfo appendFormat:NSLocalizedString(@"Bitrate: %d kbps", @"Video description"), self.video.avgBitrate];
+        [videoInfo appendFormat:HBKitLocalizedString(@"Bitrate: %d kbps", @"Video description"), self.video.avgBitrate];
     }
     else // CRF
     {
         [videoInfo appendFormat:@", "];
-        [videoInfo appendFormat:NSLocalizedString(@"Constant Quality: %.2f %s", @"Video description"), self.video.quality, hb_video_quality_get_name(self.video.encoder)];
+        [videoInfo appendFormat:HBKitLocalizedString(@"Constant Quality: %.2f %s", @"Video description"), self.video.quality, hb_video_quality_get_name(self.video.encoder)];
     }
 
     [attrString appendString:@"\t"       withAttributes:detailAttr];
-    [attrString appendString:NSLocalizedString(@"Video:", @"Video description") withAttributes:detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Video:", @"Video description") withAttributes:detailBoldAttr];
     [attrString appendString:@" \t"      withAttributes:detailAttr];
     [attrString appendString:videoInfo   withAttributes:detailAttr];
     [attrString appendString:@"\n"       withAttributes:detailAttr];
@@ -442,18 +444,18 @@ static NSDictionary            *shortHeightAttr;
             }
             else
             {
-                [encoderPresetInfo appendString:NSLocalizedString(@"default settings", @"Video description")];
+                [encoderPresetInfo appendString:HBKitLocalizedString(@"default settings", @"Video description")];
             }
         }
         else
         {
             // we are using the x264 system
-            [encoderPresetInfo appendFormat:NSLocalizedString(@"Preset: %@", @"Video description"), self.video.preset];
+            [encoderPresetInfo appendFormat:HBKitLocalizedString(@"Preset: %@", @"Video description"), self.video.preset];
 
             if (self.video.tune.length || self.video.fastDecode)
             {
                 [encoderPresetInfo appendString:@", "];
-                [encoderPresetInfo appendString:NSLocalizedString(@"Tune: ", @"Video description")];
+                [encoderPresetInfo appendString:HBKitLocalizedString(@"Tune: ", @"Video description")];
 
                 if (self.video.tune.length)
                 {
@@ -461,27 +463,27 @@ static NSDictionary            *shortHeightAttr;
                 }
                 if (self.video.fastDecode)
                 {
-                    [encoderPresetInfo appendString:NSLocalizedString(@" - fastdecode", @"Video description")];
+                    [encoderPresetInfo appendString:HBKitLocalizedString(@" - fastdecode", @"Video description")];
                 }
             }
             if (self.video.videoOptionExtra.length)
             {
                 [encoderPresetInfo appendString:@", "];
-                [encoderPresetInfo appendFormat:NSLocalizedString(@"Options: %@", @"Video description"), self.video.videoOptionExtra];
+                [encoderPresetInfo appendFormat:HBKitLocalizedString(@"Options: %@", @"Video description"), self.video.videoOptionExtra];
             }
             if (self.video.profile.length)
             {
                 [encoderPresetInfo appendString:@", "];
-                [encoderPresetInfo appendFormat:NSLocalizedString(@"Profile: %@", @"Video description"), self.video.profile];
+                [encoderPresetInfo appendFormat:HBKitLocalizedString(@"Profile: %@", @"Video description"), self.video.profile];
             }
             if (self.video.level.length)
             {
                 [encoderPresetInfo appendString:@", "];
-                [encoderPresetInfo appendFormat:NSLocalizedString(@"Level: %@", @"Video description"), self.video.level];
+                [encoderPresetInfo appendFormat:HBKitLocalizedString(@"Level: %@", @"Video description"), self.video.level];
             }
         }
         [attrString appendString:@"\t"                  withAttributes:detailAttr];
-        [attrString appendString:NSLocalizedString(@"Video Options:", @"Video description") withAttributes:detailBoldAttr];
+        [attrString appendString:HBKitLocalizedString(@"Video Options:", @"Video description") withAttributes:detailBoldAttr];
         [attrString appendString:@" \t"                 withAttributes:detailAttr];
         [attrString appendString:encoderPresetInfo      withAttributes:detailAttr];
         [attrString appendString:@"\n"                  withAttributes:detailAttr];
@@ -496,11 +498,11 @@ static NSDictionary            *shortHeightAttr;
         }
         else
         {
-            lavcInfo = NSLocalizedString(@"default settings", @"Video description");
+            lavcInfo = HBKitLocalizedString(@"default settings", @"Video description");
         }
 
         [attrString appendString:@"\t"      withAttributes:detailBoldAttr];
-        [attrString appendString:NSLocalizedString(@"Video Options:", @"Video description") withAttributes:detailAttr];
+        [attrString appendString:HBKitLocalizedString(@"Video Options:", @"Video description") withAttributes:detailAttr];
         [attrString appendString:@" \t"     withAttributes:detailAttr];
         [attrString appendString:lavcInfo   withAttributes:detailAttr];
         [attrString appendString:@"\n"      withAttributes:detailAttr];
@@ -515,21 +517,21 @@ static NSDictionary            *shortHeightAttr;
     BOOL secondLine = NO;
 
     [attrString appendString:@"\t" withAttributes: detailBoldAttr];
-    [attrString appendString:NSLocalizedString(@"Audio:", @"Audio description") withAttributes: detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Audio:", @"Audio description") withAttributes: detailBoldAttr];
     [attrString appendString:@" " withAttributes: detailBoldAttr];
 
     for (HBAudioTrack *audioTrack in self.audio.tracks)
     {
         if (audioTrack.isEnabled)
         {
-            NSMutableString *detailString = [NSMutableString stringWithFormat:NSLocalizedString(@"%@ ▸ Encoder: %@", @"Audio description"),
+            NSMutableString *detailString = [NSMutableString stringWithFormat:HBKitLocalizedString(@"%@ ▸ Encoder: %@", @"Audio description"),
                                       self.audio.sourceTracks[audioTrack.sourceTrackIdx][keyAudioTrackName],
                                       @(hb_audio_encoder_get_name(audioTrack.encoder))];
 
             if ((audioTrack.encoder  & HB_ACODEC_PASS_FLAG) == 0)
             {
                 [detailString appendString:@", "];
-                [detailString appendFormat:NSLocalizedString(@"Mixdown: %@, Samplerate: %@, Bitrate: %d kbps", @"Audio description"),
+                [detailString appendFormat:HBKitLocalizedString(@"Mixdown: %@, Samplerate: %@, Bitrate: %d kbps", @"Audio description"),
                                             @(hb_mixdown_get_name(audioTrack.mixdown)),
                                             audioTrack.sampleRate ? [NSString stringWithFormat:@"%@ khz", @(hb_audio_samplerate_get_name(audioTrack.sampleRate))] : @"Auto",
                                             audioTrack.bitRate];
@@ -537,13 +539,13 @@ static NSDictionary            *shortHeightAttr;
                 if (0.0 < audioTrack.drc)
                 {
                     [detailString appendString:@", "];
-                    [detailString appendFormat:NSLocalizedString(@"DRC: %.2f", @"Audio description"), audioTrack.drc];
+                    [detailString appendFormat:HBKitLocalizedString(@"DRC: %.2f", @"Audio description"), audioTrack.drc];
                 }
 
                 if (0.0 != audioTrack.gain)
                 {
                     [detailString appendString:@", "];
-                    [detailString appendFormat:NSLocalizedString(@"Gain: %.2f", @"Audio description"), audioTrack.gain];
+                    [detailString appendFormat:HBKitLocalizedString(@"Gain: %.2f", @"Audio description"), audioTrack.gain];
                 }
             }
 
@@ -570,7 +572,7 @@ static NSDictionary            *shortHeightAttr;
     BOOL secondLine = NO;
 
     [attrString appendString:@"\t" withAttributes: detailBoldAttr];
-    [attrString appendString:NSLocalizedString(@"Subtitles:", @"Subtitles description") withAttributes: detailBoldAttr];
+    [attrString appendString:HBKitLocalizedString(@"Subtitles:", @"Subtitles description") withAttributes: detailBoldAttr];
     [attrString appendString:@" " withAttributes: detailBoldAttr];
 
     for (HBSubtitlesTrack *track in self.subtitles.tracks)
@@ -586,17 +588,17 @@ static NSDictionary            *shortHeightAttr;
             if (track.forcedOnly)
             {
                 [detailString appendString:@", "];
-                [detailString appendString:NSLocalizedString(@"Forced Only", @"Subtitles description")];
+                [detailString appendString:HBKitLocalizedString(@"Forced Only", @"Subtitles description")];
             }
             if (track.burnedIn)
             {
                 [detailString appendString:@", "];
-                [detailString appendString:NSLocalizedString(@"Burned In", @"Subtitles description")];
+                [detailString appendString:HBKitLocalizedString(@"Burned In", @"Subtitles description")];
             }
             if (track.def)
             {
                 [detailString appendString:@", "];
-                [detailString appendString:NSLocalizedString(@"Default", @"Subtitles description")];
+                [detailString appendString:HBKitLocalizedString(@"Default", @"Subtitles description")];
             }
 
             [attrString appendString:@"\t" withAttributes: detailAttr];
@@ -652,7 +654,7 @@ static NSDictionary            *shortHeightAttr;
     NSMutableString *info = [NSMutableString string];
 
     const char *encoderName = hb_video_encoder_get_name(self.video.encoder);
-    [info appendString:encoderName ? @(encoderName) : NSLocalizedString(@"Unknown", @"HBJob -> video short description encoder name")];
+    [info appendString:encoderName ? @(encoderName) : HBKitLocalizedString(@"Unknown", @"HBJob -> video short description encoder name")];
 
     [info appendString:@", "];
 
@@ -661,11 +663,11 @@ static NSDictionary            *shortHeightAttr;
         if (self.video.frameRateMode == 0)
         {
             // we are using same as source with vfr
-            [info appendFormat:NSLocalizedString(@"VFR", @"HBJob -> video short description framerate")];
+            [info appendString:HBKitLocalizedString(@"VFR", @"HBJob -> video short description framerate")];
         }
         else
         {
-            [info appendFormat:NSLocalizedString(@"CRF", @"HBJob -> video short description framerate")];
+            [info appendString:HBKitLocalizedString(@"CRF", @"HBJob -> video short description framerate")];
         }
     }
     else
@@ -728,11 +730,11 @@ static NSDictionary            *shortHeightAttr;
         NSUInteger count = self.audio.tracks.count - 3;
         if (count == 1)
         {
-            [info appendString:NSLocalizedString(@"+ 1 additional audio track", @"HBJob -> audio short description")];
+            [info appendString:HBKitLocalizedString(@"+ 1 additional audio track", @"HBJob -> audio short description")];
         }
         else
         {
-            [info appendFormat:NSLocalizedString(@"+ %lu additional audio tracks", @"HBJob -> audio short description"), (unsigned long)count];
+            [info appendFormat:HBKitLocalizedString(@"+ %lu additional audio tracks", @"HBJob -> audio short description"), (unsigned long)count];
         }
     }
 
@@ -759,7 +761,7 @@ static NSDictionary            *shortHeightAttr;
 
             if (track.burnedIn)
             {
-                [info appendString:NSLocalizedString(@", Burned", @"HBJob -> subtitles short description")];
+                [info appendString:HBKitLocalizedString(@", Burned", @"HBJob -> subtitles short description")];
             }
 
             [info appendString:@"\n"];
@@ -776,11 +778,11 @@ static NSDictionary            *shortHeightAttr;
         NSUInteger count = self.subtitles.tracks.count - 3;
         if (count == 1)
         {
-            [info appendString:NSLocalizedString(@"+ 1 additional subtitles track", @"HBJob -> subtitles short description")];
+            [info appendString:HBKitLocalizedString(@"+ 1 additional subtitles track", @"HBJob -> subtitles short description")];
         }
         else
         {
-            [info appendFormat:NSLocalizedString(@"+ %lu additional subtitles tracks", @"HBJob -> subtitles short description"), (unsigned long)count];
+            [info appendFormat:HBKitLocalizedString(@"+ %lu additional subtitles tracks", @"HBJob -> subtitles short description"), (unsigned long)count];
         }
     }
 
@@ -815,7 +817,7 @@ static NSDictionary            *shortHeightAttr;
     if (self.chaptersEnabled && self.chapterTitles.count > 1)
     {
         [info appendString:@"\n"];
-        [info appendString:NSLocalizedString(@"Chapter Markers", @"HBJob -> chapters short description")];
+        [info appendString:HBKitLocalizedString(@"Chapter Markers", @"HBJob -> chapters short description")];
     }
 
     return info;
@@ -829,14 +831,14 @@ static NSDictionary            *shortHeightAttr;
     // Detelecine
     if (![filters.detelecine isEqualToString:@"off"])
     {
-        [summary appendString:NSLocalizedString(@"Detelecine", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"Detelecine", @"HBJob -> filters short description")];
         [summary appendString:@", "];
     }
 
     // Comb detect
     if (![filters.combDetection isEqualToString:@"off"])
     {
-        [summary appendString:NSLocalizedString(@"Comb Detect", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"Comb Detect", @"HBJob -> filters short description")];
         [summary appendString:@", "];
     }
 
@@ -855,7 +857,7 @@ static NSDictionary            *shortHeightAttr;
     // Deblock
     if (filters.deblock > 0)
     {
-        [summary appendString:NSLocalizedString(@"Deblock", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"Deblock", @"HBJob -> filters short description")];
         [summary appendString:@", "];
     }
 
@@ -884,14 +886,14 @@ static NSDictionary            *shortHeightAttr;
     // Grayscale
     if (filters.grayscale)
     {
-        [summary appendString:NSLocalizedString(@"Grayscale", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"Grayscale", @"HBJob -> filters short description")];
         [summary appendString:@", "];
     }
 
     // Rotation
     if (filters.rotate || filters.flip)
     {
-        [summary appendString:NSLocalizedString(@"Rotation", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"Rotation", @"HBJob -> filters short description")];
         [summary appendString:@", "];
     }
 
@@ -902,7 +904,7 @@ static NSDictionary            *shortHeightAttr;
 
     if (summary.length == 0)
     {
-        [summary appendString:NSLocalizedString(@"None", @"HBJob -> filters short description")];
+        [summary appendString:HBKitLocalizedString(@"None", @"HBJob -> filters short description")];
     }
 
     return summary;
@@ -922,11 +924,11 @@ static NSDictionary            *shortHeightAttr;
     int container = [value intValue];
     if (container & HB_MUX_MASK_MP4)
     {
-        return NSLocalizedString(@"MP4 File", @"HBJob -> Format display name");
+        return HBKitLocalizedString(@"MP4 File", @"HBJob -> Format display name");
     }
     else if (container & HB_MUX_MASK_MKV)
     {
-        return NSLocalizedString(@"MKV File", @"HBJob -> Format display name");
+        return HBKitLocalizedString(@"MKV File", @"HBJob -> Format display name");
     }
     else
     {
@@ -949,11 +951,11 @@ static NSDictionary            *shortHeightAttr;
 
 - (id)reverseTransformedValue:(id)value
 {
-    if ([value isEqualToString:NSLocalizedString(@"MP4 File", @"HBJob -> Format display name")])
+    if ([value isEqualToString:HBKitLocalizedString(@"MP4 File", @"HBJob -> Format display name")])
     {
         return @(HB_MUX_AV_MP4);
     }
-    else if ([value isEqualToString:NSLocalizedString(@"MKV File", @"HBJob -> Format display name")])
+    else if ([value isEqualToString:HBKitLocalizedString(@"MKV File", @"HBJob -> Format display name")])
     {
         return @(HB_MUX_AV_MKV);
     }
index ccebe8a0c52561cab0604a0ce7890cd2ece78c88..beb7e587509891e83cc874ab0ca24ca578a31258 100644 (file)
@@ -13,6 +13,7 @@
 #import "HBMutablePreset.h"
 
 #import "HBCodingUtilities.h"
+#import "HBLocalizationUtilities.h"
 #import "HBUtilities.h"
 #import "HBSecurityAccessToken.h"
 
@@ -178,8 +179,8 @@ NSString *HBChaptersChangedNotification  = @"HBChaptersChangedNotification";
         {
             if (outError)
             {
-                *outError = [NSError errorWithDomain:@"HBError" code:0 userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid name", @"HBJob -> invalid name error description"),
-                                                                                  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"The file name can't contain the / character.", @"HBJob -> invalid name error recovery suggestion")}];
+                *outError = [NSError errorWithDomain:@"HBError" code:0 userInfo:@{NSLocalizedDescriptionKey: HBKitLocalizedString(@"Invalid name", @"HBJob -> invalid name error description"),
+                                                                                  NSLocalizedRecoverySuggestionErrorKey: HBKitLocalizedString(@"The file name can't contain the / character.", @"HBJob -> invalid name error recovery suggestion")}];
             }
             return NO;
         }
diff --git a/macosx/HBLocalizationUtilities.h b/macosx/HBLocalizationUtilities.h
new file mode 100644 (file)
index 0000000..6db55dc
--- /dev/null
@@ -0,0 +1,15 @@
+//
+//  HBLocalizationUtilities.h
+//  HandBrakeKit
+//
+//  Created by Damiano Galassi on 20/10/2018.
+//
+
+#ifndef HBLocalizationUtilities_h
+#define HBLocalizationUtilities_h
+
+#define HBKitLocalizedString(key, comment) \
+[[NSBundle bundleForClass:self.class] localizedStringForKey:(key) value:@"" table:nil]
+
+
+#endif /* HBLocalizationUtilities_h */
index 39b0d378db9b2aec02320eba64f74d5d0f2afcdf..23d3e8b0fa449b1f15566fb8f176839a3a68eb59 100644 (file)
@@ -6,6 +6,8 @@
 
 #import "HBPicture+UIAdditions.h"
 #import "HBTitle.h"
+#import "HBLocalizationUtilities.h"
+
 #include "hb.h"
 
 @implementation HBPicture (UIAdditions)
@@ -91,7 +93,7 @@
 
 - (NSString *)shortInfo
 {
-    return [NSString stringWithFormat:NSLocalizedString(@"%dx%d Storage, %dx%d Display", @"HBPicture -> short info"), self.width, self.height, self.displayWidth, self.height];
+    return [NSString stringWithFormat:HBKitLocalizedString(@"%dx%d Storage, %dx%d Display", @"HBPicture -> short info"), self.width, self.height, self.displayWidth, self.height];
 }
 
 + (NSSet<NSString *> *)keyPathsForValuesAffectingSummary
index 4d3c2f0952c9b3f1030f95a795ed183f2ea45099..98d424253bc1d401ca44ca70ae9afe04352a3c1d 100644 (file)
@@ -10,6 +10,7 @@
 #include "preset.h"
 
 #import "NSJSONSerialization+HBAdditions.h"
+#import "HBLocalizationUtilities.h"
 
 @interface HBPreset ()
 
 
 - (NSError *)invalidPresetErrorForUrl:(NSURL *)url
 {
-    NSString *description = [NSString stringWithFormat:NSLocalizedString(@"The preset \"%@\" could not be imported.", @"Preset -> import error description"),
+    NSString *description = [NSString stringWithFormat:HBKitLocalizedString(@"The preset \"%@\" could not be imported.", @"Preset -> import error description"),
                              url.lastPathComponent];
-    NSString *reason = NSLocalizedString(@"The selected preset is invalid.", @"Preset -> import error reason");
+    NSString *reason = HBKitLocalizedString(@"The selected preset is invalid.", @"Preset -> import error reason");
 
     return [NSError errorWithDomain:@"HBPresetDomain" code:1 userInfo:@{NSLocalizedDescriptionKey: description,
                                                                         NSLocalizedRecoverySuggestionErrorKey: reason}];
 
 - (NSError *)newerPresetErrorForUrl:(NSURL *)url
 {
-    NSString *description = [NSString stringWithFormat:NSLocalizedString(@"The preset \"%@\" could not be imported.", @"Preset -> import error description"),
+    NSString *description = [NSString stringWithFormat:HBKitLocalizedString(@"The preset \"%@\" could not be imported.", @"Preset -> import error description"),
                              url.lastPathComponent];
-    NSString *reason = NSLocalizedString(@"The selected preset was created with a newer version of HandBrake.",  @"Preset -> import error reason");
+    NSString *reason = HBKitLocalizedString(@"The selected preset was created with a newer version of HandBrake.",  @"Preset -> import error reason");
 
     return [NSError errorWithDomain:@"HBPresetDomain" code:2 userInfo:@{NSLocalizedDescriptionKey: description,
                                                                         NSLocalizedRecoverySuggestionErrorKey: reason}];
index 04c7bfdac6c0e413b4ab23f21c826bc4f86b474f..f574225a386f985c038b6ee5821b49f15713e726 100644 (file)
@@ -6,6 +6,7 @@
 
 #import "HBRange+UIAdditions.h"
 #import "HBTitle.h"
+#import "HBLocalizationUtilities.h"
 
 @implementation HBRange (UIAdditions)
 
@@ -20,9 +21,9 @@
 
 - (NSArray *)types
 {
-    return @[NSLocalizedString(@"Chapters", @"HBRange -> display name"),
-             NSLocalizedString(@"Seconds", @"HBRange -> display name"),
-             NSLocalizedString(@"Frames", @"HBRange -> display name")];
+    return @[HBKitLocalizedString(@"Chapters", @"HBRange -> display name"),
+             HBKitLocalizedString(@"Seconds", @"HBRange -> display name"),
+             HBKitLocalizedString(@"Frames", @"HBRange -> display name")];
 }
 
 - (BOOL)chaptersSelected
index d02484a745196babb552034a9c74be30606aaf9f..f00b4fb5613ec7a23461c1b6b84cc588f434fbf0 100644 (file)
@@ -7,6 +7,7 @@
 //
 
 #import "HBStateFormatter+Private.h"
+#import "HBLocalizationUtilities.h"
 
 @implementation HBStateFormatter (Private)
 
         case HB_STATE_SEARCHING:
         {
             [string appendFormat:
-             NSLocalizedString(@"Searching for start point:  %.2f %%", @"HBStateFormatter -> search pass display name"),
+             HBKitLocalizedString(@"Searching for start point:  %.2f %%", @"HBStateFormatter -> search pass display name"),
              100.0 * p.progress];
 
             if (p.seconds > -1)
             {
-                [string appendFormat:NSLocalizedString(@" (ETA %02dh%02dm%02ds)", @"HBStateFormatter -> search time format"), p.hours, p.minutes, p.seconds];
+                [string appendFormat:HBKitLocalizedString(@" (ETA %02dh%02dm%02ds)", @"HBStateFormatter -> search time format"), p.hours, p.minutes, p.seconds];
             }
 
             break;
@@ -34,7 +35,7 @@
 
         case HB_STATE_WORKING:
         {
-            [string appendFormat:NSLocalizedString(@"Encoding %@ ", @"HBStateFormatter -> work pass display name"), self.title];
+            [string appendFormat:HBKitLocalizedString(@"Encoding %@ ", @"HBStateFormatter -> work pass display name"), self.title];
 
             if (self.twoLines)
             {
                 if (p.pass_id == HB_PASS_SUBTITLE)
                 {
                     [string appendFormat:
-                     NSLocalizedString(@"Pass %d %@ of %d, %.2f %%", @"HBStateFormatter -> work pass number format"),
+                     HBKitLocalizedString(@"Pass %d %@ of %d, %.2f %%", @"HBStateFormatter -> work pass number format"),
                      p.pass,
-                     NSLocalizedString(@"(subtitle scan)", @"HBStateFormatter -> work pass type format"),
+                     HBKitLocalizedString(@"(subtitle scan)", @"HBStateFormatter -> work pass type format"),
                      p.pass_count, 100.0 * p.progress];
                 }
                 else
                 {
                     [string appendFormat:
-                     NSLocalizedString(@"Pass %d of %d, %.2f %%", @"HBStateFormatter -> work pass number format"),
+                     HBKitLocalizedString(@"Pass %d of %d, %.2f %%", @"HBStateFormatter -> work pass number format"),
                      p.pass, p.pass_count, 100.0 * p.progress];
                 }
             }
                 if (p.rate_cur > 0.0)
                 {
                     [string appendFormat:
-                     NSLocalizedString(@" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"HBStateFormatter -> work time format"),
+                     HBKitLocalizedString(@" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"HBStateFormatter -> work time format"),
                      p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds];
                 }
                 else
                 {
                     [string appendFormat:
-                     NSLocalizedString(@" (ETA %02dh%02dm%02ds)", @"HBStateFormatter -> work time format"),
+                     HBKitLocalizedString(@" (ETA %02dh%02dm%02ds)", @"HBStateFormatter -> work time format"),
                      p.hours, p.minutes, p.seconds];
                 }
             }
 
         case HB_STATE_MUXING:
         {
-            [string appendString:NSLocalizedString(@"Muxing…", @"HBStateFormatter -> pass display name")];
+            [string appendString:HBKitLocalizedString(@"Muxing…", @"HBStateFormatter -> pass display name")];
             break;
         }
 
         case HB_STATE_PAUSED:
         {
-            [string appendString:NSLocalizedString(@"Paused", @"HBStateFormatter -> pass display name")];
+            [string appendString:HBKitLocalizedString(@"Paused", @"HBStateFormatter -> pass display name")];
             break;
         }
 
             if (p.preview_cur)
             {
                 [string appendFormat:
-                 NSLocalizedString(@"Scanning title %d of %d, preview %d…", @"HBStateFormatter -> scan pass format"),
+                 HBKitLocalizedString(@"Scanning title %d of %d, preview %d…", @"HBStateFormatter -> scan pass format"),
                  p.title_cur, p.title_count,
                  p.preview_cur];
             }
             else
             {
                 [string appendFormat:
-                 NSLocalizedString(@"Scanning title %d of %d…", @"HBStateFormatter -> scan pass format"),
+                 HBKitLocalizedString(@"Scanning title %d of %d…", @"HBStateFormatter -> scan pass format"),
                  p.title_cur, p.title_count];
             }
 #undef p
index 39f9d20b8d7296530867c5155a8726744555a0ec..3193045b7d834b068d12b71a17988443eb83ceb0 100644 (file)
@@ -13,6 +13,7 @@
 #import "HBJob+HBJobConversion.h"
 #import "HBTitle.h"
 #import "HBCodingUtilities.h"
+#import "HBLocalizationUtilities.h"
 #import "HBUtilities.h"
 #import "HBJob+Private.h"
 #import "HBSecurityAccessToken.h"
@@ -63,10 +64,10 @@ extern NSString *keySubTrackSrtFileURLBookmark;
         int foreignAudioType = VOBSUB;
 
         // now set the name of the Foreign Audio Search track
-        NSMutableString *foreignAudioSearchTrackName = [NSLocalizedString(@"Foreign Audio Search", "HBSubtitles -> search pass name") mutableCopy];
+        NSMutableString *foreignAudioSearchTrackName = [HBKitLocalizedString(@"Foreign Audio Search", "HBSubtitles -> search pass name") mutableCopy];
 
         // Add the none and foreign track to the source array
-        NSDictionary *none = @{ keySubTrackName: NSLocalizedString(@"None", @"HBSubtitles -> none track name")};
+        NSDictionary *none = @{ keySubTrackName: HBKitLocalizedString(@"None", @"HBSubtitles -> none track name")};
         [sourceTracks insertObject:none atIndex:0];
 
         NSDictionary *foreign = @{ keySubTrackName: [foreignAudioSearchTrackName copy],
index 0782578336bef123cc7f0e0e3a1056cf3a18ebbf..7a34612eb7dccc2fc843fe43cb1dbb1a0aef79a1 100644 (file)
@@ -9,6 +9,7 @@
 #import "HBChapter.h"
 #import "HBPreset.h"
 #import "NSDictionary+HBAdditions.h"
+#import "HBLocalizationUtilities.h"
 
 #include "lang.h"
 
@@ -149,18 +150,18 @@ extern NSString *keySubTrackType;
 
     [format appendString:@", "];
 
-    [format appendFormat:NSLocalizedString(@"%.6g FPS", @"Title short description -> video format"), _hb_title->vrate.num / (double)_hb_title->vrate.den];
+    [format appendFormat:HBKitLocalizedString(@"%.6g FPS", @"Title short description -> video format"), _hb_title->vrate.num / (double)_hb_title->vrate.den];
 
     hb_list_t *audioList = _hb_title->list_audio;
     int audioCount = hb_list_count(audioList);
 
     if (audioCount > 1)
     {
-        [format appendFormat:NSLocalizedString(@", %d audio tracks", @"Title short description -> audio format"), audioCount];
+        [format appendFormat:HBKitLocalizedString(@", %d audio tracks", @"Title short description -> audio format"), audioCount];
     }
     else if (audioCount == 1)
     {
-        [format appendFormat:NSLocalizedString(@", 1 audio track", @"Title short description -> audio format")];
+        [format appendString:HBKitLocalizedString(@", 1 audio track", @"Title short description -> audio format")];
     }
 
     hb_list_t *subList = _hb_title->list_subtitle;
@@ -168,11 +169,11 @@ extern NSString *keySubTrackType;
 
     if (subCount > 1)
     {
-        [format appendFormat:NSLocalizedString(@", %d subtitles tracks", @"Title short description -> subtitles format"), subCount];
+        [format appendFormat:HBKitLocalizedString(@", %d subtitles tracks", @"Title short description -> subtitles format"), subCount];
     }
     else if (subCount == 1)
     {
-        [format appendFormat:NSLocalizedString(@", 1 subtitles track", @"Title short description -> subtitles format")];
+        [format appendString:HBKitLocalizedString(@", 1 subtitles track", @"Title short description -> subtitles format")];
     }
 
     return format;
@@ -322,7 +323,7 @@ extern NSString *keySubTrackType;
                 }
                 else
                 {
-                    title = [NSString stringWithFormat:NSLocalizedString(@"Chapter %d", "Title -> chapter name"), i + 1];
+                    title = [NSString stringWithFormat:HBKitLocalizedString(@"Chapter %d", "Title -> chapter name"), i + 1];
                 }
 
                 [chapters addObject:[[HBChapter alloc] initWithTitle:title
index b16572990c8e89c8c332f6698e6d28a735719feb..f330e352622c937f23f302e87885f7fc0ee5fc56 100644 (file)
@@ -6,6 +6,8 @@
 
 #import "HBVideo+UIAdditions.h"
 #import "HBJob+Private.h"
+#import "HBLocalizationUtilities.h"
+
 #include "hb.h"
 
 @implementation HBVideo (UIAdditions)
@@ -43,7 +45,7 @@
 {
     NSMutableArray *framerates = [NSMutableArray array];
 
-    [framerates addObject:NSLocalizedString(@"Same as source", @"HBVideo -> frame rates display name")];
+    [framerates addObject:HBKitLocalizedString(@"Same as source", @"HBVideo -> frame rates display name")];
 
     for (const hb_rate_t *video_framerate = hb_video_framerate_get_next(NULL);
          video_framerate != NULL;
     }
     else
     {
-        return NSLocalizedString(@"Same as source", @"HBVideo -> frame rates display name");
+        return HBKitLocalizedString(@"Same as source", @"HBVideo -> frame rates display name");
     }
 }
 
 
 - (id)reverseTransformedValue:(id)value
 {
-    if ([value isEqualTo:NSLocalizedString(@"Same as source", @"HBVideo -> frame rates display name")])
+    if ([value isEqualTo:HBKitLocalizedString(@"Same as source", @"HBVideo -> frame rates display name")])
     {
         return @0;
     }
index 858951e7c8b42071985260834643dbb907b734cf..0de1deade96f7790867101e4571635b9f95310e1 100644 (file)
                A9ABD1A71E2A0F7500EC8B65 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9ABD1A51E2A0F0700EC8B65 /* CoreText.framework */; };
                A9ABD1A91E2A0F8200EC8B65 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9ABD1A81E2A0F8200EC8B65 /* CoreGraphics.framework */; };
                A9ABD1AA1E2A0F8F00EC8B65 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9ABD1A81E2A0F8200EC8B65 /* CoreGraphics.framework */; };
+               A9B6B9EE217B38D200B957AE /* HBLocalizationUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = A9B6B9ED217B38D200B957AE /* HBLocalizationUtilities.h */; };
+               A9B6B9F1217B408E00B957AE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A9B6B9EF217B408E00B957AE /* InfoPlist.strings */; };
+               A9B6B9F4217B408E00B957AE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A9B6B9F2217B408E00B957AE /* Localizable.strings */; };
                A9BC24C91A69293E007DC41A /* HBAttributedStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A9BC24C81A69293E007DC41A /* HBAttributedStringAdditions.m */; };
                A9CE0A921F57EC3400724577 /* HBImageUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CE0A911F57EC3400724577 /* HBImageUtilities.m */; };
                A9CF25F71990D6820023F727 /* HBPresetsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CF25F61990D6820023F727 /* HBPresetsViewController.m */; };
                A9ABD1A51E2A0F0700EC8B65 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
                A9ABD1A81E2A0F8200EC8B65 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
                A9B34D74197696FE00871B7D /* DiskArbitration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiskArbitration.framework; path = System/Library/Frameworks/DiskArbitration.framework; sourceTree = SDKROOT; };
+               A9B6B9ED217B38D200B957AE /* HBLocalizationUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBLocalizationUtilities.h; sourceTree = "<group>"; };
+               A9B6B9F0217B408E00B957AE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+               A9B6B9F3217B408E00B957AE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
                A9BC24C71A69293E007DC41A /* HBAttributedStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAttributedStringAdditions.h; sourceTree = "<group>"; };
                A9BC24C81A69293E007DC41A /* HBAttributedStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAttributedStringAdditions.m; sourceTree = "<group>"; };
                A9C183931A716B8F00C897C2 /* HBTitleSelectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBTitleSelectionController.h; sourceTree = "<group>"; };
                                A9CE0A931F57EC4600724577 /* HBImageUtilities.h */,
                                A9CE0A911F57EC3400724577 /* HBImageUtilities.m */,
                                A9160A331AE7A165009A7818 /* HBCodingUtilities.h */,
+                               A9B6B9ED217B38D200B957AE /* HBLocalizationUtilities.h */,
                                A997D8EB1A4ABB0900E19B6F /* HBPresetCoding.h */,
                                A975C08C1AE8C5270061870D /* HBStateFormatter.h */,
                                A975C08D1AE8C5270061870D /* HBStateFormatter.m */,
                                A9AA44791970664A00D7DEFC /* HBUtilities.m */,
                                A9736F041C7DA5FE008F1D18 /* HandBrakeKit.h */,
                                A9736F061C7DA5FE008F1D18 /* Info.plist */,
+                               A9B6B9F2217B408E00B957AE /* Localizable.strings */,
+                               A9B6B9EF217B408E00B957AE /* InfoPlist.strings */,
                        );
                        path = HandBrakeKit;
                        sourceTree = "<group>";
                                A98B8E241C7DD2A200B810C9 /* HBPresetCoding.h in Headers */,
                                A9294CC91DC4BBF7004D3415 /* HBJob+Private.h in Headers */,
                                A91CE2FE1C7DB99D0068F46F /* HBTreeNode.h in Headers */,
+                               A9B6B9EE217B38D200B957AE /* HBLocalizationUtilities.h in Headers */,
                                A91D54871E378ABD006D0997 /* HBSecurityAccessToken.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               A9B6B9F1217B408E00B957AE /* InfoPlist.strings in Resources */,
+                               A9B6B9F4217B408E00B957AE /* Localizable.strings in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        name = HBPreviewViewController.xib;
                        sourceTree = "<group>";
                };
+               A9B6B9EF217B408E00B957AE /* InfoPlist.strings */ = {
+                       isa = PBXVariantGroup;
+                       children = (
+                               A9B6B9F0217B408E00B957AE /* de */,
+                       );
+                       name = InfoPlist.strings;
+                       sourceTree = "<group>";
+               };
+               A9B6B9F2217B408E00B957AE /* Localizable.strings */ = {
+                       isa = PBXVariantGroup;
+                       children = (
+                               A9B6B9F3217B408E00B957AE /* de */,
+                       );
+                       name = Localizable.strings;
+                       sourceTree = "<group>";
+               };
 /* End PBXVariantGroup section */
 
 /* Begin XCBuildConfiguration section */
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
+                               LOCALIZED_STRING_MACRO_NAMES = (
+                                       NSLocalizedString,
+                                       CFLocalizedString,
+                                       HBKitLocalizedString,
+                               );
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                OTHER_LDFLAGS = (
                                        "-filelist",
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
+                               LOCALIZED_STRING_MACRO_NAMES = (
+                                       NSLocalizedString,
+                                       CFLocalizedString,
+                                       HBKitLocalizedString,
+                               );
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                OTHER_LDFLAGS = (
                                        "-filelist",
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
+                               LOCALIZED_STRING_MACRO_NAMES = (
+                                       NSLocalizedString,
+                                       CFLocalizedString,
+                                       HBKitLocalizedString,
+                               );
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                OTHER_LDFLAGS = (
                                        "-filelist",
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                GCC_WARN_UNUSED_VARIABLE = YES;
+                               LOCALIZED_STRING_MACRO_NAMES = (
+                                       NSLocalizedString,
+                                       CFLocalizedString,
+                                       HBKitLocalizedString,
+                               );
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                OTHER_LDFLAGS = (
                                        "-filelist",