aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomáš Znamenáček2015-08-18 14:00:09 +0200
committerTomáš Znamenáček2015-08-18 14:00:09 +0200
commit814934072aef7050f0efc880a6496c97aa288d3a (patch)
tree3fc5abc1718183af62873272fd562f9520864b46
parent74e3f32438ec052828fe53a48dc04afaf66e7fd3 (diff)
downloadMASShortcut-814934072aef7050f0efc880a6496c97aa288d3a.tar.bz2
Added Czech localization.
-rw-r--r--Demo/AppDelegate.m2
-rw-r--r--Demo/cs.lproj/Localizable.strings3
-rw-r--r--Demo/cs.lproj/MainMenu.xib734
-rw-r--r--Demo/en.lproj/Localizable.strings3
-rw-r--r--Demo/en.lproj/MainMenu.xib (renamed from Demo/MainMenu.xib)4
-rw-r--r--Framework/MASLocalization.h13
-rw-r--r--Framework/MASLocalization.m7
-rw-r--r--Framework/MASShortcut.m2
-rw-r--r--Framework/MASShortcutValidator.m4
-rw-r--r--Framework/MASShortcutView.m26
-rw-r--r--Framework/Prefix.pch3
-rw-r--r--Localizable.stringsbin0 -> 4302 bytes
-rw-r--r--MASShortcut.xcodeproj/project.pbxproj65
-rw-r--r--MASShortcut.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme17
-rw-r--r--cs.lproj/Localizable.strings47
-rw-r--r--en.lproj/Localizable.strings47
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
new file mode 100644
index 0000000..4eed51c
--- /dev/null
+++ b/Localizable.strings
Binary files differ
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";