diff --git a/QuickLocalization.xcodeproj/project.pbxproj b/QuickLocalization.xcodeproj/project.pbxproj index 032f6de..83da123 100644 --- a/QuickLocalization.xcodeproj/project.pbxproj +++ b/QuickLocalization.xcodeproj/project.pbxproj @@ -7,6 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + 0966970B1B5A20C200D29654 /* AMMenuGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0966970A1B5A20C200D29654 /* AMMenuGenerator.m */; }; + 0966970D1B5A20C900D29654 /* MenuItemData.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0966970C1B5A20C900D29654 /* MenuItemData.plist */; }; + 096697101B5A214400D29654 /* AMConstString.m in Sources */ = {isa = PBXBuildFile; fileRef = 0966970F1B5A214400D29654 /* AMConstString.m */; }; + 099474BA1B5A1F3000E39E3C /* OLSettingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 099474B81B5A1F3000E39E3C /* OLSettingController.m */; }; + 099474BB1B5A1F3000E39E3C /* OLSettingController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 099474B91B5A1F3000E39E3C /* OLSettingController.xib */; }; 09A343C6174068E600A713EE /* RCXcode.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A343C5174068E200A713EE /* RCXcode.m */; }; 09EC581817E3B6E1002261C4 /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 09EC581717E3B6E1002261C4 /* icon.icns */; }; 09F65636174041010000486B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09F65635174041010000486B /* AppKit.framework */; }; @@ -16,6 +21,14 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 096697091B5A20C200D29654 /* AMMenuGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AMMenuGenerator.h; sourceTree = ""; }; + 0966970A1B5A20C200D29654 /* AMMenuGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AMMenuGenerator.m; sourceTree = ""; }; + 0966970C1B5A20C900D29654 /* MenuItemData.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = MenuItemData.plist; sourceTree = ""; }; + 0966970E1B5A214400D29654 /* AMConstString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AMConstString.h; sourceTree = ""; }; + 0966970F1B5A214400D29654 /* AMConstString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AMConstString.m; sourceTree = ""; }; + 099474B71B5A1F3000E39E3C /* OLSettingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OLSettingController.h; sourceTree = ""; }; + 099474B81B5A1F3000E39E3C /* OLSettingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OLSettingController.m; sourceTree = ""; }; + 099474B91B5A1F3000E39E3C /* OLSettingController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OLSettingController.xib; sourceTree = ""; }; 09A343C4174068E200A713EE /* RCXcode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCXcode.h; sourceTree = ""; }; 09A343C5174068E200A713EE /* RCXcode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCXcode.m; sourceTree = ""; }; 09EC581717E3B6E1002261C4 /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = ""; }; @@ -75,7 +88,15 @@ 09F65640174041010000486B /* QuickLocalization.m */, 09A343C4174068E200A713EE /* RCXcode.h */, 09A343C5174068E200A713EE /* RCXcode.m */, + 0966970C1B5A20C900D29654 /* MenuItemData.plist */, + 0966970E1B5A214400D29654 /* AMConstString.h */, + 0966970F1B5A214400D29654 /* AMConstString.m */, + 096697091B5A20C200D29654 /* AMMenuGenerator.h */, + 0966970A1B5A20C200D29654 /* AMMenuGenerator.m */, 09F6563A174041010000486B /* Supporting Files */, + 099474B71B5A1F3000E39E3C /* OLSettingController.h */, + 099474B81B5A1F3000E39E3C /* OLSettingController.m */, + 099474B91B5A1F3000E39E3C /* OLSettingController.xib */, ); path = QuickLocalization; sourceTree = ""; @@ -142,7 +163,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 099474BB1B5A1F3000E39E3C /* OLSettingController.xib in Resources */, 09F6563E174041010000486B /* InfoPlist.strings in Resources */, + 0966970D1B5A20C900D29654 /* MenuItemData.plist in Resources */, 09EC581817E3B6E1002261C4 /* icon.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -155,6 +178,9 @@ buildActionMask = 2147483647; files = ( 09F65641174041010000486B /* QuickLocalization.m in Sources */, + 096697101B5A214400D29654 /* AMConstString.m in Sources */, + 099474BA1B5A1F3000E39E3C /* OLSettingController.m in Sources */, + 0966970B1B5A20C200D29654 /* AMMenuGenerator.m in Sources */, 09A343C6174068E600A713EE /* RCXcode.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/QuickLocalization/AMConstString.h b/QuickLocalization/AMConstString.h new file mode 100644 index 0000000..f9363f6 --- /dev/null +++ b/QuickLocalization/AMConstString.h @@ -0,0 +1,32 @@ +// +// AMConstString.h +// AMMethod2Implement +// +// Created by JohnnyLiu on 15/4/1. +// Copyright (c) 2015年 Tendencystudio. All rights reserved. +// + +#import + + +extern NSString * const kDeclareMap; +extern NSString * const kImplementMap; +extern NSString * const kImplementContent; + +extern NSString * const kSelectTextType; +extern NSString * const kSelectTextFirstSelectMethod; + +extern NSString * const kMenuRootMenuTitle; +extern NSString * const kMenuPluginTitle; +extern NSString * const kMenuSubMenuItems; +extern NSString * const kMenuTitle; +extern NSString * const kMenuSelector; +extern NSString * const kMenuShortcut; +extern NSString * const kMenuKeyMask; +extern NSString * const kMenuKeyEquivalent; + +extern NSString * const kMenuActionTitle; + +extern NSString * const kQLFormatStringKey; +extern NSString * const kQLFormatStringCommentSameKey; +extern NSString * const kQLFormatStringSwiftSyntax; \ No newline at end of file diff --git a/QuickLocalization/AMConstString.m b/QuickLocalization/AMConstString.m new file mode 100644 index 0000000..8a43e19 --- /dev/null +++ b/QuickLocalization/AMConstString.m @@ -0,0 +1,32 @@ +// +// AMConstString.m +// AMMethod2Implement +// +// Created by JohnnyLiu on 15/4/1. +// Copyright (c) 2015年 Tendencystudio. All rights reserved. +// + +#import "AMConstString.h" + + +NSString * const kDeclareMap = @"declareMap"; +NSString * const kImplementMap = @"implementMap"; +NSString * const kImplementContent = @"implementContent"; + +NSString * const kSelectTextType = @"type"; +NSString * const kSelectTextFirstSelectMethod = @"firstSelectMethod"; + +NSString * const kMenuRootMenuTitle = @"rootMenuTitle"; +NSString * const kMenuPluginTitle = @"pluginTitle"; +NSString * const kMenuSubMenuItems = @"subMenuItems"; +NSString * const kMenuTitle = @"title"; +NSString * const kMenuSelector = @"selector"; +NSString * const kMenuShortcut = @"shortcut"; +NSString * const kMenuKeyMask = @"keyMask"; +NSString * const kMenuKeyEquivalent = @"keyEquivalent"; + +NSString * const kMenuActionTitle = @"Implement Mehod"; + +NSString * const kQLFormatStringKey = @"KQLFormatStringKey"; +NSString * const kQLFormatStringCommentSameKey = @"KQLFormatStringKey"; +NSString * const kQLFormatStringSwiftSyntax = @"kQLFormatStringSwiftSyntax"; \ No newline at end of file diff --git a/QuickLocalization/AMMenuGenerator.h b/QuickLocalization/AMMenuGenerator.h new file mode 100644 index 0000000..7d892d0 --- /dev/null +++ b/QuickLocalization/AMMenuGenerator.h @@ -0,0 +1,16 @@ +// +// AMMenuGenerator.h +// AMMethod2Implement +// +// Created by JohnnyLiu on 15/4/1. +// Copyright (c) 2015年 Tendencystudio. All rights reserved. +// + +#import + +@interface AMMenuGenerator : NSObject + ++ (void)generateMenuItems:(NSBundle *)bundle version:(NSString *)version target:(id)target; ++ (NSUInteger)getKeyEquivalentModifierMaskWithKey:(NSString *)key; + +@end diff --git a/QuickLocalization/AMMenuGenerator.m b/QuickLocalization/AMMenuGenerator.m new file mode 100644 index 0000000..07324ed --- /dev/null +++ b/QuickLocalization/AMMenuGenerator.m @@ -0,0 +1,75 @@ +// +// AMMenuGenerator.m +// AMMethod2Implement +// +// Created by JohnnyLiu on 15/4/1. +// Copyright (c) 2015年 Tendencystudio. All rights reserved. +// + +#import "AMMenuGenerator.h" +#import "RCXcode.h" + +@implementation AMMenuGenerator + ++ (void)generateMenuItems:(NSBundle *)bundle version:(NSString *)version target:(id)target +{ + NSString *dataPath = [bundle pathForResource:@"MenuItemData" ofType:@"plist"]; + NSDictionary *menuData = [NSDictionary dictionaryWithContentsOfFile:dataPath]; + NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:menuData[kMenuRootMenuTitle]]; + + if (menuItem) { + + [[menuItem submenu] addItem:[NSMenuItem separatorItem]]; + NSString *title = menuData[kMenuPluginTitle]; + NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""]; + [[menuItem submenu] addItem:actionMenuItem]; + NSMenu* submenu = [[NSMenu alloc] init]; + [actionMenuItem setSubmenu:submenu]; + for (NSDictionary *item in menuData[kMenuSubMenuItems]) { + NSString *subMenuTitle = item[kMenuTitle]; + if ([subMenuTitle rangeOfString:@"%@"].length > 0) { + subMenuTitle = [NSString stringWithFormat:subMenuTitle, version]; + } + + NSString *selectorString = item[kMenuSelector]; + SEL selector = nil; + if (selectorString != nil && selectorString.length > 0) { + selector = NSSelectorFromString(selectorString); + } + NSString *keyEquivalent = @""; + if (item[kMenuShortcut][kMenuKeyEquivalent] != nil) { + keyEquivalent = item[kMenuShortcut][kMenuKeyEquivalent]; + } + + NSArray *maskArray = item[kMenuShortcut][kMenuKeyMask]; + NSDictionary *userMenu = [[NSUserDefaults standardUserDefaults] objectForKey:kMenuActionTitle]; + if (userMenu != nil) { + keyEquivalent = userMenu[kMenuKeyEquivalent]; + maskArray = userMenu[kMenuShortcut]; + } + + NSMenuItem *subMenuItem = [[NSMenuItem alloc] initWithTitle:subMenuTitle action:selector keyEquivalent:keyEquivalent]; + + if (maskArray.count == 1) { + subMenuItem.keyEquivalentModifierMask = [AMMenuGenerator getKeyEquivalentModifierMaskWithKey:maskArray[0]]; + }else if(maskArray.count == 2) { + subMenuItem.keyEquivalentModifierMask = [AMMenuGenerator getKeyEquivalentModifierMaskWithKey:maskArray[0]] | + [AMMenuGenerator getKeyEquivalentModifierMaskWithKey:maskArray[1]]; + } + subMenuItem.target = target; + [submenu addItem:subMenuItem]; + } + + } +} + ++ (NSUInteger)getKeyEquivalentModifierMaskWithKey:(NSString *)key +{ + NSDictionary *keyMaskMap = @{@"ctrl":@(NSControlKeyMask), + @"shift":@(NSShiftKeyMask), + @"command":@(NSCommandKeyMask), + @"alt":@(NSAlternateKeyMask)}; + return [keyMaskMap[key] integerValue]; +} + +@end diff --git a/QuickLocalization/MenuItemData.plist b/QuickLocalization/MenuItemData.plist new file mode 100644 index 0000000..2f449dd --- /dev/null +++ b/QuickLocalization/MenuItemData.plist @@ -0,0 +1,40 @@ + + + + + rootMenuTitle + Edit + pluginTitle + Quick Localization + subMenuItems + + + title + Quick Localization + selector + quickLocalization: + shortcut + + keyMask + + ctrl + + keyEquivalent + a + + + + title + Setting + selector + showSettingWindow + + + title + Plugin version %@ + selector + + + + + diff --git a/QuickLocalization/OLSettingController.h b/QuickLocalization/OLSettingController.h new file mode 100644 index 0000000..da19241 --- /dev/null +++ b/QuickLocalization/OLSettingController.h @@ -0,0 +1,14 @@ +// +// OLSettingController.h +// QuickLocalization +// +// Created by Zitao Xiong on 7/18/15. +// Copyright (c) 2015 nanaimostudio. All rights reserved. +// + +#import +extern NSUInteger QL_CountOccurentOfStringWithSubString(NSString *str, NSString *subString); + +@interface OLSettingController : NSWindowController +@property (nonatomic, weak) NSBundle *bundle; +@end diff --git a/QuickLocalization/OLSettingController.m b/QuickLocalization/OLSettingController.m new file mode 100644 index 0000000..c8e9424 --- /dev/null +++ b/QuickLocalization/OLSettingController.m @@ -0,0 +1,138 @@ +// +// OLSettingController.m +// QuickLocalization +// +// Created by Zitao Xiong on 7/18/15. +// Copyright (c) 2015 nanaimostudio. All rights reserved. +// + +#import "OLSettingController.h" + +NSUInteger QL_CountOccurentOfStringWithSubString(NSString *str, NSString *subString) { + NSUInteger count = 0, length = [str length]; + NSRange range = NSMakeRange(0, length); + while(range.location != NSNotFound) + { + range = [str rangeOfString:subString options:0 range:range]; + if(range.location != NSNotFound) + { + range = NSMakeRange(range.location + range.length, length - (range.location + range.length)); + count++; + } + + } + + return count; +} +@interface OLSettingController () +@property (weak) IBOutlet NSTextField *commentTextField; +@property (weak) IBOutlet NSTextField *tableNameTextField; +@property (weak) IBOutlet NSTextField *bunldeTextField; +@property (weak) IBOutlet NSButton *swiftCheckButton; +@property (weak) IBOutlet NSButton *commentSameAsKeyCheckButton; +@property (weak) IBOutlet NSComboBox *comboBox; +@property (weak) IBOutlet NSTextField *previewLabel; +@property (weak) IBOutlet NSButton *commentAsKeyButton; +@property (weak) IBOutlet NSTextField *valueTextField; +@property (weak) IBOutlet NSButton *swiftLocalizationPreviewButton; + +@end + +@implementation OLSettingController + +- (void)windowDidLoad { + [super windowDidLoad]; + [self.comboBox selectItemAtIndex:0]; + [self updatePreviewText]; +} + +- (IBAction)onSaveButton:(id)sender { +} + +- (IBAction)commentDidChange:(id)sender { + [self updatePreviewText]; +} + +- (IBAction)onTableNameChanged:(id)sender { + [self updatePreviewText]; +} + +- (IBAction)onBunldeNameChanged:(id)sender { + [self updatePreviewText]; +} + +- (IBAction)onCommentAsKayButton:(id)sender { + if (self.commentAsKeyButton.state == NSOnState) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kQLFormatStringCommentSameKey]; + } + else { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kQLFormatStringCommentSameKey]; + } + [self updatePreviewText]; +} + +- (IBAction)onValueTextField:(id)sender { + [self updatePreviewText]; +} + +- (IBAction)onSwiftLocalizationPreviewChanged:(id)sender { + if (self.swiftLocalizationPreviewButton.state == NSOnState) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kQLFormatStringSwiftSyntax]; + } + else { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kQLFormatStringSwiftSyntax]; + } + [self updatePreviewText]; +} + +- (IBAction)onComboBoxChanged:(id)sender { + [self updatePreviewText]; +} + +- (NSString *)updatePreviewText { + NSString *formatString = [self.comboBox objectValueOfSelectedItem]; + NSUInteger placeholderCount = QL_CountOccurentOfStringWithSubString(formatString, @"%@"); + + NSString *value = @"\"Hello World\""; + if (self.swiftLocalizationPreviewButton.state == NSOffState) { + value = [NSString stringWithFormat:@"@%@", value]; + } + NSString *comment; + NSString *savedComment; + if ([self.commentAsKeyButton state] == NSOnState) { + comment = [value copy]; + savedComment = @"%@"; + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kQLFormatStringCommentSameKey]; + } + else { + comment = self.commentTextField.stringValue; + savedComment = comment.copy; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kQLFormatStringCommentSameKey]; + } + + NSString *savedFormatString; + if (placeholderCount == 2) { + //swift or object-c + [self.previewLabel setStringValue:[NSString stringWithFormat:formatString, value, comment]]; + savedFormatString = [NSString stringWithFormat:formatString, @"%@", savedComment]; + } + + else if (placeholderCount == 4) { + //object-c from bundle + [self.previewLabel setStringValue:[NSString stringWithFormat:formatString, value, comment, self.tableNameTextField.stringValue, self.bunldeTextField.stringValue]]; + savedFormatString = [NSString stringWithFormat:formatString, @"%@", savedComment, self.tableNameTextField.stringValue, self.bunldeTextField.stringValue]; + } + else if (placeholderCount == 5) { + [self.previewLabel setStringValue:[NSString stringWithFormat:formatString, value, self.tableNameTextField.stringValue, self.bunldeTextField.stringValue, self.valueTextField.stringValue, comment]]; + savedFormatString = [NSString stringWithFormat:formatString, @"%@", self.tableNameTextField.stringValue, self.bunldeTextField.stringValue, self.valueTextField.stringValue, savedComment]; + } + else { + [self.previewLabel setStringValue:@"%@ must be 2, 4, or 5"]; + return @""; + } + + [[NSUserDefaults standardUserDefaults] setObject:savedFormatString forKey:kQLFormatStringKey]; + + return savedFormatString; +} +@end diff --git a/QuickLocalization/OLSettingController.xib b/QuickLocalization/OLSettingController.xib new file mode 100644 index 0000000..d13cea9 --- /dev/null +++ b/QuickLocalization/OLSettingController.xib @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSLocalizedString(%@, %@) + NSLocalizedStringFromTableInBundle(%@, %@, %@, %@) + NSLocalizedString(%@, comment: %@) + NSLocalizedString(%@, tableName: %@, bundle: %@, value: %@, comment: %@) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuickLocalization/QuickLocalization-Info.plist b/QuickLocalization/QuickLocalization-Info.plist index f155d13..da00546 100644 --- a/QuickLocalization/QuickLocalization-Info.plist +++ b/QuickLocalization/QuickLocalization-Info.plist @@ -42,13 +42,22 @@ DVTPlugInCompatibilityUUIDs - E969541F-E6F9-4D25-8158-72DC3545A6C6 - 9F75337B-21B4-4ADC-B558-F9CADF7073A7 - 63FC1C47-140D-42B0-BB4D-A10B2D225574 - 37B30044-3B14-46BA-ABAA-F01000C27B63 - A2E4D43F-41F4-4FB9-BB94-7177011C9AED - C4A681B0-4A26-480E-93EC-1218098B9AA0 - A16FF353-8441-459E-A50C-B071F53F51B7 + AD68E85B-441B-4301-B564-A45E4919A6AD + A2E4D43F-41F4-4FB9-BB94-7177011C9AED + 37B30044-3B14-46BA-ABAA-F01000C27B63 + 63FC1C47-140D-42B0-BB4D-A10B2D225574 + C4A681B0-4A26-480E-93EC-1218098B9AA0 + FEC992CC-CA4A-4CFD-8881-77300FCB848A + 992275C1-432A-4CF7-B659-D84ED6D42D3F + A16FF353-8441-459E-A50C-B071F53F51B7 + 9F75337B-21B4-4ADC-B558-F9CADF7073A7 + 8DC44374-2B35-4C57-A6FE-2AD66A36AAD9 + E969541F-E6F9-4D25-8158-72DC3545A6C6 + AABB7188-E14E-4433-AD3B-5CD791EAD9A3 + 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 + CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 + 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 + 7265231C-39B4-402C-89E1-16167C4CC990 XC4Compatible diff --git a/QuickLocalization/QuickLocalization-Prefix.pch b/QuickLocalization/QuickLocalization-Prefix.pch index ab77351..267613b 100644 --- a/QuickLocalization/QuickLocalization-Prefix.pch +++ b/QuickLocalization/QuickLocalization-Prefix.pch @@ -4,4 +4,5 @@ #ifdef __OBJC__ #import + #import "AMConstString.h" #endif diff --git a/QuickLocalization/QuickLocalization.m b/QuickLocalization/QuickLocalization.m index 9cc1aea..22f4fe3 100644 --- a/QuickLocalization/QuickLocalization.m +++ b/QuickLocalization/QuickLocalization.m @@ -8,6 +8,8 @@ #import "QuickLocalization.h" #import "RCXcode.h" +#import "OLSettingController.h" +#import "AMMenuGenerator.h" static NSString *localizeRegexs[] = { @"NSLocalizedString\\s*\\(\\s*@\"(.*)\"\\s*,\\s*(.*)\\s*\\)", @@ -23,13 +25,16 @@ static NSString *swiftStringRegexs = @"([\"'])(?:(?=(\\\\?))\\2.)*?\\1"; static NSString * const QLShouldUseNilForComment = @"QLShouldUseNilForComment"; static NSString * const QLShouldUseSnippetForComment = @"QLShouldUseSnippetForComment"; static NSString * const QLShouldUseSwiftSyntax = @"QLShouldUseSwiftSyntax"; +static NSString * const QLShouldUseNSLocalizedStringFromTableInBundle = @"QLShouldUseNSLocalizedStringFromTableInBundle"; @interface QuickLocalization () @property (nonatomic, assign) BOOL shouldUseNilForComment; @property (nonatomic, assign) BOOL shouldUseSnippetForComment; @property (nonatomic, assign) BOOL shouldUseSwiftSyntax; - +@property (nonatomic, assign) BOOL shouldUseStringFromTableInBundle; +@property (nonatomic, strong) OLSettingController *settingControlelr; +@property (nonatomic, strong) NSBundle *bundle; @end @implementation QuickLocalization @@ -37,50 +42,78 @@ static NSString * const QLShouldUseSwiftSyntax = @"QLShouldUseSwiftSyntax"; static id sharedPlugin = nil; -+ (void)pluginDidLoad:(NSBundle *)plugin { ++ (void)pluginDidLoad:(NSBundle *)plugin +{ + static id sharedPlugin = nil; static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedPlugin = [[self alloc] init]; - }); + NSString *currentApplicationName = [[NSBundle mainBundle] infoDictionary][@"CFBundleName"]; + if ([currentApplicationName isEqual:@"Xcode"]) { + dispatch_once(&onceToken, ^{ + sharedPlugin = [[self alloc] initWithBundle:plugin]; + }); + } } -- (id)init { +- (id)initWithBundle:(NSBundle *)plugin +{ if (self = [super init]) { - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - NSMenuItem *viewMenuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"]; - if (viewMenuItem) { - [[viewMenuItem submenu] addItem:[NSMenuItem separatorItem]]; - - NSMenuItem *localization = [[NSMenuItem alloc] initWithTitle:@"Quick Localization" action:@selector(quickLocalization) keyEquivalent:@"d"]; - [localization setKeyEquivalentModifierMask:NSShiftKeyMask | NSAlternateKeyMask]; - [localization setTarget:self]; - - NSMenuItem *nilToggle = [[NSMenuItem alloc] initWithTitle:@"Use nil for NSLocalizedString comment" action:@selector(toggleNilOption) keyEquivalent:@""]; - [nilToggle setTarget:self]; - - NSMenuItem *snippetToggle = [[NSMenuItem alloc] initWithTitle:@"Use <# comments #> for NSLocalizedString comment" action:@selector(toggleSnippetOption) keyEquivalent:@""]; - [snippetToggle setTarget:self]; - - NSMenuItem *swiftSyntax = [[NSMenuItem alloc] initWithTitle:@"Swift Localization" action:@selector(toggleSwiftOption) keyEquivalent:@""]; - [swiftSyntax setTarget:self]; - - NSMenu *groupMenu = [[NSMenu alloc] initWithTitle:@"Quick Localization"]; - [groupMenu addItem:localization]; - [groupMenu addItem:nilToggle]; - [groupMenu addItem:snippetToggle]; - [groupMenu addItem:swiftSyntax]; - - NSMenuItem *groupMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quick Localization" action:NULL keyEquivalent:@""]; - [[viewMenuItem submenu] addItem:groupMenuItem]; - [[viewMenuItem submenu] setSubmenu:groupMenu forItem:groupMenuItem]; - } - }]; + // reference to plugin's bundle, for resource acccess + self.bundle = plugin; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationDidFinishLaunching:) + name:NSApplicationDidFinishLaunchingNotification + object:nil]; + + } return self; } +- (void)applicationDidFinishLaunching:(NSNotification *)notification { + [self createMenuItem]; +} + +- (void)createMenuItem { + [AMMenuGenerator generateMenuItems:self.bundle version:[self getBundleVersion] target:self]; + // return; + // [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + // NSMenuItem *viewMenuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"]; + // if (viewMenuItem) { + // [[viewMenuItem submenu] addItem:[NSMenuItem separatorItem]]; + // + // NSMenuItem *localization = [[NSMenuItem alloc] initWithTitle:@"Quick Localization" action:@selector(quickLocalization:) keyEquivalent:@"d"]; + // [localization setKeyEquivalentModifierMask:NSShiftKeyMask | NSAlternateKeyMask]; + // [localization setTarget:self]; + // [localization setTag:0]; + // + // NSMenuItem *shouldUseStringFromTableInBundleToggle = [[NSMenuItem alloc] initWithTitle:@"NSLocalizedStringFromTableInBundle" action:@selector(toggleStringFromTableInBundle) keyEquivalent:@""]; + // [shouldUseStringFromTableInBundleToggle setTarget:self]; + // + // NSMenuItem *nilToggle = [[NSMenuItem alloc] initWithTitle:@"Use nil for NSLocalizedString comment" action:@selector(toggleNilOption) keyEquivalent:@""]; + // [nilToggle setTarget:self]; + // + // NSMenuItem *snippetToggle = [[NSMenuItem alloc] initWithTitle:@"Use <# comments #> for NSLocalizedString comment" action:@selector(toggleSnippetOption) keyEquivalent:@""]; + // [snippetToggle setTarget:self]; + // + // NSMenuItem *swiftSyntax = [[NSMenuItem alloc] initWithTitle:@"Swift Localization" action:@selector(toggleSwiftOption) keyEquivalent:@""]; + // [swiftSyntax setTarget:self]; + // + // NSMenu *groupMenu = [[NSMenu alloc] initWithTitle:@"Quick Localization"]; + // [groupMenu addItem:localization]; + // [groupMenu addItem:nilToggle]; + // [groupMenu addItem:snippetToggle]; + // [groupMenu addItem:swiftSyntax]; + // [groupMenu addItem:shouldUseStringFromTableInBundleToggle]; + // + // NSMenuItem *groupMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quick Localization" action:NULL keyEquivalent:@""]; + // [[viewMenuItem submenu] addItem:groupMenuItem]; + // [[viewMenuItem submenu] setSubmenu:groupMenu forItem:groupMenuItem]; + // } + // }]; +} + // Sample Action, for menu item: -- (void)quickLocalization { +- (void)quickLocalization:(id)sender { IDESourceCodeDocument *document = [RCXcode currentSourceCodeDocument]; NSTextView *textView = [RCXcode currentSourceCodeTextView]; if (!document || !textView) { @@ -94,6 +127,8 @@ static id sharedPlugin = nil; NSRange lineRange = [textView.textStorage.string lineRangeForRange:range]; NSString *line = [textView.textStorage.string substringWithRange:lineRange]; + + NSRegularExpression *localizedRex = [[NSRegularExpression alloc] initWithPattern:localizeRegexs[0] options:NSRegularExpressionCaseInsensitive error:nil]; NSArray *localizedMatches = [localizedRex matchesInString:line options:0 range:NSMakeRange(0, [line length])]; @@ -108,26 +143,22 @@ static id sharedPlugin = nil; continue; } NSString *string = [line substringWithRange:matchedRangeInLine]; -// NSLog(@"string index:%d, %@", i, string); + // NSLog(@"string index:%d, %@", i, string); NSString *outputString; - NSString *swiftAddtion = self.shouldUseSwiftSyntax ? @"comment: " : @""; - - if ([self shouldUseNilForComment]) { - if (self.shouldUseSwiftSyntax) { - outputString = [NSString stringWithFormat:@"NSLocalizedString(%@, comment: \"\")", string]; - } - else { - outputString = [NSString stringWithFormat:@"NSLocalizedString(%@, nil)", string]; - } + NSString *savedFormatString = [[NSUserDefaults standardUserDefaults] objectForKey:kQLFormatStringKey]; + + NSUInteger placeHolderCount = QL_CountOccurentOfStringWithSubString(savedFormatString, @"%@"); + if (placeHolderCount == 2) { + outputString = [NSString stringWithFormat:savedFormatString, string, string]; } - else if ([self shouldUseSnippetForComment]) { - outputString = [NSString stringWithFormat:@"NSLocalizedString(%@, %@<# comments #>)", string, swiftAddtion]; + else if (placeHolderCount == 1) { + outputString = [NSString stringWithFormat:savedFormatString, string]; } else { - outputString = [NSString stringWithFormat:@"NSLocalizedString(%@, %@%@)", string, swiftAddtion ,string]; + outputString = [NSString stringWithFormat:@"placeholder incorrect, it is %@", savedFormatString]; } - + addedLength = addedLength + outputString.length - string.length; if ([textView shouldChangeTextInRange:matchedRangeInDocument replacementString:outputString]) { [textView.textStorage replaceCharactersInRange:matchedRangeInDocument @@ -143,7 +174,8 @@ static id sharedPlugin = nil; } - (NSString *)currentStringRegexs { - if (self.shouldUseSwiftSyntax) { + BOOL isSwiftSyntax = [[NSUserDefaults standardUserDefaults] boolForKey:kQLFormatStringSwiftSyntax]; + if (isSwiftSyntax) { return swiftStringRegexs; } else { @@ -194,7 +226,18 @@ static id sharedPlugin = nil; return YES; } +- (void)toggleStringFromTableInBundle { + self.shouldUseStringFromTableInBundle = !self.shouldUseStringFromTableInBundle; +} + #pragma mark Preferences +- (BOOL)shouldUseStringFromTableInBundle { + return [[NSUserDefaults standardUserDefaults] boolForKey:QLShouldUseNSLocalizedStringFromTableInBundle]; +} + +- (void)setShouldUseStringFromTableInBundle:(BOOL)shouldUseStringFromTableInBundle { + [[NSUserDefaults standardUserDefaults] setBool:shouldUseStringFromTableInBundle forKey:QLShouldUseNSLocalizedStringFromTableInBundle]; +} - (BOOL)shouldUseNilForComment { return [[NSUserDefaults standardUserDefaults] boolForKey:QLShouldUseNilForComment]; @@ -219,4 +262,21 @@ static id sharedPlugin = nil; - (void)setShouldUseSwiftSyntax:(BOOL)shouldUseSwiftSyntax { [[NSUserDefaults standardUserDefaults] setBool:shouldUseSwiftSyntax forKey:QLShouldUseSwiftSyntax]; } + +- (NSString *)getBundleVersion +{ + NSString *bundleVersion = [[self.bundle infoDictionary] objectForKey:@"CFBundleShortVersionString"]; + return bundleVersion; +} + +- (void)showSettingWindow +{ + if (self.settingControlelr == nil) { + self.settingControlelr = [[OLSettingController alloc] initWithWindowNibName:@"OLSettingController"]; + self.settingControlelr.bundle = self.bundle; + + } + + [self.settingControlelr showWindow:self.settingControlelr]; +} @end