diff options
| author | Tomáš Znamenáček | 2015-08-18 14:00:09 +0200 |
|---|---|---|
| committer | Tomáš Znamenáček | 2015-08-18 14:00:09 +0200 |
| commit | 814934072aef7050f0efc880a6496c97aa288d3a (patch) | |
| tree | 3fc5abc1718183af62873272fd562f9520864b46 | |
| parent | 74e3f32438ec052828fe53a48dc04afaf66e7fd3 (diff) | |
| download | MASShortcut-814934072aef7050f0efc880a6496c97aa288d3a.tar.bz2 | |
Added Czech localization.
| -rw-r--r-- | Demo/AppDelegate.m | 2 | ||||
| -rw-r--r-- | Demo/cs.lproj/Localizable.strings | 3 | ||||
| -rw-r--r-- | Demo/cs.lproj/MainMenu.xib | 734 | ||||
| -rw-r--r-- | Demo/en.lproj/Localizable.strings | 3 | ||||
| -rw-r--r-- | Demo/en.lproj/MainMenu.xib (renamed from Demo/MainMenu.xib) | 4 | ||||
| -rw-r--r-- | Framework/MASLocalization.h | 13 | ||||
| -rw-r--r-- | Framework/MASLocalization.m | 7 | ||||
| -rw-r--r-- | Framework/MASShortcut.m | 2 | ||||
| -rw-r--r-- | Framework/MASShortcutValidator.m | 4 | ||||
| -rw-r--r-- | Framework/MASShortcutView.m | 26 | ||||
| -rw-r--r-- | Framework/Prefix.pch | 3 | ||||
| -rw-r--r-- | Localizable.strings | bin | 0 -> 4302 bytes | |||
| -rw-r--r-- | MASShortcut.xcodeproj/project.pbxproj | 65 | ||||
| -rw-r--r-- | MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme | 17 | ||||
| -rw-r--r-- | cs.lproj/Localizable.strings | 47 | ||||
| -rw-r--r-- | en.lproj/Localizable.strings | 47 |
16 files changed, 943 insertions, 34 deletions
diff --git a/Demo/AppDelegate.m b/Demo/AppDelegate.m index 24d2c81..6a5dd03 100644 --- a/Demo/AppDelegate.m +++ b/Demo/AppDelegate.m @@ -46,7 +46,7 @@ static void *MASObservingContext = &MASObservingContext; - (void)playShortcutFeedback { [[NSSound soundNamed:@"Ping"] play]; - [_feedbackTextField setStringValue:@"Shortcut pressed!"]; + [_feedbackTextField setStringValue:NSLocalizedString(@"Shortcut pressed!", @"Feedback that’s displayed when user presses the sample shortcut.")]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [_feedbackTextField setStringValue:@""]; }); diff --git a/Demo/cs.lproj/Localizable.strings b/Demo/cs.lproj/Localizable.strings new file mode 100644 index 0000000..d1103a2 --- /dev/null +++ b/Demo/cs.lproj/Localizable.strings @@ -0,0 +1,3 @@ +/* Feedback that’s displayed when user presses the sample shortcut. */ +"Shortcut pressed!" = "Funguje!"; + diff --git a/Demo/cs.lproj/MainMenu.xib b/Demo/cs.lproj/MainMenu.xib new file mode 100644 index 0000000..0790e17 --- /dev/null +++ b/Demo/cs.lproj/MainMenu.xib @@ -0,0 +1,734 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8173.3" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> + <dependencies> + <deployment identifier="macosx"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8173.3"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> + <connections> + <outlet property="delegate" destination="494" id="495"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <menu title="AMainMenu" systemMenu="main" id="29"> + <items> + <menuItem title="Demo" id="56"> + <menu key="submenu" title="Demo" systemMenu="apple" id="57"> + <items> + <menuItem title="About Demo" id="58"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="236"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Preferences…" keyEquivalent="," id="129"/> + <menuItem isSeparatorItem="YES" id="143"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Services" id="131"> + <menu key="submenu" title="Services" systemMenu="services" id="130"/> + </menuItem> + <menuItem isSeparatorItem="YES" id="144"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Hide Demo" keyEquivalent="h" id="134"> + <connections> + <action selector="hide:" target="-1" id="367"/> + </connections> + </menuItem> + <menuItem title="Hide Others" keyEquivalent="h" id="145"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="hideOtherApplications:" target="-1" id="368"/> + </connections> + </menuItem> + <menuItem title="Show All" id="150"> + <connections> + <action selector="unhideAllApplications:" target="-1" id="370"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="149"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Quit Demo" keyEquivalent="q" id="136"> + <connections> + <action selector="terminate:" target="-3" id="449"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="File" id="83"> + <menu key="submenu" title="File" id="81"> + <items> + <menuItem title="New" keyEquivalent="n" id="82"> + <connections> + <action selector="newDocument:" target="-1" id="373"/> + </connections> + </menuItem> + <menuItem title="Open…" keyEquivalent="o" id="72"> + <connections> + <action selector="openDocument:" target="-1" id="374"/> + </connections> + </menuItem> + <menuItem title="Open Recent" id="124"> + <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> + <items> + <menuItem title="Clear Menu" id="126"> + <connections> + <action selector="clearRecentDocuments:" target="-1" id="127"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem isSeparatorItem="YES" id="79"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Close" keyEquivalent="w" id="73"> + <connections> + <action selector="performClose:" target="-1" id="193"/> + </connections> + </menuItem> + <menuItem title="Save…" keyEquivalent="s" id="75"> + <connections> + <action selector="saveDocument:" target="-1" id="362"/> + </connections> + </menuItem> + <menuItem title="Revert to Saved" id="112"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="revertDocumentToSaved:" target="-1" id="364"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="74"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Page Setup..." keyEquivalent="P" id="77"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="runPageLayout:" target="-1" id="87"/> + </connections> + </menuItem> + <menuItem title="Print…" keyEquivalent="p" id="78"> + <connections> + <action selector="print:" target="-1" id="86"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Edit" id="217"> + <menu key="submenu" title="Edit" id="205"> + <items> + <menuItem title="Undo" keyEquivalent="z" id="207"> + <connections> + <action selector="undo:" target="-1" id="223"/> + </connections> + </menuItem> + <menuItem title="Redo" keyEquivalent="Z" id="215"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="redo:" target="-1" id="231"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="206"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Cut" keyEquivalent="x" id="199"> + <connections> + <action selector="cut:" target="-1" id="228"/> + </connections> + </menuItem> + <menuItem title="Copy" keyEquivalent="c" id="197"> + <connections> + <action selector="copy:" target="-1" id="224"/> + </connections> + </menuItem> + <menuItem title="Paste" keyEquivalent="v" id="203"> + <connections> + <action selector="paste:" target="-1" id="226"/> + </connections> + </menuItem> + <menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="pasteAsPlainText:" target="-1" id="486"/> + </connections> + </menuItem> + <menuItem title="Delete" id="202"> + <connections> + <action selector="delete:" target="-1" id="235"/> + </connections> + </menuItem> + <menuItem title="Select All" keyEquivalent="a" id="198"> + <connections> + <action selector="selectAll:" target="-1" id="232"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="214"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Find" id="218"> + <menu key="submenu" title="Find" id="220"> + <items> + <menuItem title="Find…" tag="1" keyEquivalent="f" id="209"> + <connections> + <action selector="performFindPanelAction:" target="-1" id="241"/> + </connections> + </menuItem> + <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="performFindPanelAction:" target="-1" id="535"/> + </connections> + </menuItem> + <menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"> + <connections> + <action selector="performFindPanelAction:" target="-1" id="487"/> + </connections> + </menuItem> + <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="performFindPanelAction:" target="-1" id="488"/> + </connections> + </menuItem> + <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"> + <connections> + <action selector="performFindPanelAction:" target="-1" id="489"/> + </connections> + </menuItem> + <menuItem title="Jump to Selection" keyEquivalent="j" id="210"> + <connections> + <action selector="centerSelectionInVisibleArea:" target="-1" id="245"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Spelling and Grammar" id="216"> + <menu key="submenu" title="Spelling and Grammar" id="200"> + <items> + <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"> + <connections> + <action selector="showGuessPanel:" target="-1" id="230"/> + </connections> + </menuItem> + <menuItem title="Check Document Now" keyEquivalent=";" id="201"> + <connections> + <action selector="checkSpelling:" target="-1" id="225"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="453"/> + <menuItem title="Check Spelling While Typing" id="219"> + <connections> + <action selector="toggleContinuousSpellChecking:" target="-1" id="222"/> + </connections> + </menuItem> + <menuItem title="Check Grammar With Spelling" id="346"> + <connections> + <action selector="toggleGrammarChecking:" target="-1" id="347"/> + </connections> + </menuItem> + <menuItem title="Correct Spelling Automatically" id="454"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Substitutions" id="348"> + <menu key="submenu" title="Substitutions" id="349"> + <items> + <menuItem title="Show Substitutions" id="457"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="459"/> + <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"> + <connections> + <action selector="toggleSmartInsertDelete:" target="-1" id="355"/> + </connections> + </menuItem> + <menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"> + <connections> + <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/> + </connections> + </menuItem> + <menuItem title="Smart Dashes" id="460"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/> + </connections> + </menuItem> + <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/> + </connections> + </menuItem> + <menuItem title="Text Replacement" id="462"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Transformations" id="450"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Transformations" id="451"> + <items> + <menuItem title="Make Upper Case" id="452"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="uppercaseWord:" target="-1" id="464"/> + </connections> + </menuItem> + <menuItem title="Make Lower Case" id="465"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="lowercaseWord:" target="-1" id="468"/> + </connections> + </menuItem> + <menuItem title="Capitalize" id="466"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="capitalizeWord:" target="-1" id="467"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Speech" id="211"> + <menu key="submenu" title="Speech" id="212"> + <items> + <menuItem title="Start Speaking" id="196"> + <connections> + <action selector="startSpeaking:" target="-1" id="233"/> + </connections> + </menuItem> + <menuItem title="Stop Speaking" id="195"> + <connections> + <action selector="stopSpeaking:" target="-1" id="227"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Format" id="375"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Format" id="376"> + <items> + <menuItem title="Font" id="377"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Font" systemMenu="font" id="388"> + <items> + <menuItem title="Show Fonts" keyEquivalent="t" id="389"> + <connections> + <action selector="orderFrontFontPanel:" target="420" id="424"/> + </connections> + </menuItem> + <menuItem title="Bold" tag="2" keyEquivalent="b" id="390"> + <connections> + <action selector="addFontTrait:" target="420" id="421"/> + </connections> + </menuItem> + <menuItem title="Italic" tag="1" keyEquivalent="i" id="391"> + <connections> + <action selector="addFontTrait:" target="420" id="422"/> + </connections> + </menuItem> + <menuItem title="Underline" keyEquivalent="u" id="392"> + <connections> + <action selector="underline:" target="-1" id="432"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="393"/> + <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"> + <connections> + <action selector="modifyFont:" target="420" id="425"/> + </connections> + </menuItem> + <menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"> + <connections> + <action selector="modifyFont:" target="420" id="423"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="396"/> + <menuItem title="Kern" id="397"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Kern" id="415"> + <items> + <menuItem title="Use Default" id="416"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="useStandardKerning:" target="-1" id="438"/> + </connections> + </menuItem> + <menuItem title="Use None" id="417"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="turnOffKerning:" target="-1" id="441"/> + </connections> + </menuItem> + <menuItem title="Tighten" id="418"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="tightenKerning:" target="-1" id="431"/> + </connections> + </menuItem> + <menuItem title="Loosen" id="419"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="loosenKerning:" target="-1" id="435"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Ligatures" id="398"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Ligatures" id="411"> + <items> + <menuItem title="Use Default" id="412"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="useStandardLigatures:" target="-1" id="439"/> + </connections> + </menuItem> + <menuItem title="Use None" id="413"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="turnOffLigatures:" target="-1" id="440"/> + </connections> + </menuItem> + <menuItem title="Use All" id="414"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="useAllLigatures:" target="-1" id="434"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Baseline" id="399"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Baseline" id="405"> + <items> + <menuItem title="Use Default" id="406"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="unscript:" target="-1" id="437"/> + </connections> + </menuItem> + <menuItem title="Superscript" id="407"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="superscript:" target="-1" id="430"/> + </connections> + </menuItem> + <menuItem title="Subscript" id="408"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="subscript:" target="-1" id="429"/> + </connections> + </menuItem> + <menuItem title="Raise" id="409"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="raiseBaseline:" target="-1" id="426"/> + </connections> + </menuItem> + <menuItem title="Lower" id="410"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="lowerBaseline:" target="-1" id="427"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem isSeparatorItem="YES" id="400"/> + <menuItem title="Show Colors" keyEquivalent="C" id="401"> + <connections> + <action selector="orderFrontColorPanel:" target="-1" id="433"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="402"/> + <menuItem title="Copy Style" keyEquivalent="c" id="403"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="copyFont:" target="-1" id="428"/> + </connections> + </menuItem> + <menuItem title="Paste Style" keyEquivalent="v" id="404"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="pasteFont:" target="-1" id="436"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Text" id="496"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Text" id="497"> + <items> + <menuItem title="Align Left" keyEquivalent="{" id="498"> + <connections> + <action selector="alignLeft:" target="-1" id="524"/> + </connections> + </menuItem> + <menuItem title="Center" keyEquivalent="|" id="499"> + <connections> + <action selector="alignCenter:" target="-1" id="518"/> + </connections> + </menuItem> + <menuItem title="Justify" id="500"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="alignJustified:" target="-1" id="523"/> + </connections> + </menuItem> + <menuItem title="Align Right" keyEquivalent="}" id="501"> + <connections> + <action selector="alignRight:" target="-1" id="521"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="502"/> + <menuItem title="Writing Direction" id="503"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Writing Direction" id="508"> + <items> + <menuItem title="Paragraph" enabled="NO" id="509"> + <modifierMask key="keyEquivalentModifierMask"/> + </menuItem> + <menuItem id="510"> + <string key="title"> Default</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/> + </connections> + </menuItem> + <menuItem id="511"> + <string key="title"> Left to Right</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/> + </connections> + </menuItem> + <menuItem id="512"> + <string key="title"> Right to Left</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="513"/> + <menuItem title="Selection" enabled="NO" id="514"> + <modifierMask key="keyEquivalentModifierMask"/> + </menuItem> + <menuItem id="515"> + <string key="title"> Default</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/> + </connections> + </menuItem> + <menuItem id="516"> + <string key="title"> Left to Right</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/> + </connections> + </menuItem> + <menuItem id="517"> + <string key="title"> Right to Left</string> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem isSeparatorItem="YES" id="504"/> + <menuItem title="Show Ruler" id="505"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="toggleRuler:" target="-1" id="520"/> + </connections> + </menuItem> + <menuItem title="Copy Ruler" keyEquivalent="c" id="506"> + <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> + <connections> + <action selector="copyRuler:" target="-1" id="522"/> + </connections> + </menuItem> + <menuItem title="Paste Ruler" keyEquivalent="v" id="507"> + <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> + <connections> + <action selector="pasteRuler:" target="-1" id="519"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="View" id="295"> + <menu key="submenu" title="View" id="296"> + <items> + <menuItem title="Show Toolbar" keyEquivalent="t" id="297"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="toggleToolbarShown:" target="-1" id="366"/> + </connections> + </menuItem> + <menuItem title="Customize Toolbar…" id="298"> + <connections> + <action selector="runToolbarCustomizationPalette:" target="-1" id="365"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Window" id="19"> + <menu key="submenu" title="Window" systemMenu="window" id="24"> + <items> + <menuItem title="Minimize" keyEquivalent="m" id="23"> + <connections> + <action selector="performMiniaturize:" target="-1" id="37"/> + </connections> + </menuItem> + <menuItem title="Zoom" id="239"> + <connections> + <action selector="performZoom:" target="-1" id="240"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="92"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Bring All to Front" id="5"> + <connections> + <action selector="arrangeInFront:" target="-1" id="39"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Help" id="490"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Help" systemMenu="help" id="491"> + <items> + <menuItem title="Demo Help" keyEquivalent="?" id="492"> + <connections> + <action selector="showHelp:" target="-1" id="493"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + </items> + </menu> + <window title="Demo" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="DemoWindow" animationBehavior="default" id="371"> + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> + <rect key="contentRect" x="335" y="390" width="393" height="129"/> + <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/> + <view key="contentView" id="372"> + <rect key="frame" x="0.0" y="0.0" width="393" height="129"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <customView id="536" customClass="MASShortcutView"> + <rect key="frame" x="142" y="90" width="158" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + </customView> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="PG0-jh-Onh"> + <rect key="frame" x="9" y="92" width="120" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Klávesová zkratka:" id="85u-1A-n7H"> + <font key="font" metaFont="system"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <button id="zCi-ki-Uuh"> + <rect key="frame" x="140" y="63" width="196" height="18"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="check" title="Zapnout klávesovou zkratku" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Y47-p3-sDa"> + <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> + <font key="font" metaFont="system"/> + </buttonCell> + <connections> + <binding destination="rCO-Ve-DT5" name="value" keyPath="values.customShortcutEnabled" id="VjS-3V-VdA"/> + </connections> + </button> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="KnS-ut-phz"> + <rect key="frame" x="18" y="65" width="111" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Předvolby:" id="cUE-gA-heG"> + <font key="font" metaFont="system"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <button id="F4r-KM-wn9"> + <rect key="frame" x="140" y="43" width="237" height="18"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="check" title="Zapnout vestavěnou zkratku (⌘F2)" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="7gv-jN-44g"> + <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> + <font key="font" metaFont="system"/> + </buttonCell> + <connections> + <binding destination="rCO-Ve-DT5" name="value" keyPath="values.hardcodedShortcutEnabled" id="dlZ-si-HeN"/> + </connections> + </button> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="9fB-XS-8pK"> + <rect key="frame" x="18" y="20" width="111" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Zkratka v akci:" id="Zbz-mV-NDc"> + <font key="font" metaFont="system"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="Aso-dH-W8I"> + <rect key="frame" x="140" y="20" width="211" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" placeholderString="stiskněte klávesovou zkratku" id="Ckx-v7-e6x"> + <font key="font" metaFont="system"/> + <color key="textColor" red="0.37647062540054321" green="0.85098046064376831" blue="0.17647059261798859" alpha="1" colorSpace="deviceRGB"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + </subviews> + </view> + <point key="canvasLocation" x="6.5" y="248.5"/> + </window> + <customObject id="494" customClass="AppDelegate"> + <connections> + <outlet property="customShortcutView" destination="536" id="aO6-hh-1vm"/> + <outlet property="feedbackTextField" destination="Aso-dH-W8I" id="hk8-xL-ieC"/> + <outlet property="window" destination="371" id="532"/> + </connections> + </customObject> + <customObject id="420" customClass="NSFontManager"/> + <userDefaultsController representsSharedInstance="YES" id="rCO-Ve-DT5"/> + </objects> +</document> diff --git a/Demo/en.lproj/Localizable.strings b/Demo/en.lproj/Localizable.strings new file mode 100644 index 0000000..0af7500 --- /dev/null +++ b/Demo/en.lproj/Localizable.strings @@ -0,0 +1,3 @@ +/* Feedback that’s displayed when user presses the sample shortcut. */ +"Shortcut pressed!" = "Shortcut pressed!"; + diff --git a/Demo/MainMenu.xib b/Demo/en.lproj/MainMenu.xib index a4bf180..02d8b18 100644 --- a/Demo/MainMenu.xib +++ b/Demo/en.lproj/MainMenu.xib @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8173.3" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> <dependencies> <deployment identifier="macosx"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6254"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8173.3"/> </dependencies> <objects> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> diff --git a/Framework/MASLocalization.h b/Framework/MASLocalization.h new file mode 100644 index 0000000..466a969 --- /dev/null +++ b/Framework/MASLocalization.h @@ -0,0 +1,13 @@ +/** + Reads a localized string from the framework’s bundle. + + Normally you would use NSLocalizedString to read the localized + strings, but that’s just a shortcut for loading the strings from + the main bundle. And once the framework ends up in an app, the + main bundle will be the app’s bundle and won’t contain our strings. + So we introduced this helper function that makes sure to load the + strings from the framework’s bundle. Please avoid using + NSLocalizedString throughout the framework, it wouldn’t work + properly. +*/ +NSString *MASLocalizedString(NSString *key, NSString *comment);
\ No newline at end of file diff --git a/Framework/MASLocalization.m b/Framework/MASLocalization.m new file mode 100644 index 0000000..7f395a9 --- /dev/null +++ b/Framework/MASLocalization.m @@ -0,0 +1,7 @@ +#import "MASLocalization.h" +#import "MASShortcut.h" + +NSString *MASLocalizedString(NSString *key, NSString *comment) { + NSBundle *frameworkBundle = [NSBundle bundleForClass:[MASShortcut class]]; + return [frameworkBundle localizedStringForKey:key value:@"XXX" table:@"Localizable"]; +} diff --git a/Framework/MASShortcut.m b/Framework/MASShortcut.m index ef3385d..0170c01 100644 --- a/Framework/MASShortcut.m +++ b/Framework/MASShortcut.m @@ -100,7 +100,7 @@ static NSString *const MASShortcutModifierFlags = @"ModifierFlags"; case kVK_F17: return @"F17"; case kVK_F18: return @"F18"; case kVK_F19: return @"F19"; - case kVK_Space: return NSLocalizedString(@"Space", @"Shortcut glyph name for SPACE key"); + case kVK_Space: return MASLocalizedString(@"Space", @"Shortcut glyph name for SPACE key"); case kVK_Escape: return NSStringFromMASKeyCode(kMASShortcutGlyphEscape); case kVK_Delete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteLeft); case kVK_ForwardDelete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteRight); diff --git a/Framework/MASShortcutValidator.m b/Framework/MASShortcutValidator.m index 47dd700..6b192bf 100644 --- a/Framework/MASShortcutValidator.m +++ b/Framework/MASShortcutValidator.m @@ -68,7 +68,7 @@ if (equalFlags && equalHotkeyLowercase) { if (explanation) { - *explanation = NSLocalizedString(@"This shortcut cannot be used because it is already used by the menu item ‘%@’.", + *explanation = MASLocalizedString(@"This shortcut cannot be used because it is already used by the menu item ‘%@’.", @"Message for alert when shortcut is already used"); *explanation = [NSString stringWithFormat:*explanation, menuItem.title]; } @@ -95,7 +95,7 @@ ([(__bridge NSNumber *)enabled boolValue])) { if (explanation) { - *explanation = NSLocalizedString(@"This combination cannot be used because it is already used by a system-wide " + *explanation = MASLocalizedString(@"This combination cannot be used because it is already used by a system-wide " @"keyboard shortcut.\nIf you really want to use this key combination, most shortcuts " @"can be changed in the Keyboard & Mouse panel in System Preferences.", @"Message for alert when shortcut is already used by the system"); diff --git a/Framework/MASShortcutView.m b/Framework/MASShortcutView.m index 7b67411..21b8f38 100644 --- a/Framework/MASShortcutView.m +++ b/Framework/MASShortcutView.m @@ -139,8 +139,8 @@ static const CGFloat MASButtonFontSize = 11; // Give VoiceOver users feedback on the result. Requires at least 10.9 to run. if (_recording == NO && (&NSAccessibilityPriorityKey != NULL)) { NSString* msg = _shortcutValue ? - NSLocalizedString(@"Shortcut set", @"VoiceOver: Shortcut set") : - NSLocalizedString(@"Shortcut cleared", @"VoiceOver: Shortcut cleared"); + MASLocalizedString(@"Shortcut set", @"VoiceOver: Shortcut set") : + MASLocalizedString(@"Shortcut cleared", @"VoiceOver: Shortcut cleared"); NSDictionary *announcementInfo = @{ NSAccessibilityAnnouncementKey : msg, NSAccessibilityPriorityKey : @(NSAccessibilityPriorityHigh), @@ -217,10 +217,10 @@ static const CGFloat MASButtonFontSize = 11; [self getShortcutRect:&shortcutRect hintRect:NULL]; NSString *title = (self.recording ? (_hinting - ? NSLocalizedString(@"Use Old Shortcut", @"Cancel action button for non-empty shortcut in recording state") + ? MASLocalizedString(@"Use Old Shortcut", @"Cancel action button for non-empty shortcut in recording state") : (self.shortcutPlaceholder.length > 0 ? self.shortcutPlaceholder - : NSLocalizedString(@"Type New Shortcut", @"Non-empty shortcut button in recording state"))) + : MASLocalizedString(@"Type New Shortcut", @"Non-empty shortcut button in recording state"))) : _shortcutValue ? _shortcutValue.description : @""); [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:self.isRecording ? NSOnState : NSOffState]; } @@ -232,15 +232,15 @@ static const CGFloat MASButtonFontSize = 11; CGRect shortcutRect; [self getShortcutRect:&shortcutRect hintRect:NULL]; NSString *title = (_hinting - ? NSLocalizedString(@"Cancel", @"Cancel action button in recording state") + ? MASLocalizedString(@"Cancel", @"Cancel action button in recording state") : (self.shortcutPlaceholder.length > 0 ? self.shortcutPlaceholder - : NSLocalizedString(@"Type Shortcut", @"Empty shortcut button in recording state"))); + : MASLocalizedString(@"Type Shortcut", @"Empty shortcut button in recording state"))); [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:NSOnState]; } else { - [self drawInRect:self.bounds withTitle:NSLocalizedString(@"Record Shortcut", @"Empty shortcut button in normal state") + [self drawInRect:self.bounds withTitle:MASLocalizedString(@"Record Shortcut", @"Empty shortcut button in normal state") alignment:NSCenterTextAlignment state:NSOffState]; } } @@ -373,10 +373,10 @@ void *kUserDataHint = &kUserDataHint; - (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(CGPoint)point userData:(void *)data { if (data == kUserDataShortcut) { - return NSLocalizedString(@"Click to record new shortcut", @"Tooltip for non-empty shortcut button"); + return MASLocalizedString(@"Click to record new shortcut", @"Tooltip for non-empty shortcut button"); } else if (data == kUserDataHint) { - return NSLocalizedString(@"Delete shortcut", @"Tooltip for hint button near the non-empty shortcut"); + return MASLocalizedString(@"Delete shortcut", @"Tooltip for hint button near the non-empty shortcut"); } return nil; } @@ -431,13 +431,13 @@ void *kUserDataHint = &kUserDataHint; // Prevent cancel of recording when Alert window is key [weakSelf activateResignObserver:NO]; [weakSelf activateEventMonitoring:NO]; - NSString *format = NSLocalizedString(@"The key combination %@ cannot be used", + NSString *format = MASLocalizedString(@"The key combination %@ cannot be used", @"Title for alert when shortcut is already used"); NSAlert* alert = [[NSAlert alloc]init]; alert.alertStyle = NSCriticalAlertStyle; alert.informativeText = explanation; alert.messageText = [NSString stringWithFormat:format, shortcut]; - [alert addButtonWithTitle:NSLocalizedString(@"OK", @"Alert button when shortcut is already used")]; + [alert addButtonWithTitle:MASLocalizedString(@"OK", @"Alert button when shortcut is already used")]; [alert runModal]; weakSelf.shortcutPlaceholder = nil; @@ -544,7 +544,7 @@ void *kUserDataHint = &kUserDataHint; - (NSString *)accessibilityHelp { - return NSLocalizedString(@"To record a new shortcut, click this button, and then type the" + return MASLocalizedString(@"To record a new shortcut, click this button, and then type the" @" new shortcut, or press delete to clear an existing shortcut.", @"VoiceOver shortcut help"); } @@ -552,7 +552,7 @@ void *kUserDataHint = &kUserDataHint; - (NSString *)accessibilityLabel { NSString* title = _shortcutValue.description ?: @"Empty"; - title = [title stringByAppendingFormat:@" %@", NSLocalizedString(@"keyboard shortcut", @"VoiceOver title")]; + title = [title stringByAppendingFormat:@" %@", MASLocalizedString(@"keyboard shortcut", @"VoiceOver title")]; return title; } diff --git a/Framework/Prefix.pch b/Framework/Prefix.pch index 3e71c31..ad417e0 100644 --- a/Framework/Prefix.pch +++ b/Framework/Prefix.pch @@ -1,2 +1,3 @@ #import <AppKit/AppKit.h> -#import <Carbon/Carbon.h>
\ No newline at end of file +#import <Carbon/Carbon.h> +#import "MASLocalization.h"
\ No newline at end of file diff --git a/Localizable.strings b/Localizable.strings Binary files differnew file mode 100644 index 0000000..4eed51c --- /dev/null +++ b/Localizable.strings diff --git a/MASShortcut.xcodeproj/project.pbxproj b/MASShortcut.xcodeproj/project.pbxproj index c51e44e..d1820ed 100644 --- a/MASShortcut.xcodeproj/project.pbxproj +++ b/MASShortcut.xcodeproj/project.pbxproj @@ -7,6 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + 0D2CAB131B8332E5005431FC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D2CAB151B8332E5005431FC /* Localizable.strings */; }; + 0D2CAB191B8339F4005431FC /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D2CAB171B8339F4005431FC /* MASLocalization.h */; }; + 0D2CAB1A1B8339F4005431FC /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D2CAB181B8339F4005431FC /* MASLocalization.m */; }; + 0D2CAB1B1B83409C005431FC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D2CAB1D1B83409C005431FC /* MainMenu.xib */; }; + 0D2CAB211B834464005431FC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D2CAB231B834464005431FC /* Localizable.strings */; }; 0D39DCA21A668A4400639145 /* MASHotKeyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D39DCA11A668A4400639145 /* MASHotKeyTests.m */; }; 0D39DCA41A668E5500639145 /* MASShortcutMonitorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D39DCA31A668E5500639145 /* MASShortcutMonitorTests.m */; }; 0D827CD71990D4420010B8EF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D827CD61990D4420010B8EF /* Cocoa.framework */; }; @@ -17,7 +22,6 @@ 0D827D381990D5E70010B8EF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D827CD61990D4420010B8EF /* Cocoa.framework */; }; 0D827D6F1990D6110010B8EF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D827D6A1990D6110010B8EF /* AppDelegate.m */; }; 0D827D711990D6110010B8EF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D827D6D1990D6110010B8EF /* main.m */; }; - 0D827D721990D6110010B8EF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D827D6E1990D6110010B8EF /* MainMenu.xib */; }; 0D827D731990D6590010B8EF /* MASShortcut.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D827CD31990D4420010B8EF /* MASShortcut.framework */; }; 0D827D751990D6A60010B8EF /* MASShortcut.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 0D827CD31990D4420010B8EF /* MASShortcut.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 0D827D771990F81E0010B8EF /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D827D761990F81E0010B8EF /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -66,6 +70,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0D2CAB141B8332E5005431FC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; + 0D2CAB161B8332EE005431FC /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; }; + 0D2CAB171B8339F4005431FC /* MASLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/MASLocalization.h; sourceTree = "<group>"; }; + 0D2CAB181B8339F4005431FC /* MASLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/MASLocalization.m; sourceTree = "<group>"; }; + 0D2CAB1C1B83409C005431FC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; }; + 0D2CAB1E1B8340A4005431FC /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/MainMenu.xib; sourceTree = "<group>"; }; + 0D2CAB221B834464005431FC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; + 0D2CAB241B834467005431FC /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; }; 0D39DCA11A668A4400639145 /* MASHotKeyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASHotKeyTests.m; path = Framework/MASHotKeyTests.m; sourceTree = "<group>"; }; 0D39DCA31A668E5500639145 /* MASShortcutMonitorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitorTests.m; path = Framework/MASShortcutMonitorTests.m; sourceTree = "<group>"; }; 0D827CD31990D4420010B8EF /* MASShortcut.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MASShortcut.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -84,9 +96,8 @@ 0D827D6B1990D6110010B8EF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 0D827D6C1990D6110010B8EF /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; }; 0D827D6D1990D6110010B8EF /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; - 0D827D6E1990D6110010B8EF /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; }; 0D827D761990F81E0010B8EF /* Shortcut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = "<group>"; }; - 0D827D8319910AFF0010B8EF /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D827D8319910AFF0010B8EF /* MASShortcutTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MASShortcutTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D827D8719910AFF0010B8EF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 0D827D8D19910AFF0010B8EF /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; }; 0D827D9319910B740010B8EF /* MASShortcutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASShortcutTests.m; path = Framework/MASShortcutTests.m; sourceTree = "<group>"; }; @@ -154,7 +165,7 @@ children = ( 0D827CD31990D4420010B8EF /* MASShortcut.framework */, 0D827D371990D5E70010B8EF /* Demo.app */, - 0D827D8319910AFF0010B8EF /* Tests.xctest */, + 0D827D8319910AFF0010B8EF /* MASShortcutTests.xctest */, ); name = Products; sourceTree = "<group>"; @@ -179,6 +190,7 @@ 0D827DA119912A6D0010B8EF /* UI */, 0D827D2F1990D5640010B8EF /* Info.plist */, EAFFDC811AACFF3300F38834 /* MASShortcut.modulemap */, + 0D2CAB151B8332E5005431FC /* Localizable.strings */, 0D827D98199110F60010B8EF /* Prefix.pch */, 0D827D761990F81E0010B8EF /* Shortcut.h */, ); @@ -188,9 +200,10 @@ 0D827D681990D6110010B8EF /* Demo */ = { isa = PBXGroup; children = ( + 0D2CAB231B834464005431FC /* Localizable.strings */, 0D827D691990D6110010B8EF /* AppDelegate.h */, 0D827D6A1990D6110010B8EF /* AppDelegate.m */, - 0D827D6E1990D6110010B8EF /* MainMenu.xib */, + 0D2CAB1D1B83409C005431FC /* MainMenu.xib */, 0D827D6B1990D6110010B8EF /* Info.plist */, 0D827D6C1990D6110010B8EF /* Prefix.pch */, 0D827D6D1990D6110010B8EF /* main.m */, @@ -224,6 +237,8 @@ 0D827DA119912A6D0010B8EF /* UI */ = { isa = PBXGroup; children = ( + 0D2CAB171B8339F4005431FC /* MASLocalization.h */, + 0D2CAB181B8339F4005431FC /* MASLocalization.m */, 0D827D211990D55E0010B8EF /* MASShortcutView.h */, 0D827D221990D55E0010B8EF /* MASShortcutView.m */, 0DC2F19619938EFA003A0131 /* MASShortcutView+Bindings.h */, @@ -274,6 +289,7 @@ 0DC2F18D1993708A003A0131 /* MASDictionaryTransformer.h in Headers */, 0D827DA519912D240010B8EF /* MASShortcutMonitor.h in Headers */, 0D827DAD199132840010B8EF /* MASShortcutBinder.h in Headers */, + 0D2CAB191B8339F4005431FC /* MASLocalization.h in Headers */, 0DC2F17619922798003A0131 /* MASHotKey.h in Headers */, 0D827D771990F81E0010B8EF /* Shortcut.h in Headers */, ); @@ -333,7 +349,7 @@ ); name = MASShortcutTests; productName = Tests; - productReference = 0D827D8319910AFF0010B8EF /* Tests.xctest */; + productReference = 0D827D8319910AFF0010B8EF /* MASShortcutTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ @@ -356,7 +372,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, - Base, + cs, ); mainGroup = 0D827CC91990D4420010B8EF; productRefGroup = 0D827CD41990D4420010B8EF /* Products */; @@ -375,6 +391,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0D2CAB131B8332E5005431FC /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -382,7 +399,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0D827D721990D6110010B8EF /* MainMenu.xib in Resources */, + 0D2CAB1B1B83409C005431FC /* MainMenu.xib in Resources */, + 0D2CAB211B834464005431FC /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -406,6 +424,7 @@ 0D827D2C1990D55E0010B8EF /* MASShortcutView.m in Sources */, 0D827D261990D55E0010B8EF /* MASShortcut.m in Sources */, 0DC2F18E1993708A003A0131 /* MASDictionaryTransformer.m in Sources */, + 0D2CAB1A1B8339F4005431FC /* MASLocalization.m in Sources */, 0DC2F19919938EFA003A0131 /* MASShortcutView+Bindings.m in Sources */, 0DC2F17D199232F7003A0131 /* MASShortcutBinder.m in Sources */, ); @@ -442,6 +461,36 @@ }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + 0D2CAB151B8332E5005431FC /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 0D2CAB141B8332E5005431FC /* en */, + 0D2CAB161B8332EE005431FC /* cs */, + ); + name = Localizable.strings; + sourceTree = "<group>"; + }; + 0D2CAB1D1B83409C005431FC /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D2CAB1C1B83409C005431FC /* en */, + 0D2CAB1E1B8340A4005431FC /* cs */, + ); + name = MainMenu.xib; + sourceTree = "<group>"; + }; + 0D2CAB231B834464005431FC /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 0D2CAB221B834464005431FC /* en */, + 0D2CAB241B834467005431FC /* cs */, + ); + name = Localizable.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 0D827CF91990D4420010B8EF /* Debug */ = { isa = XCBuildConfiguration; diff --git a/MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme b/MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme index 3a55207..bb2998b 100644 --- a/MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme +++ b/MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme @@ -23,10 +23,10 @@ </BuildActionEntries> </BuildAction> <TestAction + buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - buildConfiguration = "Debug"> + shouldUseLaunchSchemeArgsEnv = "YES"> <Testables> </Testables> <MacroExpansion> @@ -38,17 +38,21 @@ ReferencedContainer = "container:MASShortcut.xcodeproj"> </BuildableReference> </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> </TestAction> <LaunchAction + buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" - buildConfiguration = "Debug" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" + debugServiceExtension = "internal" allowLocationSimulation = "YES"> - <BuildableProductRunnable> + <BuildableProductRunnable + runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "0D827D361990D5E70010B8EF" @@ -61,12 +65,13 @@ </AdditionalOptions> </LaunchAction> <ProfileAction + buildConfiguration = "Release" shouldUseLaunchSchemeArgsEnv = "YES" savedToolIdentifier = "" useCustomWorkingDirectory = "NO" - buildConfiguration = "Release" debugDocumentVersioning = "YES"> - <BuildableProductRunnable> + <BuildableProductRunnable + runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "0D827D361990D5E70010B8EF" diff --git a/cs.lproj/Localizable.strings b/cs.lproj/Localizable.strings new file mode 100644 index 0000000..afefe2b --- /dev/null +++ b/cs.lproj/Localizable.strings @@ -0,0 +1,47 @@ +/* Cancel action button in recording state */ +"Cancel" = "Zrušit"; + +/* Tooltip for non-empty shortcut button */ +"Click to record new shortcut" = "Kliknutím nahrajete novou zkratku"; + +/* Tooltip for hint button near the non-empty shortcut */ +"Delete shortcut" = "Smazat zkratku"; + +/* VoiceOver title */ +"keyboard shortcut" = "klávesová zkratka"; + +/* Alert button when shortcut is already used */ +"OK" = "OK"; + +/* Empty shortcut button in normal state */ +"Record Shortcut" = "Nahrát zkratku"; + +/* VoiceOver: Shortcut cleared */ +"Shortcut cleared" = "zkratka smazána"; + +/* VoiceOver: Shortcut set */ +"Shortcut set" = "zkratka nastavena"; + +/* Shortcut glyph name for SPACE key */ +"Space" = "Mezerník"; + +/* Title for alert when shortcut is already used */ +"The key combination %@ cannot be used" = "Kombinace %@ se nedá použít"; + +/* Message for alert when shortcut is already used by the system */ +"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Tato zkratka se nedá použít, protože už ji obsadil systém.\nKdybyste na ní trvali, většina systémových zkratek se dá přenastavit v Předvolbách systému."; + +/* Message for alert when shortcut is already used */ +"This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Tato zkratka se nedá použít, protože už je použita pro menu (%@)."; + +/* VoiceOver shortcut help */ +"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Pokud chcete nahrát novou zkratku, stiskněte toto tlačítko a následně vybranou zkratku. Stisknutím Delete vymažete stávající zkratku."; + +/* Non-empty shortcut button in recording state */ +"Type New Shortcut" = "Stiskněte zkratku"; + +/* Empty shortcut button in recording state */ +"Type Shortcut" = "Stiskněte zkratku"; + +/* Cancel action button for non-empty shortcut in recording state */ +"Use Old Shortcut" = "Vrátit se k původní"; diff --git a/en.lproj/Localizable.strings b/en.lproj/Localizable.strings new file mode 100644 index 0000000..bfa60a9 --- /dev/null +++ b/en.lproj/Localizable.strings @@ -0,0 +1,47 @@ +/* Cancel action button in recording state */ +"Cancel" = "Cancel"; + +/* Tooltip for non-empty shortcut button */ +"Click to record new shortcut" = "Click to record new shortcut"; + +/* Tooltip for hint button near the non-empty shortcut */ +"Delete shortcut" = "Delete shortcut"; + +/* VoiceOver title */ +"keyboard shortcut" = "keyboard shortcut"; + +/* Alert button when shortcut is already used */ +"OK" = "OK"; + +/* Empty shortcut button in normal state */ +"Record Shortcut" = "Record Shortcut"; + +/* VoiceOver: Shortcut cleared */ +"Shortcut cleared" = "Shortcut cleared"; + +/* VoiceOver: Shortcut set */ +"Shortcut set" = "Shortcut set"; + +/* Shortcut glyph name for SPACE key */ +"Space" = "Space"; + +/* Title for alert when shortcut is already used */ +"The key combination %@ cannot be used" = "The key combination %@ cannot be used"; + +/* Message for alert when shortcut is already used by the system */ +"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences."; + +/* Message for alert when shortcut is already used */ +"This shortcut cannot be used because it is already used by the menu item ‘%@’." = "This shortcut cannot be used because it is already used by the menu item ‘%@’."; + +/* VoiceOver shortcut help */ +"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut."; + +/* Non-empty shortcut button in recording state */ +"Type New Shortcut" = "Type New Shortcut"; + +/* Empty shortcut button in recording state */ +"Type Shortcut" = "Type Shortcut"; + +/* Cancel action button for non-empty shortcut in recording state */ +"Use Old Shortcut" = "Use Old Shortcut"; |
