├── Changelog ├── PinYinNick.icns ├── PinYinNick.xcodeproj └── project.pbxproj ├── PinYinNick ├── PYNickAppDelegate.h ├── PYNickAppDelegate.m ├── Person.h ├── Person.m ├── PinYinNick-Info.plist ├── PinYinNick-Prefix.pch ├── PinYinNick.entitlements ├── en.lproj │ ├── Credits.rtf │ ├── InfoPlist.strings │ └── MainMenu.xib ├── main.m └── zh-Hans.lproj │ ├── Credits.rtf │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.xib └── README.md /Changelog: -------------------------------------------------------------------------------- 1 | Version 1.0.1: 2 | 3 | - Add Chinese localizaion 4 | - Bug fix: after user changed the sort order, the underlying people array should 5 | change its sort order 6 | -------------------------------------------------------------------------------- /PinYinNick.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyfdecyf/PinYinNick/264755796c6f356edc8bf9c82ca003e8d480fe41/PinYinNick.icns -------------------------------------------------------------------------------- /PinYinNick.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | FA0337DA15525140001162D0 /* Hanzi2Pinyin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5AB4681550FBD100653BCE /* Hanzi2Pinyin.framework */; }; 11 | FA0337DB15525147001162D0 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA06E987154FC38000BD92C4 /* AddressBook.framework */; }; 12 | FA0337E01552658C001162D0 /* Person.m in Sources */ = {isa = PBXBuildFile; fileRef = FA0337DF1552658C001162D0 /* Person.m */; }; 13 | FA0531181560D1D100A9B64A /* Changelog in Resources */ = {isa = PBXBuildFile; fileRef = FA0531171560D1D100A9B64A /* Changelog */; }; 14 | FA1779881560A7C000D202E7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA1779861560A7C000D202E7 /* Localizable.strings */; }; 15 | FA39C4BE1553B2C20059A4B4 /* Hanzi2Pinyin.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FA5AB4681550FBD100653BCE /* Hanzi2Pinyin.framework */; }; 16 | FA71E1271553C53200B62984 /* PinYinNick.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA71E1261553C53200B62984 /* PinYinNick.icns */; }; 17 | FA948FDD154D6A9A0094E4E9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA948FDC154D6A9A0094E4E9 /* Cocoa.framework */; }; 18 | FA948FE7154D6A9A0094E4E9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA948FE5154D6A9A0094E4E9 /* InfoPlist.strings */; }; 19 | FA948FE9154D6A9A0094E4E9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FA948FE8154D6A9A0094E4E9 /* main.m */; }; 20 | FA948FED154D6A9A0094E4E9 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = FA948FEB154D6A9A0094E4E9 /* Credits.rtf */; }; 21 | FA948FF0154D6A9A0094E4E9 /* PYNickAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FA948FEF154D6A9A0094E4E9 /* PYNickAppDelegate.m */; }; 22 | FA948FF3154D6A9A0094E4E9 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA948FF1154D6A9A0094E4E9 /* MainMenu.xib */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | FA0337D81552513D001162D0 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */; 29 | proxyType = 1; 30 | remoteGlobalIDString = FAD5FC3A144019540057FC2C; 31 | remoteInfo = Hanzi2Pinyin; 32 | }; 33 | FA5AB4671550FBD100653BCE /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */; 36 | proxyType = 2; 37 | remoteGlobalIDString = FAD5FC3B144019540057FC2C; 38 | remoteInfo = Hanzi2Pinyin; 39 | }; 40 | FA5AB4691550FBD100653BCE /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */; 43 | proxyType = 2; 44 | remoteGlobalIDString = FAD5FC53144019540057FC2C; 45 | remoteInfo = Hanzi2PinyinTests; 46 | }; 47 | /* End PBXContainerItemProxy section */ 48 | 49 | /* Begin PBXCopyFilesBuildPhase section */ 50 | FA39C4BD1553B2790059A4B4 /* CopyFiles */ = { 51 | isa = PBXCopyFilesBuildPhase; 52 | buildActionMask = 2147483647; 53 | dstPath = ""; 54 | dstSubfolderSpec = 10; 55 | files = ( 56 | FA39C4BE1553B2C20059A4B4 /* Hanzi2Pinyin.framework in CopyFiles */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | /* End PBXCopyFilesBuildPhase section */ 61 | 62 | /* Begin PBXFileReference section */ 63 | FA0337DC1552515E001162D0 /* Hanzi2Pinyin.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Hanzi2Pinyin.framework; path = "../../../../Library/Developer/Xcode/DerivedData/PinYinNick-aaydxbxvlscphgghuzigdajempwr/Build/Products/Debug/Hanzi2Pinyin.framework"; sourceTree = ""; }; 64 | FA0337DE1552658C001162D0 /* Person.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Person.h; sourceTree = ""; }; 65 | FA0337DF1552658C001162D0 /* Person.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Person.m; sourceTree = ""; }; 66 | FA0531171560D1D100A9B64A /* Changelog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Changelog; path = ../Changelog; sourceTree = ""; }; 67 | FA06E987154FC38000BD92C4 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; 68 | FA14D5BC1560ADA7007BE2CE /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = "zh-Hans"; path = "zh-Hans.lproj/Credits.rtf"; sourceTree = ""; }; 69 | FA14D5BD1560AF23007BE2CE /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; 70 | FA1779871560A7C000D202E7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 71 | FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Hanzi2Pinyin.xcodeproj; path = "/Users/alex/programming/mac/PinYinNickWorkspace/../../hanzi2pinyin/objective-c/Hanzi2Pinyin/Hanzi2Pinyin.xcodeproj"; sourceTree = ""; }; 72 | FA71E1261553C53200B62984 /* PinYinNick.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = PinYinNick.icns; sourceTree = SOURCE_ROOT; }; 73 | FA948FD8154D6A9A0094E4E9 /* PinYinNick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PinYinNick.app; sourceTree = BUILT_PRODUCTS_DIR; }; 74 | FA948FDC154D6A9A0094E4E9 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 75 | FA948FDF154D6A9A0094E4E9 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 76 | FA948FE0154D6A9A0094E4E9 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 77 | FA948FE1154D6A9A0094E4E9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 78 | FA948FE4154D6A9A0094E4E9 /* PinYinNick-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "PinYinNick-Info.plist"; sourceTree = ""; }; 79 | FA948FE6154D6A9A0094E4E9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 80 | FA948FE8154D6A9A0094E4E9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 81 | FA948FEA154D6A9A0094E4E9 /* PinYinNick-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PinYinNick-Prefix.pch"; sourceTree = ""; }; 82 | FA948FEC154D6A9A0094E4E9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 83 | FA948FEE154D6A9A0094E4E9 /* PYNickAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PYNickAppDelegate.h; sourceTree = ""; }; 84 | FA948FEF154D6A9A0094E4E9 /* PYNickAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PYNickAppDelegate.m; sourceTree = ""; }; 85 | FA948FF2154D6A9A0094E4E9 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 86 | FA948FF9154D6AED0094E4E9 /* PinYinNick.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PinYinNick.entitlements; sourceTree = ""; }; 87 | FAAEF4B7156003D90081CAFB /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/MainMenu.xib"; sourceTree = ""; }; 88 | /* End PBXFileReference section */ 89 | 90 | /* Begin PBXFrameworksBuildPhase section */ 91 | FA948FD5154D6A9A0094E4E9 /* Frameworks */ = { 92 | isa = PBXFrameworksBuildPhase; 93 | buildActionMask = 2147483647; 94 | files = ( 95 | FA0337DB15525147001162D0 /* AddressBook.framework in Frameworks */, 96 | FA0337DA15525140001162D0 /* Hanzi2Pinyin.framework in Frameworks */, 97 | FA948FDD154D6A9A0094E4E9 /* Cocoa.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | /* End PBXFrameworksBuildPhase section */ 102 | 103 | /* Begin PBXGroup section */ 104 | FA5AB4631550FBD100653BCE /* Products */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | FA5AB4681550FBD100653BCE /* Hanzi2Pinyin.framework */, 108 | FA5AB46A1550FBD100653BCE /* Hanzi2PinyinTests.octest */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | FA948FCD154D6A9A0094E4E9 = { 114 | isa = PBXGroup; 115 | children = ( 116 | FA948FE2154D6A9A0094E4E9 /* PinYinNick */, 117 | FA948FDB154D6A9A0094E4E9 /* Frameworks */, 118 | FA948FD9154D6A9A0094E4E9 /* Products */, 119 | FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */, 120 | ); 121 | sourceTree = ""; 122 | }; 123 | FA948FD9154D6A9A0094E4E9 /* Products */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | FA948FD8154D6A9A0094E4E9 /* PinYinNick.app */, 127 | ); 128 | name = Products; 129 | sourceTree = ""; 130 | }; 131 | FA948FDB154D6A9A0094E4E9 /* Frameworks */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | FA0337DC1552515E001162D0 /* Hanzi2Pinyin.framework */, 135 | FA06E987154FC38000BD92C4 /* AddressBook.framework */, 136 | FA948FDC154D6A9A0094E4E9 /* Cocoa.framework */, 137 | FA948FDE154D6A9A0094E4E9 /* Other Frameworks */, 138 | ); 139 | name = Frameworks; 140 | sourceTree = ""; 141 | }; 142 | FA948FDE154D6A9A0094E4E9 /* Other Frameworks */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | FA948FDF154D6A9A0094E4E9 /* AppKit.framework */, 146 | FA948FE0154D6A9A0094E4E9 /* CoreData.framework */, 147 | FA948FE1154D6A9A0094E4E9 /* Foundation.framework */, 148 | ); 149 | name = "Other Frameworks"; 150 | sourceTree = ""; 151 | }; 152 | FA948FE2154D6A9A0094E4E9 /* PinYinNick */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | FA948FF9154D6AED0094E4E9 /* PinYinNick.entitlements */, 156 | FA948FEE154D6A9A0094E4E9 /* PYNickAppDelegate.h */, 157 | FA948FEF154D6A9A0094E4E9 /* PYNickAppDelegate.m */, 158 | FA0337DE1552658C001162D0 /* Person.h */, 159 | FA0337DF1552658C001162D0 /* Person.m */, 160 | FA948FF1154D6A9A0094E4E9 /* MainMenu.xib */, 161 | FA948FE3154D6A9A0094E4E9 /* Supporting Files */, 162 | ); 163 | path = PinYinNick; 164 | sourceTree = ""; 165 | }; 166 | FA948FE3154D6A9A0094E4E9 /* Supporting Files */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | FA0531171560D1D100A9B64A /* Changelog */, 170 | FA1779861560A7C000D202E7 /* Localizable.strings */, 171 | FA71E1261553C53200B62984 /* PinYinNick.icns */, 172 | FA948FE4154D6A9A0094E4E9 /* PinYinNick-Info.plist */, 173 | FA948FE5154D6A9A0094E4E9 /* InfoPlist.strings */, 174 | FA948FE8154D6A9A0094E4E9 /* main.m */, 175 | FA948FEA154D6A9A0094E4E9 /* PinYinNick-Prefix.pch */, 176 | FA948FEB154D6A9A0094E4E9 /* Credits.rtf */, 177 | ); 178 | name = "Supporting Files"; 179 | sourceTree = ""; 180 | }; 181 | /* End PBXGroup section */ 182 | 183 | /* Begin PBXNativeTarget section */ 184 | FA948FD7154D6A9A0094E4E9 /* PinYinNick */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = FA948FF6154D6A9A0094E4E9 /* Build configuration list for PBXNativeTarget "PinYinNick" */; 187 | buildPhases = ( 188 | FA948FD4154D6A9A0094E4E9 /* Sources */, 189 | FA948FD5154D6A9A0094E4E9 /* Frameworks */, 190 | FA948FD6154D6A9A0094E4E9 /* Resources */, 191 | FA39C4BD1553B2790059A4B4 /* CopyFiles */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | FA0337D91552513D001162D0 /* PBXTargetDependency */, 197 | ); 198 | name = PinYinNick; 199 | productName = PinYinNick; 200 | productReference = FA948FD8154D6A9A0094E4E9 /* PinYinNick.app */; 201 | productType = "com.apple.product-type.application"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | FA948FCF154D6A9A0094E4E9 /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | CLASSPREFIX = PYNick; 210 | LastUpgradeCheck = 0430; 211 | }; 212 | buildConfigurationList = FA948FD2154D6A9A0094E4E9 /* Build configuration list for PBXProject "PinYinNick" */; 213 | compatibilityVersion = "Xcode 3.2"; 214 | developmentRegion = English; 215 | hasScannedForEncodings = 0; 216 | knownRegions = ( 217 | en, 218 | "zh-Hans", 219 | ); 220 | mainGroup = FA948FCD154D6A9A0094E4E9; 221 | productRefGroup = FA948FD9154D6A9A0094E4E9 /* Products */; 222 | projectDirPath = ""; 223 | projectReferences = ( 224 | { 225 | ProductGroup = FA5AB4631550FBD100653BCE /* Products */; 226 | ProjectRef = FA5AB4621550FBD100653BCE /* Hanzi2Pinyin.xcodeproj */; 227 | }, 228 | ); 229 | projectRoot = ""; 230 | targets = ( 231 | FA948FD7154D6A9A0094E4E9 /* PinYinNick */, 232 | ); 233 | }; 234 | /* End PBXProject section */ 235 | 236 | /* Begin PBXReferenceProxy section */ 237 | FA5AB4681550FBD100653BCE /* Hanzi2Pinyin.framework */ = { 238 | isa = PBXReferenceProxy; 239 | fileType = wrapper.framework; 240 | path = Hanzi2Pinyin.framework; 241 | remoteRef = FA5AB4671550FBD100653BCE /* PBXContainerItemProxy */; 242 | sourceTree = BUILT_PRODUCTS_DIR; 243 | }; 244 | FA5AB46A1550FBD100653BCE /* Hanzi2PinyinTests.octest */ = { 245 | isa = PBXReferenceProxy; 246 | fileType = wrapper.cfbundle; 247 | path = Hanzi2PinyinTests.octest; 248 | remoteRef = FA5AB4691550FBD100653BCE /* PBXContainerItemProxy */; 249 | sourceTree = BUILT_PRODUCTS_DIR; 250 | }; 251 | /* End PBXReferenceProxy section */ 252 | 253 | /* Begin PBXResourcesBuildPhase section */ 254 | FA948FD6154D6A9A0094E4E9 /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | FA948FE7154D6A9A0094E4E9 /* InfoPlist.strings in Resources */, 259 | FA948FED154D6A9A0094E4E9 /* Credits.rtf in Resources */, 260 | FA948FF3154D6A9A0094E4E9 /* MainMenu.xib in Resources */, 261 | FA71E1271553C53200B62984 /* PinYinNick.icns in Resources */, 262 | FA1779881560A7C000D202E7 /* Localizable.strings in Resources */, 263 | FA0531181560D1D100A9B64A /* Changelog in Resources */, 264 | ); 265 | runOnlyForDeploymentPostprocessing = 0; 266 | }; 267 | /* End PBXResourcesBuildPhase section */ 268 | 269 | /* Begin PBXSourcesBuildPhase section */ 270 | FA948FD4154D6A9A0094E4E9 /* Sources */ = { 271 | isa = PBXSourcesBuildPhase; 272 | buildActionMask = 2147483647; 273 | files = ( 274 | FA948FE9154D6A9A0094E4E9 /* main.m in Sources */, 275 | FA948FF0154D6A9A0094E4E9 /* PYNickAppDelegate.m in Sources */, 276 | FA0337E01552658C001162D0 /* Person.m in Sources */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXSourcesBuildPhase section */ 281 | 282 | /* Begin PBXTargetDependency section */ 283 | FA0337D91552513D001162D0 /* PBXTargetDependency */ = { 284 | isa = PBXTargetDependency; 285 | name = Hanzi2Pinyin; 286 | targetProxy = FA0337D81552513D001162D0 /* PBXContainerItemProxy */; 287 | }; 288 | /* End PBXTargetDependency section */ 289 | 290 | /* Begin PBXVariantGroup section */ 291 | FA1779861560A7C000D202E7 /* Localizable.strings */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | FA1779871560A7C000D202E7 /* zh-Hans */, 295 | ); 296 | name = Localizable.strings; 297 | sourceTree = ""; 298 | }; 299 | FA948FE5154D6A9A0094E4E9 /* InfoPlist.strings */ = { 300 | isa = PBXVariantGroup; 301 | children = ( 302 | FA948FE6154D6A9A0094E4E9 /* en */, 303 | FA14D5BD1560AF23007BE2CE /* zh-Hans */, 304 | ); 305 | name = InfoPlist.strings; 306 | sourceTree = ""; 307 | }; 308 | FA948FEB154D6A9A0094E4E9 /* Credits.rtf */ = { 309 | isa = PBXVariantGroup; 310 | children = ( 311 | FA948FEC154D6A9A0094E4E9 /* en */, 312 | FA14D5BC1560ADA7007BE2CE /* zh-Hans */, 313 | ); 314 | name = Credits.rtf; 315 | sourceTree = ""; 316 | }; 317 | FA948FF1154D6A9A0094E4E9 /* MainMenu.xib */ = { 318 | isa = PBXVariantGroup; 319 | children = ( 320 | FA948FF2154D6A9A0094E4E9 /* en */, 321 | FAAEF4B7156003D90081CAFB /* zh-Hans */, 322 | ); 323 | name = MainMenu.xib; 324 | sourceTree = ""; 325 | }; 326 | /* End PBXVariantGroup section */ 327 | 328 | /* Begin XCBuildConfiguration section */ 329 | FA948FF4154D6A9A0094E4E9 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 334 | CLANG_ENABLE_OBJC_ARC = YES; 335 | COPY_PHASE_STRIP = NO; 336 | GCC_C_LANGUAGE_STANDARD = gnu99; 337 | GCC_DYNAMIC_NO_PIC = NO; 338 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 339 | GCC_OPTIMIZATION_LEVEL = 0; 340 | GCC_PREPROCESSOR_DEFINITIONS = ( 341 | "DEBUG=1", 342 | "$(inherited)", 343 | ); 344 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 345 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 346 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 347 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 349 | GCC_WARN_UNUSED_VARIABLE = YES; 350 | MACOSX_DEPLOYMENT_TARGET = 10.7; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = macosx; 353 | WARNING_CFLAGS = ""; 354 | }; 355 | name = Debug; 356 | }; 357 | FA948FF5154D6A9A0094E4E9 /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 362 | CLANG_ENABLE_OBJC_ARC = YES; 363 | COPY_PHASE_STRIP = YES; 364 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 367 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 368 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 369 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 370 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 371 | GCC_WARN_UNUSED_VARIABLE = YES; 372 | MACOSX_DEPLOYMENT_TARGET = 10.7; 373 | SDKROOT = macosx; 374 | WARNING_CFLAGS = ""; 375 | }; 376 | name = Release; 377 | }; 378 | FA948FF7154D6A9A0094E4E9 /* Debug */ = { 379 | isa = XCBuildConfiguration; 380 | buildSettings = { 381 | CODE_SIGN_ENTITLEMENTS = PinYinNick/PinYinNick.entitlements; 382 | FRAMEWORK_SEARCH_PATHS = ( 383 | "$(inherited)", 384 | "\"$(SRCROOT)/../../../../Library/Developer/Xcode/DerivedData/PinYinNick-aaydxbxvlscphgghuzigdajempwr/Build/Products/Debug\"", 385 | ); 386 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 387 | GCC_PREFIX_HEADER = "PinYinNick/PinYinNick-Prefix.pch"; 388 | INFOPLIST_FILE = "PinYinNick/PinYinNick-Info.plist"; 389 | PRODUCT_NAME = "$(TARGET_NAME)"; 390 | WRAPPER_EXTENSION = app; 391 | }; 392 | name = Debug; 393 | }; 394 | FA948FF8154D6A9A0094E4E9 /* Release */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | CODE_SIGN_ENTITLEMENTS = PinYinNick/PinYinNick.entitlements; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(inherited)", 400 | "\"$(SRCROOT)/../../../../Library/Developer/Xcode/DerivedData/PinYinNick-aaydxbxvlscphgghuzigdajempwr/Build/Products/Debug\"", 401 | ); 402 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 403 | GCC_PREFIX_HEADER = "PinYinNick/PinYinNick-Prefix.pch"; 404 | GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS; 405 | INFOPLIST_FILE = "PinYinNick/PinYinNick-Info.plist"; 406 | PRODUCT_NAME = "$(TARGET_NAME)"; 407 | WRAPPER_EXTENSION = app; 408 | }; 409 | name = Release; 410 | }; 411 | /* End XCBuildConfiguration section */ 412 | 413 | /* Begin XCConfigurationList section */ 414 | FA948FD2154D6A9A0094E4E9 /* Build configuration list for PBXProject "PinYinNick" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | FA948FF4154D6A9A0094E4E9 /* Debug */, 418 | FA948FF5154D6A9A0094E4E9 /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | FA948FF6154D6A9A0094E4E9 /* Build configuration list for PBXNativeTarget "PinYinNick" */ = { 424 | isa = XCConfigurationList; 425 | buildConfigurations = ( 426 | FA948FF7154D6A9A0094E4E9 /* Debug */, 427 | FA948FF8154D6A9A0094E4E9 /* Release */, 428 | ); 429 | defaultConfigurationIsVisible = 0; 430 | defaultConfigurationName = Release; 431 | }; 432 | /* End XCConfigurationList section */ 433 | }; 434 | rootObject = FA948FCF154D6A9A0094E4E9 /* Project object */; 435 | } 436 | -------------------------------------------------------------------------------- /PinYinNick/PYNickAppDelegate.h: -------------------------------------------------------------------------------- 1 | // Created by Chen Yufei on 12-4-29. 2 | // Copyright (c) 2012. All rights reserved. 3 | 4 | #import 5 | #import 6 | #import 7 | 8 | @interface PYNickAppDelegate : NSObject { 9 | ABAddressBook *_ab; 10 | NSTextFieldCell *_fullNameCell; 11 | NSTextFieldCell *_nickNameCell; 12 | } 13 | 14 | @property (readonly, strong, nonatomic) NSMutableArray *people; 15 | 16 | @property (assign) IBOutlet NSWindow *window; 17 | @property (weak) IBOutlet NSTableView *contactTableView; 18 | 19 | - (IBAction)saveModifiedContact:(id)sender; 20 | - (IBAction)removeAllPinyinNickNames:(id)sender; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /PinYinNick/PYNickAppDelegate.m: -------------------------------------------------------------------------------- 1 | // Created by Chen Yufei on 12-4-29. 2 | // Copyright (c) 2012. All rights reserved. 3 | 4 | #import "PYNickAppDelegate.h" 5 | #import "Person.h" 6 | #import "Hanzi2Pinyin/Hanzi2Pinyin.h" 7 | #import 8 | 9 | @implementation PYNickAppDelegate 10 | 11 | @synthesize people = _people; 12 | 13 | @synthesize window = _window; 14 | @synthesize contactTableView = _contactTableView; 15 | 16 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 17 | { 18 | // Insert code here to initialize your application 19 | } 20 | 21 | static const CGFloat CELL_FONT_SIZE = 13; 22 | 23 | - (void)createCell { 24 | // Setup custom data cell for modified person 25 | NSColor *blueColor = [NSColor blueColor]; 26 | NSFont *boldSystemFont = [NSFont boldSystemFontOfSize:(CGFloat)CELL_FONT_SIZE]; 27 | 28 | _fullNameCell = [[NSTextFieldCell alloc] initTextCell:@""]; 29 | [_fullNameCell setEditable:NO]; 30 | [_fullNameCell setTextColor:blueColor]; 31 | [_fullNameCell setFont:boldSystemFont]; 32 | 33 | _nickNameCell = [_fullNameCell copy]; 34 | [_nickNameCell setEditable:YES]; 35 | } 36 | 37 | - (void)loadContacts { 38 | _ab = [ABAddressBook sharedAddressBook]; 39 | NSArray *abPeople = [_ab people]; 40 | _people = [[NSMutableArray alloc] initWithCapacity:[abPeople count]]; 41 | 42 | for (ABPerson *abPerson in abPeople) { 43 | Person *person = [[Person alloc] initWithPerson:abPerson]; 44 | [_people addObject:person]; 45 | [self startObservingPerson:person]; 46 | } 47 | 48 | // Sort people using their full name and nick. 49 | NSSortDescriptor *fullNamePinyinSortDesc = [NSSortDescriptor 50 | sortDescriptorWithKey:@"fullNamePinyin" 51 | ascending:YES 52 | selector:@selector(caseInsensitiveCompare:)]; 53 | NSSortDescriptor *nickNameSortDesc = [NSSortDescriptor 54 | sortDescriptorWithKey:@"nickName" 55 | ascending:YES 56 | selector:@selector(caseInsensitiveCompare:)]; 57 | NSArray *sortDesc = [NSArray arrayWithObjects:fullNamePinyinSortDesc, nickNameSortDesc, nil]; 58 | [_people sortUsingDescriptors:sortDesc]; 59 | } 60 | 61 | - (id)init { 62 | // When using NSArrayController, it's important to do initialization in init. 63 | // NSArrayController may access the binded content array before awakeFromNib is called. 64 | self = [super init]; 65 | if (self) { 66 | [self loadContacts]; 67 | [self createCell]; 68 | } 69 | return self; 70 | } 71 | 72 | // For undo support. 73 | 74 | static void *PYNickAppDelegateKVOContext; 75 | 76 | - (void)startObservingPerson:(Person *)person 77 | { 78 | [person addObserver:self 79 | forKeyPath:@"nickName" 80 | options:NSKeyValueObservingOptionOld 81 | context:&PYNickAppDelegateKVOContext]; 82 | [person addObserver:self 83 | forKeyPath:@"modified" 84 | options:NSKeyValueObservingOptionOld 85 | context:&PYNickAppDelegateKVOContext]; 86 | } 87 | 88 | - (void)changeKeyPath:(NSString *)keyPath 89 | ofObject:(id)obj 90 | toValue:(id)newValue 91 | { 92 | // setValue:forKeyPath: will cause the key-value observing method 93 | // to be called, which takes care of the undo stuff 94 | [obj setValue:newValue forKeyPath:keyPath]; 95 | } 96 | 97 | - (void)observeValueForKeyPath:(NSString *)keyPath 98 | ofObject:(id)object 99 | change:(NSDictionary *)change 100 | context:(void *)context 101 | { 102 | if (context != &PYNickAppDelegateKVOContext) { 103 | // If the context does not match, this message 104 | // must be intended for our superclass. 105 | [super observeValueForKeyPath:keyPath 106 | ofObject:object 107 | change:change 108 | context:context]; 109 | return; 110 | } 111 | 112 | id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; 113 | 114 | // NSNull objects are used to represent nil in a dictionary 115 | if (oldValue == [NSNull null]) { 116 | oldValue = nil; 117 | } 118 | // NSLog(@"oldValue = %@", oldValue); 119 | NSUndoManager *undo = [_window undoManager]; 120 | [[undo prepareWithInvocationTarget:self] changeKeyPath:keyPath 121 | ofObject:object 122 | toValue:oldValue]; 123 | [undo setActionName:[NSString stringWithFormat:@"Edit %@", [object fullName]]]; 124 | } 125 | 126 | // Make modified row use bold and blue font 127 | 128 | static NSString *FULLNAME_IDENTIFIER = @"fullName"; 129 | static NSString *NICKNAME_IDENTIFIER = @"nickName"; 130 | 131 | - (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn 132 | row:(NSInteger)row { 133 | NSAssert((NSUInteger)row < [_people count], @"row exceeds people count"); 134 | Person *person = [_people objectAtIndex:row]; 135 | if (!tableColumn) 136 | return nil; 137 | 138 | if ([person isModified]) { 139 | NSString *columnIdentifier = [tableColumn identifier]; 140 | if ([columnIdentifier isEqualToString:FULLNAME_IDENTIFIER]) { 141 | return _fullNameCell; 142 | } else { 143 | return _nickNameCell; 144 | } 145 | } 146 | return nil; 147 | } 148 | 149 | - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn { 150 | // Keep the underlying _people array's sort order in sync with table view's sorting order. 151 | // Otherwise, the row index in the table view can't be used to get the correct person. 152 | [_people sortUsingDescriptors:[_contactTableView sortDescriptors]]; 153 | } 154 | 155 | - (IBAction)saveModifiedContact:(id)sender { 156 | NSUndoManager *undo = [_window undoManager]; 157 | [undo removeAllActions]; 158 | [undo disableUndoRegistration]; 159 | for (Person *person in _people) { 160 | if ([person isModified]) { 161 | // Empty value in table view will be set to nil. 162 | // So don't need to test for empty string here. 163 | NSString *nickName = [person nickName]; 164 | ABPerson *abPerson = [person abPerson]; 165 | [abPerson setValue:nickName forProperty:kABNicknameProperty]; 166 | [person setModified:NO]; 167 | } 168 | } 169 | [undo enableUndoRegistration]; 170 | [_ab save]; 171 | [_contactTableView reloadData]; 172 | } 173 | 174 | - (void)removeNickAlertEnded:(NSAlert *)alert code:(NSInteger)choice context:(void *)v { 175 | // Default is cancel. 176 | if (choice == NSAlertDefaultReturn) { 177 | return; 178 | } 179 | NSUndoManager *undo = [_window undoManager]; 180 | [undo removeAllActions]; 181 | [undo disableUndoRegistration]; 182 | for (Person *person in _people) { 183 | if ([Hanzi2Pinyin hasChineseCharacter:[person fullName]]) { 184 | [person setNickName:nil]; 185 | [person setModified:NO]; 186 | ABPerson *abPerson = [person abPerson]; 187 | [abPerson setValue:nil forProperty:kABNicknameProperty]; 188 | } 189 | } 190 | [undo enableUndoRegistration]; 191 | [_ab save]; 192 | } 193 | 194 | #define LocalizedString(key, defaultValue) \ 195 | [[NSBundle mainBundle] localizedStringForKey:(key) value:defaultValue table:nil] 196 | 197 | - (IBAction)removeAllPinyinNickNames:(id)sender { 198 | NSAlert *alert = [NSAlert alertWithMessageText:LocalizedString(@"REMOVE_ALERT_MSG", @"Remove all pinyin nick names") 199 | defaultButton:LocalizedString(@"CANCEL", @"Cancel") 200 | alternateButton:LocalizedString(@"REMOVE", @"Remove") 201 | otherButton:nil 202 | informativeTextWithFormat:LocalizedString(@"REMOVE_ALERT_INFO", @"Nick names associated with contacts which have Chinese characters will be deleted!")]; 203 | [alert beginSheetModalForWindow:_window 204 | modalDelegate:self 205 | didEndSelector:@selector(removeNickAlertEnded:code:context:) 206 | contextInfo:NULL]; 207 | } 208 | 209 | @end 210 | -------------------------------------------------------------------------------- /PinYinNick/Person.h: -------------------------------------------------------------------------------- 1 | // Created by Chen Yufei on 12-5-3. 2 | // Copyright (c) 2012. All rights reserved. 3 | 4 | #import 5 | #import 6 | 7 | @interface Person : NSObject 8 | 9 | @property (readwrite, strong, nonatomic) NSString *nickName; 10 | @property (readonly, strong) NSString *fullName; 11 | @property (readonly, strong) NSString *fullNamePinyin; 12 | @property (readonly, strong) ABPerson *abPerson; 13 | @property (readwrite, assign, nonatomic, getter = isModified) BOOL modified; 14 | 15 | - (id)initWithPerson:(ABPerson *)person; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /PinYinNick/Person.m: -------------------------------------------------------------------------------- 1 | // Created by Chen Yufei on 12-5-3. 2 | // Copyright (c) 2012. All rights reserved. 3 | 4 | #import "Person.h" 5 | #import "Hanzi2Pinyin/Hanzi2Pinyin.h" 6 | 7 | @implementation Person 8 | 9 | @synthesize nickName = _nickName; 10 | @synthesize fullName = _fullName; 11 | @synthesize fullNamePinyin = _fullNamePinyin; 12 | @synthesize abPerson = _abPerson; 13 | @synthesize modified = _modified; 14 | 15 | - (id)initWithPerson:(ABPerson *)abPerson { 16 | self = [super init]; 17 | if (self) { 18 | _modified = NO; 19 | if (!abPerson) { 20 | return self; 21 | } 22 | 23 | _abPerson = abPerson; 24 | _fullName = [Person fullNameForPerson:abPerson]; 25 | _fullNamePinyin = [Hanzi2Pinyin convert:_fullName]; 26 | _nickName = [abPerson valueForProperty:kABNicknameProperty]; 27 | if (!_nickName) { 28 | _nickName = [Person pynickForPerson:abPerson fullName:_fullName]; 29 | if (_nickName) 30 | _modified = YES; 31 | } 32 | } 33 | return self; 34 | } 35 | 36 | - (id)init { 37 | return [self initWithPerson:nil]; 38 | } 39 | 40 | - (NSString *)description { 41 | return [NSString stringWithFormat:@"Person fullName:%@ nickName:%@ modified:%d", 42 | _fullName, _nickName, _modified]; 43 | } 44 | 45 | - (void)setNickName:(NSString *)nickName { 46 | if ([nickName isEqualToString:_nickName]) { 47 | return; 48 | } 49 | _nickName = nickName; 50 | 51 | [self willChangeValueForKey:@"modified"]; 52 | _modified = YES; 53 | [self didChangeValueForKey:@"modified"]; 54 | } 55 | 56 | + (NSString *)fullNameForPerson:(ABPerson *)abPerson { 57 | NSString *firstName = [abPerson valueForProperty:kABFirstNameProperty]; 58 | NSString *lastName = [abPerson valueForProperty:kABLastNameProperty]; 59 | NSMutableString *fullName = [[NSMutableString alloc] initWithCapacity:10]; 60 | if (lastName != nil) { 61 | [fullName appendString:lastName]; 62 | } 63 | if (firstName != nil) { 64 | if (lastName == nil) 65 | [fullName appendString:firstName]; 66 | else 67 | [fullName appendFormat:@" %@", firstName]; 68 | } 69 | return [NSString stringWithString:fullName]; 70 | } 71 | 72 | + (NSString *)pynickForPerson:(ABPerson *)abPerson fullName:(NSString *)fullName { 73 | if (!fullName) { 74 | fullName = [self fullNameForPerson:abPerson]; 75 | } 76 | fullName = [fullName stringByReplacingOccurrencesOfString:@" " withString:@""]; 77 | NSString *pynick = [Hanzi2Pinyin convertToAbbreviation:fullName]; 78 | // If the full name does not include Chinese, don't create nick 79 | if ([pynick isEqualToString:fullName]) { 80 | pynick = nil; 81 | } 82 | 83 | return pynick; 84 | } 85 | 86 | @end 87 | -------------------------------------------------------------------------------- /PinYinNick/PinYinNick-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | PinYinNick.icns 11 | CFBundleIdentifier 12 | info.chenyufei.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.1 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 25 | LSApplicationCategoryType 26 | public.app-category.utilities 27 | LSMinimumSystemVersion 28 | ${MACOSX_DEPLOYMENT_TARGET} 29 | NSHumanReadableCopyright 30 | Copyright © 2012 Chen Yufei. All rights reserved. 31 | NSMainNibFile 32 | MainMenu 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /PinYinNick/PinYinNick-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'PinYinNick' target in the 'PinYinNick' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /PinYinNick/PinYinNick.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.personal-information.addressbook 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /PinYinNick/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf320 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc 6 | 7 | \f0\fs24 \cf0 This simple program is created by\ 8 | \ 9 | Chen Yufei\ 10 | \ 11 | Follow me on twitter @cyfdecyf} -------------------------------------------------------------------------------- /PinYinNick/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /PinYinNick/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 11E53 6 | 2182 7 | 1138.47 8 | 569.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2182 12 | 13 | 14 | NSScroller 15 | NSTableHeaderView 16 | NSMenuItem 17 | NSMenu 18 | NSScrollView 19 | NSButtonCell 20 | NSButton 21 | NSTextFieldCell 22 | NSArrayController 23 | NSTableView 24 | IBNSLayoutConstraint 25 | NSCustomObject 26 | NSView 27 | NSWindowTemplate 28 | NSTableColumn 29 | 30 | 31 | com.apple.InterfaceBuilder.CocoaPlugin 32 | 33 | 34 | PluginDependencyRecalculationVersion 35 | 36 | 37 | 38 | 39 | NSApplication 40 | 41 | 42 | FirstResponder 43 | 44 | 45 | NSApplication 46 | 47 | 48 | AMainMenu 49 | 50 | 51 | 52 | PinYinNick 53 | 54 | 1048576 55 | 2147483647 56 | 57 | NSImage 58 | NSMenuCheckmark 59 | 60 | 61 | NSImage 62 | NSMenuMixedState 63 | 64 | submenuAction: 65 | 66 | PinYinNick 67 | 68 | 69 | 70 | About PinYinNick 71 | 72 | 2147483647 73 | 74 | 75 | 76 | 77 | 78 | YES 79 | YES 80 | 81 | 82 | 1048576 83 | 2147483647 84 | 85 | 86 | 87 | 88 | 89 | Preferences… 90 | , 91 | 1048576 92 | 2147483647 93 | 94 | 95 | 96 | 97 | 98 | YES 99 | YES 100 | 101 | 102 | 1048576 103 | 2147483647 104 | 105 | 106 | 107 | 108 | 109 | Services 110 | 111 | 1048576 112 | 2147483647 113 | 114 | 115 | submenuAction: 116 | 117 | Services 118 | 119 | _NSServicesMenu 120 | 121 | 122 | 123 | 124 | YES 125 | YES 126 | 127 | 128 | 1048576 129 | 2147483647 130 | 131 | 132 | 133 | 134 | 135 | Hide PinYinNick 136 | h 137 | 1048576 138 | 2147483647 139 | 140 | 141 | 142 | 143 | 144 | Hide Others 145 | h 146 | 1572864 147 | 2147483647 148 | 149 | 150 | 151 | 152 | 153 | Show All 154 | 155 | 1048576 156 | 2147483647 157 | 158 | 159 | 160 | 161 | 162 | YES 163 | YES 164 | 165 | 166 | 1048576 167 | 2147483647 168 | 169 | 170 | 171 | 172 | 173 | Quit PinYinNick 174 | q 175 | 1048576 176 | 2147483647 177 | 178 | 179 | 180 | 181 | _NSAppleMenu 182 | 183 | 184 | 185 | 186 | File 187 | 188 | 2147483647 189 | 190 | 191 | submenuAction: 192 | 193 | File 194 | 195 | 196 | 197 | Save modified nick names 198 | s 199 | 1048576 200 | 2147483647 201 | 202 | 203 | 204 | 205 | 206 | Remove all pinyin nick 207 | 208 | 2147483647 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | Edit 218 | 219 | 1048576 220 | 2147483647 221 | 222 | 223 | submenuAction: 224 | 225 | Edit 226 | 227 | 228 | 229 | Undo 230 | z 231 | 1048576 232 | 2147483647 233 | 234 | 235 | 236 | 237 | 238 | Redo 239 | Z 240 | 1179648 241 | 2147483647 242 | 243 | 244 | 245 | 246 | 247 | YES 248 | YES 249 | 250 | 251 | 1048576 252 | 2147483647 253 | 254 | 255 | 256 | 257 | 258 | Cut 259 | x 260 | 1048576 261 | 2147483647 262 | 263 | 264 | 265 | 266 | 267 | Copy 268 | c 269 | 1048576 270 | 2147483647 271 | 272 | 273 | 274 | 275 | 276 | Paste 277 | v 278 | 1048576 279 | 2147483647 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | Window 289 | 290 | 1048576 291 | 2147483647 292 | 293 | 294 | submenuAction: 295 | 296 | Window 297 | 298 | 299 | 300 | Minimize 301 | m 302 | 1048576 303 | 2147483647 304 | 305 | 306 | 307 | 308 | 309 | Zoom 310 | 311 | 1048576 312 | 2147483647 313 | 314 | 315 | 316 | 317 | _NSWindowsMenu 318 | 319 | 320 | 321 | 322 | Help 323 | 324 | 2147483647 325 | 326 | 327 | submenuAction: 328 | 329 | Help 330 | 331 | 332 | 333 | PinYinNick Help 334 | ? 335 | 1048576 336 | 2147483647 337 | 338 | 339 | 340 | 341 | _NSHelpMenu 342 | 343 | 344 | 345 | _NSMainMenu 346 | 347 | 348 | 15 349 | 2 350 | {{335, 250}, {251, 347}} 351 | 1954021376 352 | PinYinNick 353 | NSWindow 354 | 355 | 356 | 357 | 358 | 256 359 | 360 | 361 | 362 | 268 363 | {{24, 13}, {204, 32}} 364 | 365 | _NS:9 366 | YES 367 | 368 | 67239424 369 | 134217728 370 | Save modified nick names 371 | 372 | LucidaGrande 373 | 13 374 | 1044 375 | 376 | _NS:9 377 | 378 | -2038284033 379 | 268435585 380 | 381 | s 382 | 200 383 | 25 384 | 385 | 386 | 387 | 388 | 268 389 | 390 | 391 | 392 | 2304 393 | 394 | 395 | 396 | 256 397 | {251, 276} 398 | 399 | 400 | _NS:13 401 | YES 402 | 403 | 404 | 256 405 | {251, 17} 406 | 407 | 408 | _NS:16 409 | 410 | 411 | 412 | 413 | -2147483392 414 | {{224, 0}, {16, 17}} 415 | 416 | _NS:19 417 | 418 | 419 | 420 | fullName 421 | 150 422 | 40 423 | 1000 424 | 425 | 75628096 426 | 134219776 427 | Full name 428 | 429 | 430 | 3 431 | MC4zMzMzMzI5ODU2AA 432 | 433 | 434 | 6 435 | System 436 | headerTextColor 437 | 438 | 3 439 | MAA 440 | 441 | 442 | 443 | 444 | 337772096 445 | 2048 446 | Full name 447 | 448 | 449 | 450 | 6 451 | System 452 | controlBackgroundColor 453 | 454 | 3 455 | MC42NjY2NjY2NjY3AA 456 | 457 | 458 | 459 | 6 460 | System 461 | controlTextColor 462 | 463 | 464 | 465 | 3 466 | YES 467 | 468 | 469 | fullNamePinyin 470 | YES 471 | caseInsensitiveCompare: 472 | 473 | 474 | 475 | nickName 476 | 95 477 | 40 478 | 1000 479 | 480 | 75628096 481 | 134219776 482 | Pinyin Nick 483 | 484 | 485 | 486 | 487 | 488 | 337772096 489 | 2048 490 | Text Cell 491 | 492 | 493 | 494 | 495 | 496 | 3 497 | YES 498 | YES 499 | 500 | 501 | nickName 502 | YES 503 | caseInsensitiveCompare: 504 | 505 | 506 | 507 | 3 508 | 2 509 | 510 | 3 511 | MQA 512 | 513 | 514 | 6 515 | System 516 | gridColor 517 | 518 | 3 519 | MC41AA 520 | 521 | 522 | 17 523 | 1925185536 524 | 525 | 526 | 1 527 | 5 528 | 15 529 | 0 530 | YES 531 | 0 532 | 1 533 | 534 | 535 | {{1, 17}, {251, 276}} 536 | 537 | 538 | _NS:11 539 | 540 | 541 | 4 542 | 543 | 544 | 545 | -2147483392 546 | {{224, 17}, {15, 102}} 547 | 548 | 549 | _NS:58 550 | 551 | _doScroller: 552 | 37 553 | 0.1947367936372757 554 | 555 | 556 | 557 | -2147483392 558 | {{1, 325}, {306, 15}} 559 | 560 | 561 | _NS:60 562 | 1 563 | 564 | _doScroller: 565 | 0.99674267100977199 566 | 567 | 568 | 569 | 2304 570 | 571 | 572 | 573 | {{1, 0}, {251, 17}} 574 | 575 | 576 | _NS:15 577 | 578 | 579 | 4 580 | 581 | 582 | {{-1, 54}, {253, 294}} 583 | 584 | 585 | _NS:9 586 | 133682 587 | 588 | 589 | 590 | 591 | QSAAAEEgAABBmAAAQZgAAA 592 | 593 | 594 | {251, 347} 595 | 596 | 597 | 598 | {{0, 0}, {1680, 1028}} 599 | {10000000000000, 10000000000000} 600 | YES 601 | 602 | 603 | PYNickAppDelegate 604 | 605 | 606 | NSFontManager 607 | 608 | 609 | 610 | fullName 611 | nickName 612 | 613 | Person 614 | YES 615 | 616 | YES 617 | YES 618 | YES 619 | YES 620 | YES 621 | 622 | 623 | 624 | 625 | 626 | 627 | terminate: 628 | 629 | 630 | 631 | 449 632 | 633 | 634 | 635 | orderFrontStandardAboutPanel: 636 | 637 | 638 | 639 | 142 640 | 641 | 642 | 643 | delegate 644 | 645 | 646 | 647 | 495 648 | 649 | 650 | 651 | performMiniaturize: 652 | 653 | 654 | 655 | 37 656 | 657 | 658 | 659 | undo: 660 | 661 | 662 | 663 | 223 664 | 665 | 666 | 667 | copy: 668 | 669 | 670 | 671 | 224 672 | 673 | 674 | 675 | paste: 676 | 677 | 678 | 679 | 226 680 | 681 | 682 | 683 | cut: 684 | 685 | 686 | 687 | 228 688 | 689 | 690 | 691 | redo: 692 | 693 | 694 | 695 | 231 696 | 697 | 698 | 699 | performZoom: 700 | 701 | 702 | 703 | 240 704 | 705 | 706 | 707 | hide: 708 | 709 | 710 | 711 | 367 712 | 713 | 714 | 715 | hideOtherApplications: 716 | 717 | 718 | 719 | 368 720 | 721 | 722 | 723 | showHelp: 724 | 725 | 726 | 727 | 493 728 | 729 | 730 | 731 | unhideAllApplications: 732 | 733 | 734 | 735 | 370 736 | 737 | 738 | 739 | initialFirstResponder 740 | 741 | 742 | 743 | 846 744 | 745 | 746 | 747 | window 748 | 749 | 750 | 751 | 532 752 | 753 | 754 | 755 | saveModifiedContact: 756 | 757 | 758 | 759 | 822 760 | 761 | 762 | 763 | contactTableView 764 | 765 | 766 | 767 | 823 768 | 769 | 770 | 771 | saveModifiedContact: 772 | 773 | 774 | 775 | 859 776 | 777 | 778 | 779 | removeAllPinyinNickNames: 780 | 781 | 782 | 783 | 832 784 | 785 | 786 | 787 | dataSource 788 | 789 | 790 | 791 | 802 792 | 793 | 794 | 795 | delegate 796 | 797 | 798 | 799 | 818 800 | 801 | 802 | 803 | value: arrangedObjects.fullName 804 | 805 | 806 | 807 | 808 | 809 | value: arrangedObjects.fullName 810 | value 811 | arrangedObjects.fullName 812 | 813 | NSConditionallySetsEditable 814 | 815 | 816 | 2 817 | 818 | 819 | 837 820 | 821 | 822 | 823 | value: arrangedObjects.nickName 824 | 825 | 826 | 827 | 828 | 829 | value: arrangedObjects.nickName 830 | value 831 | arrangedObjects.nickName 832 | 2 833 | 834 | 835 | 839 836 | 837 | 838 | 839 | contentArray: self.people 840 | 841 | 842 | 843 | 844 | 845 | contentArray: self.people 846 | contentArray 847 | self.people 848 | 2 849 | 850 | 851 | 842 852 | 853 | 854 | 855 | 856 | 857 | 0 858 | 859 | 860 | 861 | 862 | 863 | -2 864 | 865 | 866 | File's Owner 867 | 868 | 869 | -1 870 | 871 | 872 | First Responder 873 | 874 | 875 | -3 876 | 877 | 878 | Application 879 | 880 | 881 | 29 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 19 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 56 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 217 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 205 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 207 931 | 932 | 933 | 934 | 935 | 199 936 | 937 | 938 | 939 | 940 | 203 941 | 942 | 943 | 944 | 945 | 197 946 | 947 | 948 | 949 | 950 | 206 951 | 952 | 953 | 954 | 955 | 215 956 | 957 | 958 | 959 | 960 | 57 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 58 979 | 980 | 981 | 982 | 983 | 134 984 | 985 | 986 | 987 | 988 | 136 989 | 990 | 991 | 992 | 993 | 144 994 | 995 | 996 | 997 | 998 | 129 999 | 1000 | 1001 | 1002 | 1003 | 143 1004 | 1005 | 1006 | 1007 | 1008 | 236 1009 | 1010 | 1011 | 1012 | 1013 | 131 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 149 1022 | 1023 | 1024 | 1025 | 1026 | 145 1027 | 1028 | 1029 | 1030 | 1031 | 130 1032 | 1033 | 1034 | 1035 | 1036 | 24 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 239 1046 | 1047 | 1048 | 1049 | 1050 | 23 1051 | 1052 | 1053 | 1054 | 1055 | 371 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 372 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 6 1071 | 0 1072 | 1073 | 6 1074 | 1 1075 | 1076 | -1 1077 | 1078 | 1000 1079 | 8 1080 | 29 1081 | 3 1082 | 1083 | 1084 | 1085 | 1086 | 9 1087 | 0 1088 | 1089 | 9 1090 | 1 1091 | 1092 | 0.0 1093 | 1094 | 1000 1095 | 6 1096 | 24 1097 | 2 1098 | 1099 | 1100 | 1101 | 1102 | 4 1103 | 0 1104 | 1105 | 4 1106 | 1 1107 | 1108 | 21 1109 | 1110 | 1000 1111 | 3 1112 | 9 1113 | 3 1114 | 1115 | 1116 | 1117 | 1118 | 4 1119 | 0 1120 | 1121 | 4 1122 | 1 1123 | 1124 | 54 1125 | 1126 | 1000 1127 | 3 1128 | 9 1129 | 3 1130 | 1131 | 1132 | 1133 | 1134 | 3 1135 | 0 1136 | 1137 | 3 1138 | 1 1139 | 1140 | -1 1141 | 1142 | 1000 1143 | 8 1144 | 29 1145 | 3 1146 | 1147 | 1148 | 1149 | 1150 | 5 1151 | 0 1152 | 1153 | 5 1154 | 1 1155 | 1156 | -1 1157 | 1158 | 1000 1159 | 8 1160 | 29 1161 | 3 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 420 1169 | 1170 | 1171 | 1172 | 1173 | 490 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 491 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 492 1190 | 1191 | 1192 | 1193 | 1194 | 494 1195 | 1196 | 1197 | 1198 | 1199 | 536 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 537 1208 | 1209 | 1210 | 1211 | 1212 | 775 1213 | 1214 | 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 1221 | 1222 | 1223 | 776 1224 | 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 777 1233 | 1234 | 1235 | 1236 | 1237 | 778 1238 | 1239 | 1240 | 1241 | 1242 | 779 1243 | 1244 | 1245 | 1246 | 1247 | 780 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | 1255 | 781 1256 | 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | 782 1264 | 1265 | 1266 | 1267 | 1268 | 783 1269 | 1270 | 1271 | 1272 | 1273 | 820 1274 | 1275 | 1276 | 1277 | 1278 | 792 1279 | 1280 | 1281 | 1282 | 1283 | 833 1284 | 1285 | 1286 | 1287 | 1288 | 843 1289 | 1290 | 1291 | 1292 | 1293 | 845 1294 | 1295 | 1296 | 1297 | 1298 | 856 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 857 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | 1313 | 1314 | 1315 | 858 1316 | 1317 | 1318 | 1319 | 1320 | 860 1321 | 1322 | 1323 | 1324 | 1325 | 861 1326 | 1327 | 1328 | 1329 | 1330 | 827 1331 | 1332 | 1333 | 1334 | 1335 | 150 1336 | 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | com.apple.InterfaceBuilder.CocoaPlugin 1343 | com.apple.InterfaceBuilder.CocoaPlugin 1344 | com.apple.InterfaceBuilder.CocoaPlugin 1345 | com.apple.InterfaceBuilder.CocoaPlugin 1346 | com.apple.InterfaceBuilder.CocoaPlugin 1347 | com.apple.InterfaceBuilder.CocoaPlugin 1348 | com.apple.InterfaceBuilder.CocoaPlugin 1349 | com.apple.InterfaceBuilder.CocoaPlugin 1350 | com.apple.InterfaceBuilder.CocoaPlugin 1351 | com.apple.InterfaceBuilder.CocoaPlugin 1352 | com.apple.InterfaceBuilder.CocoaPlugin 1353 | com.apple.InterfaceBuilder.CocoaPlugin 1354 | com.apple.InterfaceBuilder.CocoaPlugin 1355 | com.apple.InterfaceBuilder.CocoaPlugin 1356 | com.apple.InterfaceBuilder.CocoaPlugin 1357 | com.apple.InterfaceBuilder.CocoaPlugin 1358 | com.apple.InterfaceBuilder.CocoaPlugin 1359 | com.apple.InterfaceBuilder.CocoaPlugin 1360 | com.apple.InterfaceBuilder.CocoaPlugin 1361 | com.apple.InterfaceBuilder.CocoaPlugin 1362 | com.apple.InterfaceBuilder.CocoaPlugin 1363 | com.apple.InterfaceBuilder.CocoaPlugin 1364 | com.apple.InterfaceBuilder.CocoaPlugin 1365 | com.apple.InterfaceBuilder.CocoaPlugin 1366 | com.apple.InterfaceBuilder.CocoaPlugin 1367 | com.apple.InterfaceBuilder.CocoaPlugin 1368 | com.apple.InterfaceBuilder.CocoaPlugin 1369 | 1370 | 1371 | com.apple.InterfaceBuilder.CocoaPlugin 1372 | {{380, 496}, {480, 360}} 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | 1379 | 1380 | 1381 | 1382 | com.apple.InterfaceBuilder.CocoaPlugin 1383 | com.apple.InterfaceBuilder.CocoaPlugin 1384 | com.apple.InterfaceBuilder.CocoaPlugin 1385 | com.apple.InterfaceBuilder.CocoaPlugin 1386 | com.apple.InterfaceBuilder.CocoaPlugin 1387 | com.apple.InterfaceBuilder.CocoaPlugin 1388 | 1389 | com.apple.InterfaceBuilder.CocoaPlugin 1390 | com.apple.InterfaceBuilder.CocoaPlugin 1391 | com.apple.InterfaceBuilder.CocoaPlugin 1392 | com.apple.InterfaceBuilder.CocoaPlugin 1393 | com.apple.InterfaceBuilder.CocoaPlugin 1394 | 1395 | com.apple.InterfaceBuilder.CocoaPlugin 1396 | com.apple.InterfaceBuilder.CocoaPlugin 1397 | com.apple.InterfaceBuilder.CocoaPlugin 1398 | com.apple.InterfaceBuilder.CocoaPlugin 1399 | com.apple.InterfaceBuilder.CocoaPlugin 1400 | com.apple.InterfaceBuilder.CocoaPlugin 1401 | com.apple.InterfaceBuilder.CocoaPlugin 1402 | com.apple.InterfaceBuilder.CocoaPlugin 1403 | com.apple.InterfaceBuilder.CocoaPlugin 1404 | com.apple.InterfaceBuilder.CocoaPlugin 1405 | com.apple.InterfaceBuilder.CocoaPlugin 1406 | com.apple.InterfaceBuilder.CocoaPlugin 1407 | com.apple.InterfaceBuilder.CocoaPlugin 1408 | com.apple.InterfaceBuilder.CocoaPlugin 1409 | com.apple.InterfaceBuilder.CocoaPlugin 1410 | com.apple.InterfaceBuilder.CocoaPlugin 1411 | com.apple.InterfaceBuilder.CocoaPlugin 1412 | com.apple.InterfaceBuilder.CocoaPlugin 1413 | com.apple.InterfaceBuilder.CocoaPlugin 1414 | com.apple.InterfaceBuilder.CocoaPlugin 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 861 1421 | 1422 | 1423 | 0 1424 | IBCocoaFramework 1425 | 1426 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 1427 | 1428 | 1429 | YES 1430 | 3 1431 | 1432 | {11, 11} 1433 | {10, 3} 1434 | 1435 | YES 1436 | 1437 | 1438 | -------------------------------------------------------------------------------- /PinYinNick/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PinYinNick 4 | // 5 | // Created by 陈宇飞 on 12-4-29. 6 | // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | return NSApplicationMain(argc, (const char **)argv); 14 | } 15 | -------------------------------------------------------------------------------- /PinYinNick/zh-Hans.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470 2 | {\fonttbl\f0\fnil\fcharset134 STHeitiSC-Light;\f1\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc 6 | 7 | \f0\fs24 \cf0 \'d5\'e2\'b8\'f6\'bc\'f2\'b5\'a5\'b5\'c4\'b3\'cc\'d0\'f2\'d3\'c9 8 | \f1 9 | \f0 \'b3\'c2\'d3\'ee\'b7\'c9 10 | \f1 11 | \f0 \'b1\'e0\'d0\'b4 12 | \f1 \ 13 | \ 14 | 15 | \f0 \'ce\'d2\'b5\'c4 16 | \f1 Twitter @cyfdecyf} -------------------------------------------------------------------------------- /PinYinNick/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | CFBundleDisplayName = "拼音昵称"; 4 | /* CFBundleName will be displayed on the menu. */ 5 | CFBundleName = "拼音昵称"; 6 | 7 | NSHumanReadableCopyright = "版权 2012 © 陈宇飞 保留所有权利"; -------------------------------------------------------------------------------- /PinYinNick/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Created by Chen Yufei on 12-5-14. 3 | Copyright (c) 2012. All rights reserved. 4 | */ 5 | "REMOVE" = "删除"; 6 | "CANCEL" = "取消"; 7 | 8 | "REMOVE_ALERT_MSG" = "删除所有的拼音昵称"; 9 | "REMOVE_ALERT_INFO" = "所有姓名中含有汉字的联系人的昵称将会被删除!"; -------------------------------------------------------------------------------- /PinYinNick/zh-Hans.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 11E53 6 | 2182 7 | 1138.47 8 | 569.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2182 12 | 13 | 14 | NSScroller 15 | NSTableHeaderView 16 | NSMenuItem 17 | NSMenu 18 | NSScrollView 19 | NSButtonCell 20 | NSButton 21 | NSTextFieldCell 22 | NSArrayController 23 | NSTableView 24 | IBNSLayoutConstraint 25 | NSCustomObject 26 | NSView 27 | NSWindowTemplate 28 | NSTableColumn 29 | 30 | 31 | com.apple.InterfaceBuilder.CocoaPlugin 32 | 33 | 34 | PluginDependencyRecalculationVersion 35 | 36 | 37 | 38 | 39 | NSApplication 40 | 41 | 42 | FirstResponder 43 | 44 | 45 | NSApplication 46 | 47 | 48 | AMainMenu 49 | 50 | 51 | 52 | PinYinNick 53 | 54 | 1048576 55 | 2147483647 56 | 57 | NSImage 58 | NSMenuCheckmark 59 | 60 | 61 | NSImage 62 | NSMenuMixedState 63 | 64 | submenuAction: 65 | 66 | PinYinNick 67 | 68 | 69 | 70 | 关于 拼音昵称 71 | 72 | 2147483647 73 | 74 | 75 | 76 | 77 | 78 | YES 79 | YES 80 | 81 | 82 | 1048576 83 | 2147483647 84 | 85 | 86 | 87 | 88 | 89 | 偏好设置 90 | , 91 | 1048576 92 | 2147483647 93 | 94 | 95 | 96 | 97 | 98 | YES 99 | YES 100 | 101 | 102 | 1048576 103 | 2147483647 104 | 105 | 106 | 107 | 108 | 109 | 服务 110 | 111 | 1048576 112 | 2147483647 113 | 114 | 115 | submenuAction: 116 | 117 | 服务 118 | 119 | _NSServicesMenu 120 | 121 | 122 | 123 | 124 | YES 125 | YES 126 | 127 | 128 | 1048576 129 | 2147483647 130 | 131 | 132 | 133 | 134 | 135 | 隐藏 拼音昵称 136 | h 137 | 1048576 138 | 2147483647 139 | 140 | 141 | 142 | 143 | 144 | 隐藏其他 145 | h 146 | 1572864 147 | 2147483647 148 | 149 | 150 | 151 | 152 | 153 | 显示全部 154 | 155 | 1048576 156 | 2147483647 157 | 158 | 159 | 160 | 161 | 162 | YES 163 | YES 164 | 165 | 166 | 1048576 167 | 2147483647 168 | 169 | 170 | 171 | 172 | 173 | 退出 拼音昵称 174 | q 175 | 1048576 176 | 2147483647 177 | 178 | 179 | 180 | 181 | _NSAppleMenu 182 | 183 | 184 | 185 | 186 | 文件 187 | 188 | 2147483647 189 | 190 | 191 | submenuAction: 192 | 193 | 文件 194 | 195 | 196 | 197 | 保存修改过的昵称 198 | s 199 | 1048576 200 | 2147483647 201 | 202 | 203 | 204 | 205 | 206 | 移除所有拼音昵称 207 | 208 | 2147483647 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 编辑 218 | 219 | 1048576 220 | 2147483647 221 | 222 | 223 | submenuAction: 224 | 225 | 编辑 226 | 227 | 228 | 229 | 撤销 230 | z 231 | 1048576 232 | 2147483647 233 | 234 | 235 | 236 | 237 | 238 | 重做 239 | Z 240 | 1179648 241 | 2147483647 242 | 243 | 244 | 245 | 246 | 247 | YES 248 | YES 249 | 250 | 251 | 1048576 252 | 2147483647 253 | 254 | 255 | 256 | 257 | 258 | 剪切 259 | x 260 | 1048576 261 | 2147483647 262 | 263 | 264 | 265 | 266 | 267 | 拷贝 268 | c 269 | 1048576 270 | 2147483647 271 | 272 | 273 | 274 | 275 | 276 | 粘贴 277 | v 278 | 1048576 279 | 2147483647 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 窗口 289 | 290 | 1048576 291 | 2147483647 292 | 293 | 294 | submenuAction: 295 | 296 | 窗口 297 | 298 | 299 | 300 | 最小化 301 | m 302 | 1048576 303 | 2147483647 304 | 305 | 306 | 307 | 308 | 309 | 缩放窗口 310 | 311 | 1048576 312 | 2147483647 313 | 314 | 315 | 316 | 317 | _NSWindowsMenu 318 | 319 | 320 | 321 | 322 | 帮助 323 | 324 | 2147483647 325 | 326 | 327 | submenuAction: 328 | 329 | 帮助 330 | 331 | 332 | 333 | 拼音昵称 帮助 334 | ? 335 | 1048576 336 | 2147483647 337 | 338 | 339 | 340 | 341 | _NSHelpMenu 342 | 343 | 344 | 345 | _NSMainMenu 346 | 347 | 348 | 15 349 | 2 350 | {{335, 250}, {251, 347}} 351 | 1954021376 352 | 拼音昵称 353 | NSWindow 354 | 355 | 356 | 357 | 358 | 256 359 | 360 | 361 | 362 | 268 363 | {{54, 13}, {144, 32}} 364 | 365 | 366 | 367 | _NS:9 368 | YES 369 | 370 | 67239424 371 | 134217728 372 | 保存修改过的昵称 373 | 374 | STHeitiSC-Light 375 | 13 376 | 16 377 | 378 | _NS:9 379 | 380 | -2038284033 381 | 268435585 382 | 383 | s 384 | 200 385 | 25 386 | 387 | 388 | 389 | 390 | 268 391 | 392 | 393 | 394 | 2304 395 | 396 | 397 | 398 | 256 399 | {251, 276} 400 | 401 | 402 | 403 | _NS:13 404 | YES 405 | 406 | 407 | 256 408 | {251, 17} 409 | 410 | 411 | 412 | _NS:16 413 | 414 | 415 | 416 | 417 | -2147483392 418 | {{224, 0}, {16, 17}} 419 | 420 | _NS:19 421 | 422 | 423 | 424 | fullName 425 | 150 426 | 40 427 | 1000 428 | 429 | 75628096 430 | 134219776 431 | 姓名 432 | 433 | LucidaGrande 434 | 13 435 | 1044 436 | 437 | 438 | 3 439 | MC4zMzMzMzI5ODU2AA 440 | 441 | 442 | 6 443 | System 444 | headerTextColor 445 | 446 | 3 447 | MAA 448 | 449 | 450 | 451 | 452 | 337772096 453 | 2048 454 | Full name 455 | 456 | 457 | 458 | 6 459 | System 460 | controlBackgroundColor 461 | 462 | 3 463 | MC42NjY2NjY2NjY3AA 464 | 465 | 466 | 467 | 6 468 | System 469 | controlTextColor 470 | 471 | 472 | 473 | 3 474 | YES 475 | 476 | 477 | fullNamePinyin 478 | YES 479 | caseInsensitiveCompare: 480 | 481 | 482 | 483 | nickName 484 | 95 485 | 40 486 | 1000 487 | 488 | 75628096 489 | 134219776 490 | 昵称 491 | 492 | 493 | 494 | 495 | 496 | 337772096 497 | 2048 498 | Text Cell 499 | 500 | 501 | 502 | 503 | 504 | 3 505 | YES 506 | YES 507 | 508 | 509 | nickName 510 | YES 511 | caseInsensitiveCompare: 512 | 513 | 514 | 515 | 3 516 | 2 517 | 518 | 3 519 | MQA 520 | 521 | 522 | 6 523 | System 524 | gridColor 525 | 526 | 3 527 | MC41AA 528 | 529 | 530 | 17 531 | 1925185536 532 | 533 | 534 | 1 535 | 536 | 537 | 538 | 539 | 5 540 | 15 541 | 0 542 | YES 543 | 0 544 | 1 545 | 546 | 547 | {{1, 17}, {251, 276}} 548 | 549 | 550 | 551 | _NS:11 552 | 553 | 554 | 4 555 | 556 | 557 | 558 | -2147483392 559 | {{224, 17}, {15, 102}} 560 | 561 | 562 | 563 | _NS:58 564 | 565 | _doScroller: 566 | 37 567 | 0.1947367936372757 568 | 569 | 570 | 571 | -2147483392 572 | {{1, 325}, {306, 15}} 573 | 574 | 575 | 576 | _NS:60 577 | 1 578 | 579 | _doScroller: 580 | 0.99674267100977199 581 | 582 | 583 | 584 | 2304 585 | 586 | 587 | 588 | {{1, 0}, {251, 17}} 589 | 590 | 591 | 592 | _NS:15 593 | 594 | 595 | 4 596 | 597 | 598 | {{-1, 54}, {253, 294}} 599 | 600 | 601 | 602 | _NS:9 603 | 133682 604 | 605 | 606 | 607 | 608 | QSAAAEEgAABBmAAAQZgAAA 609 | 610 | 611 | {251, 347} 612 | 613 | 614 | 615 | 616 | {{0, 0}, {1680, 1028}} 617 | {10000000000000, 10000000000000} 618 | YES 619 | 620 | 621 | PYNickAppDelegate 622 | 623 | 624 | NSFontManager 625 | 626 | 627 | 628 | fullName 629 | nickName 630 | 631 | Person 632 | YES 633 | 634 | YES 635 | YES 636 | YES 637 | YES 638 | YES 639 | 640 | 641 | 642 | 643 | 644 | 645 | terminate: 646 | 647 | 648 | 649 | 449 650 | 651 | 652 | 653 | orderFrontStandardAboutPanel: 654 | 655 | 656 | 657 | 142 658 | 659 | 660 | 661 | delegate 662 | 663 | 664 | 665 | 495 666 | 667 | 668 | 669 | performMiniaturize: 670 | 671 | 672 | 673 | 37 674 | 675 | 676 | 677 | undo: 678 | 679 | 680 | 681 | 223 682 | 683 | 684 | 685 | copy: 686 | 687 | 688 | 689 | 224 690 | 691 | 692 | 693 | paste: 694 | 695 | 696 | 697 | 226 698 | 699 | 700 | 701 | cut: 702 | 703 | 704 | 705 | 228 706 | 707 | 708 | 709 | redo: 710 | 711 | 712 | 713 | 231 714 | 715 | 716 | 717 | performZoom: 718 | 719 | 720 | 721 | 240 722 | 723 | 724 | 725 | hide: 726 | 727 | 728 | 729 | 367 730 | 731 | 732 | 733 | hideOtherApplications: 734 | 735 | 736 | 737 | 368 738 | 739 | 740 | 741 | showHelp: 742 | 743 | 744 | 745 | 493 746 | 747 | 748 | 749 | unhideAllApplications: 750 | 751 | 752 | 753 | 370 754 | 755 | 756 | 757 | initialFirstResponder 758 | 759 | 760 | 761 | 846 762 | 763 | 764 | 765 | window 766 | 767 | 768 | 769 | 532 770 | 771 | 772 | 773 | saveModifiedContact: 774 | 775 | 776 | 777 | 822 778 | 779 | 780 | 781 | contactTableView 782 | 783 | 784 | 785 | 823 786 | 787 | 788 | 789 | saveModifiedContact: 790 | 791 | 792 | 793 | 859 794 | 795 | 796 | 797 | removeAllPinyinNickNames: 798 | 799 | 800 | 801 | 832 802 | 803 | 804 | 805 | dataSource 806 | 807 | 808 | 809 | 802 810 | 811 | 812 | 813 | delegate 814 | 815 | 816 | 817 | 818 818 | 819 | 820 | 821 | value: arrangedObjects.fullName 822 | 823 | 824 | 825 | 826 | 827 | value: arrangedObjects.fullName 828 | value 829 | arrangedObjects.fullName 830 | 831 | NSConditionallySetsEditable 832 | 833 | 834 | 2 835 | 836 | 837 | 837 838 | 839 | 840 | 841 | value: arrangedObjects.nickName 842 | 843 | 844 | 845 | 846 | 847 | value: arrangedObjects.nickName 848 | value 849 | arrangedObjects.nickName 850 | 2 851 | 852 | 853 | 839 854 | 855 | 856 | 857 | contentArray: self.people 858 | 859 | 860 | 861 | 862 | 863 | contentArray: self.people 864 | contentArray 865 | self.people 866 | 2 867 | 868 | 869 | 842 870 | 871 | 872 | 873 | 874 | 875 | 0 876 | 877 | 878 | 879 | 880 | 881 | -2 882 | 883 | 884 | File's Owner 885 | 886 | 887 | -1 888 | 889 | 890 | First Responder 891 | 892 | 893 | -3 894 | 895 | 896 | Application 897 | 898 | 899 | 29 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 19 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 56 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 217 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 205 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 207 949 | 950 | 951 | 952 | 953 | 199 954 | 955 | 956 | 957 | 958 | 203 959 | 960 | 961 | 962 | 963 | 197 964 | 965 | 966 | 967 | 968 | 206 969 | 970 | 971 | 972 | 973 | 215 974 | 975 | 976 | 977 | 978 | 57 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 58 997 | 998 | 999 | 1000 | 1001 | 134 1002 | 1003 | 1004 | 1005 | 1006 | 136 1007 | 1008 | 1009 | 1010 | 1011 | 144 1012 | 1013 | 1014 | 1015 | 1016 | 129 1017 | 1018 | 1019 | 1020 | 1021 | 143 1022 | 1023 | 1024 | 1025 | 1026 | 236 1027 | 1028 | 1029 | 1030 | 1031 | 131 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 149 1040 | 1041 | 1042 | 1043 | 1044 | 145 1045 | 1046 | 1047 | 1048 | 1049 | 130 1050 | 1051 | 1052 | 1053 | 1054 | 24 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 239 1064 | 1065 | 1066 | 1067 | 1068 | 23 1069 | 1070 | 1071 | 1072 | 1073 | 371 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 372 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 6 1089 | 0 1090 | 1091 | 6 1092 | 1 1093 | 1094 | -1 1095 | 1096 | 1000 1097 | 8 1098 | 29 1099 | 3 1100 | 1101 | 1102 | 1103 | 1104 | 9 1105 | 0 1106 | 1107 | 9 1108 | 1 1109 | 1110 | 0.0 1111 | 1112 | 1000 1113 | 6 1114 | 24 1115 | 2 1116 | 1117 | 1118 | 1119 | 1120 | 4 1121 | 0 1122 | 1123 | 4 1124 | 1 1125 | 1126 | 21 1127 | 1128 | 1000 1129 | 3 1130 | 9 1131 | 3 1132 | 1133 | 1134 | 1135 | 1136 | 4 1137 | 0 1138 | 1139 | 4 1140 | 1 1141 | 1142 | 54 1143 | 1144 | 1000 1145 | 3 1146 | 9 1147 | 3 1148 | 1149 | 1150 | 1151 | 1152 | 3 1153 | 0 1154 | 1155 | 3 1156 | 1 1157 | 1158 | -1 1159 | 1160 | 1000 1161 | 8 1162 | 29 1163 | 3 1164 | 1165 | 1166 | 1167 | 1168 | 5 1169 | 0 1170 | 1171 | 5 1172 | 1 1173 | 1174 | -1 1175 | 1176 | 1000 1177 | 8 1178 | 29 1179 | 3 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 420 1187 | 1188 | 1189 | 1190 | 1191 | 490 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1198 | 1199 | 491 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 492 1208 | 1209 | 1210 | 1211 | 1212 | 494 1213 | 1214 | 1215 | 1216 | 1217 | 536 1218 | 1219 | 1220 | 1221 | 1222 | 1223 | 1224 | 1225 | 537 1226 | 1227 | 1228 | 1229 | 1230 | 775 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 1240 | 1241 | 776 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | 777 1251 | 1252 | 1253 | 1254 | 1255 | 778 1256 | 1257 | 1258 | 1259 | 1260 | 779 1261 | 1262 | 1263 | 1264 | 1265 | 780 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 781 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 782 1282 | 1283 | 1284 | 1285 | 1286 | 783 1287 | 1288 | 1289 | 1290 | 1291 | 820 1292 | 1293 | 1294 | 1295 | 1296 | 792 1297 | 1298 | 1299 | 1300 | 1301 | 833 1302 | 1303 | 1304 | 1305 | 1306 | 843 1307 | 1308 | 1309 | 1310 | 1311 | 845 1312 | 1313 | 1314 | 1315 | 1316 | 856 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 857 1325 | 1326 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 858 1334 | 1335 | 1336 | 1337 | 1338 | 860 1339 | 1340 | 1341 | 1342 | 1343 | 861 1344 | 1345 | 1346 | 1347 | 1348 | 827 1349 | 1350 | 1351 | 1352 | 1353 | 150 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | com.apple.InterfaceBuilder.CocoaPlugin 1361 | com.apple.InterfaceBuilder.CocoaPlugin 1362 | com.apple.InterfaceBuilder.CocoaPlugin 1363 | com.apple.InterfaceBuilder.CocoaPlugin 1364 | com.apple.InterfaceBuilder.CocoaPlugin 1365 | com.apple.InterfaceBuilder.CocoaPlugin 1366 | com.apple.InterfaceBuilder.CocoaPlugin 1367 | com.apple.InterfaceBuilder.CocoaPlugin 1368 | com.apple.InterfaceBuilder.CocoaPlugin 1369 | com.apple.InterfaceBuilder.CocoaPlugin 1370 | com.apple.InterfaceBuilder.CocoaPlugin 1371 | com.apple.InterfaceBuilder.CocoaPlugin 1372 | com.apple.InterfaceBuilder.CocoaPlugin 1373 | com.apple.InterfaceBuilder.CocoaPlugin 1374 | com.apple.InterfaceBuilder.CocoaPlugin 1375 | com.apple.InterfaceBuilder.CocoaPlugin 1376 | com.apple.InterfaceBuilder.CocoaPlugin 1377 | com.apple.InterfaceBuilder.CocoaPlugin 1378 | com.apple.InterfaceBuilder.CocoaPlugin 1379 | com.apple.InterfaceBuilder.CocoaPlugin 1380 | com.apple.InterfaceBuilder.CocoaPlugin 1381 | com.apple.InterfaceBuilder.CocoaPlugin 1382 | com.apple.InterfaceBuilder.CocoaPlugin 1383 | com.apple.InterfaceBuilder.CocoaPlugin 1384 | com.apple.InterfaceBuilder.CocoaPlugin 1385 | com.apple.InterfaceBuilder.CocoaPlugin 1386 | com.apple.InterfaceBuilder.CocoaPlugin 1387 | 1388 | 1389 | com.apple.InterfaceBuilder.CocoaPlugin 1390 | {{380, 496}, {480, 360}} 1391 | 1392 | 1393 | 1394 | 1395 | 1396 | 1397 | 1398 | 1399 | 1400 | com.apple.InterfaceBuilder.CocoaPlugin 1401 | com.apple.InterfaceBuilder.CocoaPlugin 1402 | com.apple.InterfaceBuilder.CocoaPlugin 1403 | com.apple.InterfaceBuilder.CocoaPlugin 1404 | com.apple.InterfaceBuilder.CocoaPlugin 1405 | com.apple.InterfaceBuilder.CocoaPlugin 1406 | 1407 | com.apple.InterfaceBuilder.CocoaPlugin 1408 | com.apple.InterfaceBuilder.CocoaPlugin 1409 | com.apple.InterfaceBuilder.CocoaPlugin 1410 | com.apple.InterfaceBuilder.CocoaPlugin 1411 | com.apple.InterfaceBuilder.CocoaPlugin 1412 | 1413 | com.apple.InterfaceBuilder.CocoaPlugin 1414 | com.apple.InterfaceBuilder.CocoaPlugin 1415 | com.apple.InterfaceBuilder.CocoaPlugin 1416 | com.apple.InterfaceBuilder.CocoaPlugin 1417 | com.apple.InterfaceBuilder.CocoaPlugin 1418 | com.apple.InterfaceBuilder.CocoaPlugin 1419 | com.apple.InterfaceBuilder.CocoaPlugin 1420 | com.apple.InterfaceBuilder.CocoaPlugin 1421 | com.apple.InterfaceBuilder.CocoaPlugin 1422 | com.apple.InterfaceBuilder.CocoaPlugin 1423 | com.apple.InterfaceBuilder.CocoaPlugin 1424 | com.apple.InterfaceBuilder.CocoaPlugin 1425 | com.apple.InterfaceBuilder.CocoaPlugin 1426 | com.apple.InterfaceBuilder.CocoaPlugin 1427 | com.apple.InterfaceBuilder.CocoaPlugin 1428 | com.apple.InterfaceBuilder.CocoaPlugin 1429 | com.apple.InterfaceBuilder.CocoaPlugin 1430 | com.apple.InterfaceBuilder.CocoaPlugin 1431 | com.apple.InterfaceBuilder.CocoaPlugin 1432 | com.apple.InterfaceBuilder.CocoaPlugin 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 861 1439 | 1440 | 1441 | 1442 | 1443 | NSLayoutConstraint 1444 | NSObject 1445 | 1446 | IBProjectSource 1447 | ./Classes/NSLayoutConstraint.h 1448 | 1449 | 1450 | 1451 | PYNickAppDelegate 1452 | NSObject 1453 | 1454 | id 1455 | id 1456 | 1457 | 1458 | 1459 | removeAllPinyinNickNames: 1460 | id 1461 | 1462 | 1463 | saveModifiedContact: 1464 | id 1465 | 1466 | 1467 | 1468 | NSTableView 1469 | NSWindow 1470 | 1471 | 1472 | 1473 | contactTableView 1474 | NSTableView 1475 | 1476 | 1477 | window 1478 | NSWindow 1479 | 1480 | 1481 | 1482 | IBProjectSource 1483 | ./Classes/PYNickAppDelegate.h 1484 | 1485 | 1486 | 1487 | 1488 | 0 1489 | IBCocoaFramework 1490 | 1491 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 1492 | 1493 | 1494 | YES 1495 | 3 1496 | 1497 | {11, 11} 1498 | {10, 3} 1499 | 1500 | YES 1501 | 1502 | 1503 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 用途 2 | ==== 3 | 4 | PinYinNick 给 Mac 上的联系人添加拼音缩写作为昵称。 5 | 6 | 添加后在 Contacts.app (原 Address Book.app), Mail.app 等程序中可使用拼音缩写来搜索联系人。iCloud 同步后,也可用缩写在 iOS 上搜索联系人,效果如下图: 7 | 8 | PYNickInContacts 9 | 10 | 使用说明 11 | ======= 12 | 13 | **注意:系统要求至少为 Lion。PinYinNick 在 Lion 和 Mountain Lion 上测试过。** 14 | 15 | 这是个非常简单的程序。界面如下: 16 | 17 | PinYinNickScreenShot 19 | 20 | 蓝色联系人表示添加了昵称,点击保存按钮时会把修改保存到系统联系人信息中。 21 | 22 | 下列联系人不会改动其昵称: 23 | 24 | - 原先已有昵称 25 | - 名字中不含中文 26 | 27 | 点击昵称可进行修改,点击列表标题栏可排序。 28 | 29 | 文件菜单提供了删除所有中文联系人昵称的功能。 30 | 31 | 没有对多音字进行特别处理,因此一些姓氏和名词会得到错误的缩写,例如姓氏“查”会得到 32 | "c",“银行”得到的是 "yx"。(暂时没有解决这个问题的打算。) 33 | 34 | 其他 35 | ==== 36 | 37 | - 拼音查询使用的是我自己写的库 [hanzi2pinyin](https://github.com/cyfdecyf/hanzi2pinyin) 38 | - 这个库只覆盖了 Unihan block1 中的汉字,日常使用应该足够 39 | - 图标下载自 [IconArchive](http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Mimetypes-x-office-address-book-icon.html),由 [Oxygen](http://www.oxygen-icons.org/) 设计 40 | - 如果觉得 iPhone 上拨打电话、发短信或邮件时搜索联系人不方便,推荐尝试 41 | [Dialvetica](http://itunes.apple.com/us/app/dialvetica-contacts/id404074258?mt=8),添加拼音昵称之后用起来会很方便 42 | --------------------------------------------------------------------------------