From 06594209266bc279df10e88dfc723854dfa3ea2f Mon Sep 17 00:00:00 2001 From: Yee Cheng Chin Date: Fri, 2 Oct 2020 03:07:56 -0700 Subject: [PATCH 1/4] Add original extract-specific-localised-strings.swift from Gist This script will be modified at a later commit to extract localization texts from Apple's glossaries, but including original version for reference. --- .../extract-specific-localised-strings.swift | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100755 src/MacVim/scripts/extract-specific-localised-strings.swift diff --git a/src/MacVim/scripts/extract-specific-localised-strings.swift b/src/MacVim/scripts/extract-specific-localised-strings.swift new file mode 100755 index 0000000000..f3f11d730a --- /dev/null +++ b/src/MacVim/scripts/extract-specific-localised-strings.swift @@ -0,0 +1,294 @@ +#! /usr/bin/swift + +// Douglas Hill, March 2020 +// This file is made available under the MIT license included at the bottom of this file. + +/* + Extracts specific localised strings from Apple’s glossary files. + + This script helped with localisation for KeyboardKit (https://github.com/douglashill/KeyboardKit) by leveraging Apple’s existing translations. + + More detail in the article at https://douglashill.co/localisation-using-apples-glossaries/ + + It reads each needed translation by looking up translations for specific keys in specific glossary files. + + ## Adapting for other projects + + 1. Set the outputDirectory below. + 2. Change neededLocalisations to the keys your project needs. + + ## Generating the .strings files + + 1. Download all macOS and iOS glossary DMGs from the Apple Developer website (sign in required): https://developer.apple.com/download/more + 2. Mount all of these DMGs on your Mac. There should be about 80. DiskImageMounter may get stuck if you try mounting ~20 or more at once, so opening in batches of ~15 is recommended. + 3. Run this script. Look out for any errors in the console. That may indicate some DMGs failed to mount, or Apple removed a localisation key or added one so the lookup is ambiguous. + 4. Manually edit all the .strings file for quality of translation. Pay special attention to American English (en.lproj) because it’s generated from Australian English. + + ## Adding new localised strings + + 1. Locate the same text used in Apple software and identify the glossary where this can be found and the key used. + 2. Add this as a `NeededLocalisation` in the `neededLocalisations` array in the script `main.swift`. This order of this array is matches the final order in the `.strings` files. It should be sorted alphabetically by key. + 3. Follow the steps for generating above. + */ + +import Foundation + +// MARK: Input data + +/// The directory containing the .lproj directories where the .strings files will be written. +let outputDirectory = URL(fileURLWithPath: "<#PUT A PATH TO WHERE THE LPROJ DIRECTORIES SHOULD BE PLACED HERE#>") + +// Possible improvement: +// We identify using glossary -> key, which could be ambiguous because there are entries from +// many .strings files in each glossary file, so there can be duplicate keys in the glossary. +// This is handled by finding all matches and printing an error if there are multiple matches. +// It would be better to identify each needed localisation by glossary -> filename -> key. + +/// A localised strings entry that we want to extract from Apple’s glossary files. +struct NeededLocalisation { + /// The key to use in the generated KeyboardKit .strings file. + let targetKey: String + /// The key (AKA Position) that Apple uses in their glossary. + let appleKey: String + /// The file base name of the glossary file in which this localisation can be found. I.e. the filename is glossaryFilename.lg. + let glossaryFilename: String +} + +let neededLocalisations = [ + NeededLocalisation(targetKey: "app_newWindow", appleKey: "fluid.switcher.plus.button.label", glossaryFilename: "AccessibilityBundles"), + NeededLocalisation(targetKey: "app_settings", appleKey: "Settings", glossaryFilename: "MobileNotes" ), + NeededLocalisation(targetKey: "barButton_action", appleKey: "Share", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_add", appleKey: "Add", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_bookmarks", appleKey: "Bookmarks", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_camera", appleKey: "Camera", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_cancel", appleKey: "Cancel", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_close", appleKey: "Close", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_compose", appleKey: "Compose", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_done", appleKey: "Done", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_edit", appleKey: "Edit", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_fastForward", appleKey: "Fast Forward", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_organize", appleKey: "Organize", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_pause", appleKey: "Pause", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_play", appleKey: "Play", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_redo", appleKey: "Redo", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_reply", appleKey: "Reply", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_rewind", appleKey: "Rewind", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_save", appleKey: "Save", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_search", appleKey: "Search", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_stop", appleKey: "Stop", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "barButton_undo", appleKey: "Undo", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "delete", appleKey: "Delete", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "find_jump", appleKey: "315.title", glossaryFilename: "TextEdit" ), + NeededLocalisation(targetKey: "find_next", appleKey: "312.title", glossaryFilename: "TextEdit" ), + NeededLocalisation(targetKey: "find_previous", appleKey: "314.title", glossaryFilename: "TextEdit" ), + NeededLocalisation(targetKey: "find_useSelection", appleKey: "316.title", glossaryFilename: "TextEdit" ), + NeededLocalisation(targetKey: "navigation_back", appleKey: "Back", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "refresh", appleKey: "Refresh", glossaryFilename: "UIKitCore" ), + NeededLocalisation(targetKey: "scrollView_zoomIn", appleKey: "438.title", glossaryFilename: "WebBrowser" ), + NeededLocalisation(targetKey: "scrollView_zoomOut", appleKey: "439.title", glossaryFilename: "WebBrowser" ), + NeededLocalisation(targetKey: "scrollView_zoomReset", appleKey: "863.title", glossaryFilename: "WebBrowser" ), + NeededLocalisation(targetKey: "window_close", appleKey: "Close Window", glossaryFilename: "AppKit" ), + NeededLocalisation(targetKey: "window_cycle", appleKey: "Cycle Through Windows", glossaryFilename: "AppKit" ), +] + +struct Localisation { + /// The language code as used for .lproj directories. + let code: String + /// Enough of the volume name for Apple’s DMG to pick this localisation out from the others. E.g. just ‘French’ would not enough because it would match both Universal French and Canadian French. + let volumeName: String +} + +let localisations = [ + Localisation(code: "ar", volumeName: "Arabic"), + Localisation(code: "ca", volumeName: "Catalan"), + Localisation(code: "cs", volumeName: "Czech"), + Localisation(code: "da", volumeName: "Danish"), + Localisation(code: "de", volumeName: "German"), + Localisation(code: "el", volumeName: "Greek"), + Localisation(code: "en", volumeName: "Australian English"), // Apple does not provide a glossary for en. + Localisation(code: "en-AU", volumeName: "Australian English"), + Localisation(code: "en-GB", volumeName: "British English"), + Localisation(code: "es", volumeName: "Spanish"), + Localisation(code: "es-419", volumeName: "Latin"), + Localisation(code: "fi", volumeName: "Finnish"), + Localisation(code: "fr", volumeName: "Universal French"), + Localisation(code: "fr-CA", volumeName: "Canadian"), + Localisation(code: "he", volumeName: "Hebrew"), + Localisation(code: "hi", volumeName: "Hindi"), + Localisation(code: "hr", volumeName: "Croatian"), + Localisation(code: "hu", volumeName: "Hungarian"), + Localisation(code: "id", volumeName: "Indonesian"), + Localisation(code: "it", volumeName: "Italian"), + Localisation(code: "ja", volumeName: "Japanese"), + Localisation(code: "ko", volumeName: "Korean"), + Localisation(code: "ms", volumeName: "Malay"), + Localisation(code: "nb", volumeName: "Norwegian"), + Localisation(code: "nl", volumeName: "Dutch"), + Localisation(code: "pl", volumeName: "Polish"), + Localisation(code: "pt-BR", volumeName: "Brazilian"), + Localisation(code: "pt-PT", volumeName: "Portuguese"), + Localisation(code: "ro", volumeName: "Romanian"), + Localisation(code: "ru", volumeName: "Russian"), + Localisation(code: "sk", volumeName: "Slovak"), + Localisation(code: "sv", volumeName: "Swedish"), + Localisation(code: "th", volumeName: "Thai"), + Localisation(code: "tr", volumeName: "Turkish"), + Localisation(code: "uk", volumeName: "Ukrainian"), + Localisation(code: "vi", volumeName: "Vietnamese"), + Localisation(code: "zh-Hans", volumeName: "Simplified Chinese"), + Localisation(code: "zh-Hant", volumeName: "Traditional Chinese"), + Localisation(code: "zh-HK", volumeName: "Hong Kong"), +] + +// MARK: - Support + +extension Collection { + /// The only element in the collection, or nil if there are multiple or zero elements. + var single: Element? { count == 1 ? first! : nil } +} + +extension URL { + public func appendingPathComponents(_ pathComponents: [String]) -> URL { + return pathComponents.enumerated().reduce(self) { url, pair in + return url.appendingPathComponent(pair.element, isDirectory: pair.offset + 1 < pathComponents.count) + } + } +} + +extension XMLElement { + func singleChild(withName name: String) -> XMLElement? { + elements(forName: name).single + } +} + +extension XMLNode { + var textOfSingleChild: String? { + guard let singleChild = children?.single, singleChild.kind == .text else { + return nil + } + return singleChild.stringValue + } +} + +/// A localisation entry parsed from a glossary. +struct LocalisationEntry { + /// The file where the entry was read from. + let fileURL: URL + /// The usage description to help with translation. + let comment: String? + /// The key to look up this string. This is optional because some Apple strings files use just whitespace as a key and NSXMLDocument can not read whitespace-only text elements. + let key: String? + /// The English text. + let base: String + /// The localised text. + let translation: String +} + +func readLocalisationEntriesFromFile(at fileURL: URL) -> [LocalisationEntry] { + let doc = try! XMLDocument(contentsOf: fileURL, options: [.nodePreserveWhitespace]) + + return doc.rootElement()!.elements(forName: "File").flatMap { file -> [LocalisationEntry] in + file.elements(forName: "TextItem").compactMap { textItem -> LocalisationEntry? in + let translationSet = textItem.singleChild(withName: "TranslationSet")! + + guard let base = translationSet.singleChild(withName: "base")!.textOfSingleChild, let translation = translationSet.singleChild(withName: "tran")!.textOfSingleChild else { + return nil + } + + return LocalisationEntry( + fileURL: fileURL, + comment: textItem.singleChild(withName: "Description")!.textOfSingleChild, + key: textItem.singleChild(withName: "Position")!.textOfSingleChild, + base: base, + translation: translation + ) + } + } +} + +func memoisedReadLocalisationEntriesFromFile(at fileURL: URL) -> [LocalisationEntry] { + enum __ { static var results: [URL: [LocalisationEntry]] = [:] } + + if let existingResult = __.results[fileURL] { + return existingResult + } + + let newResult = readLocalisationEntriesFromFile(at: fileURL) + __.results[fileURL] = newResult + return newResult +} + +// MARK: - The script itself + +let volumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, options: [])! + +for localisation in localisations { + // This reduces peak memory usage from ~2GB to ~200MB. + autoreleasepool { () -> Void in + + let matchingVolumes = volumes.filter { fileURL -> Bool in + fileURL.lastPathComponent.contains(localisation.volumeName) + } + + print("ℹ️ Localising \(localisation.volumeName) (\(localisation.code)) from \(matchingVolumes.count) volumes.") // There should be 2 volumes. + + let lines = neededLocalisations.compactMap { neededLocalisation -> String? in + let localisationEntries = matchingVolumes.flatMap { volumeURL -> [LocalisationEntry] in + let glossaryFilePaths = try! FileManager.default.contentsOfDirectory(at: volumeURL, includingPropertiesForKeys: nil, options: []).filter { fileURL in + fileURL.lastPathComponent.contains(neededLocalisation.glossaryFilename) + } + + return glossaryFilePaths.flatMap { fileURL -> [LocalisationEntry] in + memoisedReadLocalisationEntriesFromFile(at: fileURL).filter { entry in + entry.key == neededLocalisation.appleKey + } + } + } + + let translations: Set = Set(localisationEntries.map { $0.translation }) + + guard let translation = translations.single else { + print("❌ Wrong number of matches for \(neededLocalisation.appleKey) in files matching \(neededLocalisation.glossaryFilename): \(translations)") + return nil + } + + return """ + "\(neededLocalisation.targetKey)" = "\(translation)"; + """ + } + + let targetStringsFileURL = outputDirectory.appendingPathComponents(["\(localisation.code).lproj", "Localizable.strings"]) + + try! FileManager.default.createDirectory(at: targetStringsFileURL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil) + + try! """ + // This file was generated from Apple localisation glossaries. + + \(lines.joined(separator: "\n")) + + """.write(to: targetStringsFileURL, atomically: false, encoding: .utf8) + } +} + +/* + The MIT License (MIT) + + Copyright 2020 Douglas Hill + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ From 2831f80fc845bb4e5e70d332d5f5a62f97fdb4f9 Mon Sep 17 00:00:00 2001 From: Yee Cheng Chin Date: Fri, 2 Oct 2020 03:07:56 -0700 Subject: [PATCH 2/4] Remove unused locales, also convert nib to xib This commit is to prepare for the later commit which will add MainMenu localizaiton, so just convert some of the nib's to xib's first as that's what Apple has been recommending for a long time, and remove the old locales. --- .../FindAndReplace.nib/classes.nib | 87 ----------- .../English.lproj/FindAndReplace.nib/info.nib | 20 --- .../FindAndReplace.nib/keyedobjects.nib | Bin 6922 -> 0 bytes src/MacVim/English.lproj/FindAndReplace.xib | 138 ++++++++++++++++++ .../MainMenu.nib/keyedobjects.nib | Bin 9169 -> 0 bytes .../designable.nib => MainMenu.xib} | 4 +- .../Preferences.nib/keyedobjects.nib | Bin 25723 -> 0 bytes .../designable.nib => Preferences.xib} | 69 +++++---- src/MacVim/MacVim.xcodeproj/project.pbxproj | 46 +++--- 9 files changed, 195 insertions(+), 169 deletions(-) delete mode 100644 src/MacVim/English.lproj/FindAndReplace.nib/classes.nib delete mode 100644 src/MacVim/English.lproj/FindAndReplace.nib/info.nib delete mode 100644 src/MacVim/English.lproj/FindAndReplace.nib/keyedobjects.nib create mode 100644 src/MacVim/English.lproj/FindAndReplace.xib delete mode 100644 src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib rename src/MacVim/English.lproj/{MainMenu.nib/designable.nib => MainMenu.xib} (99%) delete mode 100644 src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib rename src/MacVim/English.lproj/{Preferences.nib/designable.nib => Preferences.xib} (89%) diff --git a/src/MacVim/English.lproj/FindAndReplace.nib/classes.nib b/src/MacVim/English.lproj/FindAndReplace.nib/classes.nib deleted file mode 100644 index 9afbd730e0..0000000000 --- a/src/MacVim/English.lproj/FindAndReplace.nib/classes.nib +++ /dev/null @@ -1,87 +0,0 @@ - - - - - IBClasses - - - CLASS - RBSplitView - LANGUAGE - ObjC - OUTLETS - - delegate - id - - SUPERCLASS - RBSplitSubview - - - CLASS - RBSplitSubview - LANGUAGE - ObjC - SUPERCLASS - NSView - - - ACTIONS - - findAndReplace - id - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - CLASS - NSMenu - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - ACTIONS - - didAdjustSubviews - RBSplitView - willAdjustSubviews - RBSplitView - - CLASS - NSObject - LANGUAGE - ObjC - - - CLASS - MMFindReplaceController - LANGUAGE - ObjC - OUTLETS - - backwardButton - NSButton - findBox - NSTextField - ignoreCaseButton - NSButton - matchWordButton - NSButton - replaceBox - NSTextField - - SUPERCLASS - NSWindowController - - - IBVersion - 1 - - diff --git a/src/MacVim/English.lproj/FindAndReplace.nib/info.nib b/src/MacVim/English.lproj/FindAndReplace.nib/info.nib deleted file mode 100644 index 5d0205c172..0000000000 --- a/src/MacVim/English.lproj/FindAndReplace.nib/info.nib +++ /dev/null @@ -1,20 +0,0 @@ - - - - - IBFramework Version - 629 - IBLastKnownRelativeProjectPath - ../MacVim.xcodeproj - IBOldestOS - 5 - IBOpenObjects - - 7 - - IBSystem Version - 9F33 - targetFramework - IBCocoaFramework - - diff --git a/src/MacVim/English.lproj/FindAndReplace.nib/keyedobjects.nib b/src/MacVim/English.lproj/FindAndReplace.nib/keyedobjects.nib deleted file mode 100644 index 715e37f1cfe2412042e31f4f1d7edd7c8e2cad4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6922 zcmbVQ33wD$wm$cE^}bbAst93A13?G`NJ1b$KnNj$00~P&0$~ZAPK7iy-J!cf2#a3! z9b`vAkpK#!xbog}96txf1;rH<0Tq{V1Qih(KhaU~ovP}DFyedjUibHP*K*If=brPQ z|D1a(YJ!1iEIs{QAV9$Y92mg_RnX5#ifpBPiN-SJ6Da9A@R|oLX#FTKwOvN9I zia=I8_zsxCGPQ6>5B*`KFXm&UoOc&{M=JG7Wo}&PaehD8!2uc28~VTi7znwL4_=rA zv!E8=%!LiG5q7{%*oEKS@E|+{55r-25}t)W!K?5ZyajK=JMb?4o`nzKL--gzhs*E{ z{F89RNKC{|oJ1rEqy-ao+3|^|02(lKa*qRIC+hnB&Wz}@&Wmf{GEJ3z5+Y> zntVg9knhMfa-IB0ex**zQ-LPXjx>wr(*in-4yT251RY67(IQ$*N7FHMEFDL^w1iHg zwR98ROt;XjbQ|4HchH^mUV0zhMR(Kt=>v2ReUR>@4TR8rbU!^nAEFP_gY*!6ls-sm!U{s4_p88ygmiU6T3O-3H_U8Ki zN;Dd%2m}MM`q6>P_&b!%3x`4o4unl~an=lNo9NdWB$Dy4x?Ww=haJHC!ab&0pJTb*_i zPOHp|p%qhfTXX?N**+Fx%UA=muqZRKrEEEiu?HD26N|9Dd<|Q13L}sSy&wzMr>#k~ zpK;7k&L>Z*;# z!n1YzCpHEImsvO@FYFKdnp~;Qe;;$}Q0K-`2VHggDFak!xC@6wr7!6}!ER17Tmc%-#G;g>z;#W$Gy`y{;N|3c=HkNn}%5cz{dn4Ps?4(1Yw!^)h@&Xe~wD}rdlY|Vyh2ty6bfe6kYLw|W|D^&3&XnF(l6_lL8 z#t8(NdRbM@%L^7{_RUK3WMnQ%^DOAsC(Y9~-#bkbT_2kTXM;F7fEl=BG)#9&N`gnTg#7)mIHfEA0qW0XiBTp92e zhVboNUl5Tnq&5}{hcv;=Mq16EQyajyD2B^Wk)_V{lu@<*K&5Y3#D`(mv3f7u z*8ulH4vMOYJw|_eKRmD>9)LZFBo)KDp{nh8ldF-8dZUls3k?UL0rtUuH~={~w>}!( z63;zUt@;B)(S$hkO%>*7Zd01}*L59)L;K(mJOVk009;I%bCNTLeKX9>n1T#{M?Ba7HK`Q9OQMR8grQ6HdbG@CLkz z4nenSWT0_idzQ>Rn9-VEjE1)^5c5~-?mY#k8{o9+T;y$?>KbKLT6z!8!21{`O;l5s z!aC}b=iqz;oL40=hx7nzqjVNReF4q9JhV=KtBZXE7xuvgJ)V*lxzV+;pb~2eXY=@d zit+m!Myv})toQ9A_61yoOU)vd#Zp<)#yF?N>`I&~ z7<>y?;XAkn|G)^XhEL%-(&A6$ynw6n`De|Dglj{UdEsCfYa2cr8u8UdZ@xg^j7Q?s z-fJP-I_E|%>&3cZuz1!*I;+&7KU1XU>fLd-agmDq5K(&|7= zVLf@nkPOg5KpgOM16q@Ft5I$=iYErvlV!3DmNrRM{X2y+>p3Jnt|pPR+)rBSjG!@_ z>WG4X60B@u0@8}KK0sPGGC|x~+L%%`+lPebH5D!~+3WvP9F~zDuo@@Vii66x`0bCe%Px)g3(WvYvfxwF2LU+%Avx%_fF%7%PNS7* zV-_38?u^^mA`ZyD>Hj_+aYhY~O^_OZXqp^CPh-2Ja_CL}jnw>?`^WwpL&i2*My#6u zhOoS5{%fkO8R`B0{o=Zel%fAd-r~QZ=)c^_asPR8gTb3tPS>m~V2QW$o}VbBs?kQx z!eMOqO$&SVRnz(ZTK-9hgwew3%`6|TC$F;CmYB{I7Y0{4YOQtnAE7@ zjn^Mhl+ZXVVVLInoACi;LadUd^bS$to%#Q)Li|`j@KRM7W z!dYxQn{YG2eGqs^+IoKAC7N;eU+DTOISkjxW8?_NbO&4~PpXa5V9bwFR)RtGva$)P z;r(xAx1-2z|DmzlBsP(yP4VlSfZq|^bFAmc^d5cmPd}`G&3Rj;$QR-iIhmzljf<;k zDgn1&@=N69Tb4YPO^YvCLg#0vdHQOY?u+fk|Fq&aam72;6>Ezv$Hh)zWm6lo42ybo z|J%*)Cugt$k2m{TQu$a#e14>)%nbCo-qmFEQ7!mi+Zw&GZfa}DXK2@M%r0zeH2!R- zwJLtJZ#wo(MLujcJayIKpyI(TXQd|`3fAj|=pwnak6a>OYWuACt|&JW@zo>hwEwc3 zaMUF(!~S?zsdZ!sRShc{nJP16XQS!*xNphT268pt*2I%bnT^}Om{L-Q=m^&}Pw3s4 z&_7^8PsfA~VrtD+O)f=S^~R;yP!;N00YG@OL0VFf8{{`O=P^tQEDlhrrN%;PjweS2 zNk&Mj<-(>VNHGh?Q^d})Re9X9Qa9sR4Q6|84ITjbwKi2-1{KMd4XS(M6Hyr_!VTNa zZ!$JW+8tR46&Tx_Uy5td?~0kdQN9zKbL5WSP*T366LqwMBQIp1PTZM52>N5Rvjaj%nF&bPir%`GW_Z^c{0RFcPsEi@j}=k(m+ ziOZx;Zsv46Pq{_1Q7;xSRM0-JTJg{FU@`D?xh<%1Ok%S!&D!(SDcIhsTSJdV{sn=c z(mCoGT^CXhOyt|mnc5h#32Y9YAt3pp>nAq5p3LSv&L<%ncT+PS6jb0r0R|9?kP{0L zha*)a!f>p5BgjIm&ZCj2@gM<4Ar_}22J;adMF^2>JW%lB;X)TYTu>2eMH26fl`R(! z8Ct1_46F%!b=r({9<8VI=>octE~0nQyAfxL=@Pn>E~Cro3c8Z6qO0i|x|Xh^>*)r% zk>0~rvQ=y~Tf^3}b!^`=O?PmA02iP8dD&In@ zQ@G3hl^?{L`5wHV7x^K)g&)XI=5zU0yp12s^SqCj_zJ!ye&!XlE!k+F-%+x(?78k4F2$AUv%Zhx^DX@+A3BN~skO z72DBtJVGp^RWyR@UW*5XN9kYb8G6Y;4Gu$+p|zo{A=%L0(9zJz(Akh`=w|3{=xN9> z^fL4|WE=V!ats3v1%`2k@rDvZjiKJK#IWA5*|68}h~as|%Z7Ihrw#8KJ~Di6_|9;h z1CDY@Tx+f^m&~>2I&z)3&Rip9CcjBBg-kW3sEL_Y zn>LuXnYNqum=2nbnvR=Jn$DO$HhpQjYWl_OGAEkbnfsXY%_ZhabCtQ;JkuOBuQzWr zZ!&K&Z!>QmKXV))%ZNtgl&Lx4vn8+j`3SzV)p2y!Bh_bsJ~nZS8CxTL)W; z?G9TPTTffQZJe#lHpMp0=CjSTg>B1hD{QN5Yi#Rm+im-72W$szPul)ud)@Y)?GxK& z+xK>2H`tAKvpvn;!=7%>v}f6S+q3Qc>|^aq?91#c?5pf+?Cb0s?Az@R+Yi|f+aI$( zZhzZ;%KonXjQy*Eu&h?{V&OKI%N;e8TyZ^BLzy&aa%;T}GGN)z;P3 zHNZ8-HN`c}HQiO=s&vhEglN3lu9L1e zTyMFqx~{ptcm3e{(e;z-XV?7rf@is|2l@5-kk38eFxd=}DxpI7)9 ze1M{I#^Dpu*^C$S%_}BS2`M3E~{8#)x_kqPB7c=8MC`LUE*6B#suxie7PoSSn5uE5u51vA9%RF0K?; zi)+R8;zn_kxJBG1?hx-4cZv6l4~YlGm&8}ZSH+X!8{%8yJK|~aJ@I|N2NhnB|oDjoJ>F$KTB%DvUnDD*ikYp)QYALmsI!Y;0cd4gTDOE|;(o88R zg`^rOBE_V+(mZLtv{1TBV$u?6nY2P$C9RRxNgJelq|MS+X}h#X+AE!r&PwN{52Xvz zC(>uq=h7F_CFv{avUEkdDqWMlmwu3bl>RCGBHfTdrZOj+WQ%N*9kMJZ%1Lr-xviWm zx0gH0o#f7Ps@zTPF87o(nj PLuvf~sQ%yhE3^Lw%*z7x diff --git a/src/MacVim/English.lproj/FindAndReplace.xib b/src/MacVim/English.lproj/FindAndReplace.xib new file mode 100644 index 0000000000..e48015b4df --- /dev/null +++ b/src/MacVim/English.lproj/FindAndReplace.xib @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index 5e2a234639ca0f11cd755542ec6e4b4169d5cb9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9169 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 - + - + diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib deleted file mode 100644 index 4512737ee31671b800f9eaa25f37db615536849d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25723 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 F{2%t!m7V|q diff --git a/src/MacVim/English.lproj/Preferences.nib/designable.nib b/src/MacVim/English.lproj/Preferences.xib similarity index 89% rename from src/MacVim/English.lproj/Preferences.nib/designable.nib rename to src/MacVim/English.lproj/Preferences.xib index 3f402568fe..303551a42b 100644 --- a/src/MacVim/English.lproj/Preferences.nib/designable.nib +++ b/src/MacVim/English.lproj/Preferences.xib @@ -1,9 +1,8 @@ - + - - - + + @@ -23,11 +22,11 @@ - + - + @@ -36,7 +35,7 @@ - + @@ -68,11 +67,11 @@ - + - + @@ -81,7 +80,7 @@ - + @@ -108,7 +107,7 @@ - + @@ -135,7 +134,7 @@ - + @@ -147,11 +146,11 @@ - + - + @@ -160,7 +159,7 @@ - + @@ -180,11 +179,11 @@ - + - - - + @@ -230,11 +229,11 @@ - + - + @@ -243,7 +242,7 @@ - + @@ -279,7 +278,7 @@ - + @@ -291,11 +290,11 @@ - + - - + @@ -319,7 +318,7 @@ - - + @@ -375,7 +374,7 @@ - - + @@ -397,7 +396,7 @@ - - + @@ -418,7 +417,7 @@ -