!15 1.4.5 // Customizable User Data Path, etc.
Merge pull request !15 from ShikiSuen/upd/1.4.5
This commit is contained in:
commit
75cc1a6dbb
|
@ -22,9 +22,14 @@ import Cocoa
|
|||
private let kTargetBin = "vChewing"
|
||||
private let kTargetType = "app"
|
||||
private let kTargetBundle = "vChewing.app"
|
||||
private let kDestinationPartial = "~/Library/Input Methods/"
|
||||
private let kTargetPartialPath = "~/Library/Input Methods/vChewing.app"
|
||||
private let kTargetFullBinPartialPath = "~/Library/Input Methods/vChewing.app/Contents/MacOS/vChewing"
|
||||
|
||||
private let urlDestinationPartial = FileManager.default.urls(for: .inputMethodsDirectory, in: .userDomainMask)[0]
|
||||
private let urlTargetPartial = urlDestinationPartial.appendingPathComponent(kTargetBundle)
|
||||
private let urlTargetFullBinPartial = urlTargetPartial.appendingPathComponent("Contents/MacOS/").appendingPathComponent(kTargetBin)
|
||||
|
||||
private let kDestinationPartial = urlDestinationPartial.path
|
||||
private let kTargetPartialPath = urlTargetPartial.path
|
||||
private let kTargetFullBinPartialPath = urlTargetFullBinPartial.path
|
||||
|
||||
private let kTranslocationRemovalTickInterval: TimeInterval = 0.5
|
||||
private let kTranslocationRemovalDeadline: TimeInterval = 60.0
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit fd7208e3ece1bf0ba6c128160dfdcac79e3451bd
|
||||
Subproject commit 8533cf091fc8307529fc07c042b3a591c3f8b79c
|
|
@ -149,9 +149,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
|||
// 拖 100ms 再重載,畢竟有些有特殊需求的使用者可能會想使用巨型自訂語彙檔案。
|
||||
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
|
||||
if mgrPrefs.shouldAutoReloadUserDataFiles {
|
||||
mgrLangModel.loadUserPhrases()
|
||||
mgrLangModel.loadUserPhraseReplacement()
|
||||
mgrLangModel.loadUserAssociatedPhrases()
|
||||
IME.initLangModels(userOnly: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -163,7 +161,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
|||
private var ctlAboutWindowInstance: ctlAboutWindow? // New About Window
|
||||
private var checkTask: URLSessionTask?
|
||||
private var updateNextStepURL: URL?
|
||||
private var fsStreamHelper = FSEventStreamHelper(path: mgrLangModel.dataFolderPath, queue: DispatchQueue(label: "vChewing User Phrases"))
|
||||
private var fsStreamHelper = FSEventStreamHelper(path: mgrLangModel.dataFolderPath(isDefaultFolder: false), queue: DispatchQueue(label: "vChewing User Phrases"))
|
||||
|
||||
// 補上 dealloc
|
||||
deinit {
|
||||
|
@ -176,10 +174,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
|||
}
|
||||
|
||||
func applicationDidFinishLaunching(_ notification: Notification) {
|
||||
mgrLangModel.loadDataModels() // 這句還是不要砍了。
|
||||
mgrLangModel.loadUserPhrases()
|
||||
mgrLangModel.loadUserPhraseReplacement()
|
||||
mgrLangModel.loadUserAssociatedPhrases()
|
||||
IME.initLangModels(userOnly: false)
|
||||
fsStreamHelper.delegate = self
|
||||
_ = fsStreamHelper.start()
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
*/
|
||||
|
||||
#include "LMConsolidator.h"
|
||||
#include "vChewing-Swift.h"
|
||||
|
||||
namespace vChewing {
|
||||
|
||||
|
@ -31,13 +32,13 @@ bool LMConsolidator::CheckPragma(const char *path)
|
|||
{
|
||||
string firstLine;
|
||||
getline(zfdCheckPragma, firstLine);
|
||||
syslog(LOG_CONS, "HEADER SEEN ||%s", firstLine.c_str());
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "HEADER SEEN ||%s", firstLine.c_str());
|
||||
if (firstLine != FORMATTED_PRAGMA_HEADER) {
|
||||
syslog(LOG_CONS, "HEADER VERIFICATION FAILED. START IN-PLACE CONSOLIDATING PROCESS.");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "HEADER VERIFICATION FAILED. START IN-PLACE CONSOLIDATING PROCESS.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
syslog(LOG_CONS, "HEADER VERIFICATION SUCCESSFUL.");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "HEADER VERIFICATION SUCCESSFUL.");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -49,22 +50,22 @@ bool LMConsolidator::FixEOF(const char *path)
|
|||
char z;
|
||||
zfdEOFFixerIncomingStream.get(z);
|
||||
if(z!='\n'){
|
||||
syslog(LOG_CONS, "// REPORT: Data File not ended with a new line.\n");
|
||||
syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
syslog(LOG_CONS, "// PROCEDURE: Trying to insert a new line as EOF before per-line check process.\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// REPORT: Data File not ended with a new line.\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// PROCEDURE: Trying to insert a new line as EOF before per-line check process.\n");
|
||||
std::ofstream zfdEOFFixerOutput(path, std::ios_base::app);
|
||||
zfdEOFFixerOutput << std::endl;
|
||||
zfdEOFFixerOutput.close();
|
||||
if (zfdEOFFixerOutput.fail()) {
|
||||
syslog(LOG_CONS, "// REPORT: Failed to append a newline to the data file. Insufficient Privileges?\n");
|
||||
syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// REPORT: Failed to append a newline to the data file. Insufficient Privileges?\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
zfdEOFFixerIncomingStream.close();
|
||||
if (zfdEOFFixerIncomingStream.fail()) {
|
||||
syslog(LOG_CONS, "// REPORT: Failed to read lines through the data file for EOF check. Insufficient Privileges?\n");
|
||||
syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// REPORT: Failed to read lines through the data file for EOF check. Insufficient Privileges?\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -118,14 +119,14 @@ bool LMConsolidator::ConsolidateContent(const char *path, bool shouldCheckPragma
|
|||
}
|
||||
zfdContentConsolidatorOutput.close();
|
||||
if (zfdContentConsolidatorOutput.fail()) {
|
||||
syslog(LOG_CONS, "// REPORT: Failed to write content-consolidated data to the file. Insufficient Privileges?\n");
|
||||
syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// REPORT: Failed to write content-consolidated data to the file. Insufficient Privileges?\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
return false;
|
||||
}
|
||||
zfdContentConsolidatorIncomingStream.close();
|
||||
if (zfdContentConsolidatorIncomingStream.fail()) {
|
||||
syslog(LOG_CONS, "// REPORT: Failed to read lines through the data file for content-consolidation. Insufficient Privileges?\n");
|
||||
syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// REPORT: Failed to read lines through the data file for content-consolidation. Insufficient Privileges?\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "// DATA FILE: %s", path);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -20,6 +20,8 @@ import Cocoa
|
|||
|
||||
@objc public class IME: NSObject {
|
||||
|
||||
static let dlgOpenPath = NSOpenPanel();
|
||||
|
||||
// MARK: - Functions
|
||||
|
||||
// Print debug information to the console.
|
||||
|
@ -29,6 +31,18 @@ import Cocoa
|
|||
}
|
||||
}
|
||||
|
||||
@objc static func initLangModels(userOnly: Bool) {
|
||||
if !userOnly {
|
||||
mgrLangModel.loadDataModels() // 這句還是不要砍了。
|
||||
}
|
||||
// mgrLangModel 的 loadUserPhrases 等函數在自動讀取 dataFolderPath 時,
|
||||
// 如果發現自訂目錄不可用,則會自動抹去自訂目錄設定、改採預設目錄。
|
||||
// 所以這裡不需要特別處理。
|
||||
mgrLangModel.loadUserPhrases()
|
||||
mgrLangModel.loadUserPhraseReplacement()
|
||||
mgrLangModel.loadUserAssociatedPhrases()
|
||||
}
|
||||
|
||||
@objc static func isDarkMode() -> Bool {
|
||||
if #available(macOS 10.15, *) {
|
||||
let appearanceDescription = NSApplication.shared.effectiveAppearance.debugDescription.lowercased()
|
||||
|
|
|
@ -284,7 +284,7 @@ class ctlInputMethod: IMKInputController {
|
|||
private func open(userFileAt path: String) {
|
||||
func checkIfUserFilesExist() -> Bool {
|
||||
if !mgrLangModel.checkIfUserLanguageModelFilesExist() {
|
||||
let content = String(format: NSLocalizedString("Please check the permission at \"%@\".", comment: ""), mgrLangModel.dataFolderPath)
|
||||
let content = String(format: NSLocalizedString("Please check the permission at \"%@\".", comment: ""), mgrLangModel.dataFolderPath(isDefaultFolder: false))
|
||||
ctlNonModalAlertWindow.shared.show(title: NSLocalizedString("Unable to create the user phrase file.", comment: ""), content: content, confirmButtonTitle: NSLocalizedString("OK", comment: ""), cancelButtonTitle: nil, cancelAsDefault: false, delegate: nil)
|
||||
NSApp.setActivationPolicy(.accessory)
|
||||
return false
|
||||
|
@ -306,7 +306,7 @@ class ctlInputMethod: IMKInputController {
|
|||
if !mgrLangModel.checkIfUserDataFolderExists() {
|
||||
return
|
||||
}
|
||||
NSWorkspace.shared.openFile(mgrLangModel.dataFolderPath, withApplication: "Finder")
|
||||
NSWorkspace.shared.openFile(mgrLangModel.dataFolderPath(isDefaultFolder: false), withApplication: "Finder")
|
||||
}
|
||||
|
||||
@objc func openExcludedPhrases(_ sender: Any?) {
|
||||
|
|
|
@ -20,6 +20,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
import Cocoa
|
||||
|
||||
private let kIsDebugModeEnabled = "_DebugMode"
|
||||
private let kUserDataFolderSpecified = "UserDataFolderSpecified"
|
||||
private let kCheckUpdateAutomatically = "CheckUpdateAutomatically"
|
||||
private let kKeyboardLayoutPreference = "KeyboardLayout"
|
||||
private let kBasisKeyboardLayoutPreference = "BasisKeyboardLayout"
|
||||
|
@ -183,6 +184,7 @@ struct ComposingBufferSize {
|
|||
@objc public class mgrPrefs: NSObject {
|
||||
static var allKeys:[String] {
|
||||
[kIsDebugModeEnabled,
|
||||
kUserDataFolderSpecified,
|
||||
kKeyboardLayoutPreference,
|
||||
kBasisKeyboardLayoutPreference,
|
||||
kShowPageButtonsInCandidateWindow,
|
||||
|
@ -316,6 +318,13 @@ struct ComposingBufferSize {
|
|||
@UserDefault(key: kIsDebugModeEnabled, defaultValue: false)
|
||||
@objc static var isDebugModeEnabled: Bool
|
||||
|
||||
@UserDefault(key: kUserDataFolderSpecified, defaultValue: "")
|
||||
@objc static var userDataFolderSpecified: String
|
||||
|
||||
@objc static func ifSpecifiedUserDataPathExistsInPlist() -> Bool {
|
||||
UserDefaults.standard.object(forKey: kUserDataFolderSpecified) != nil
|
||||
}
|
||||
|
||||
@UserDefault(key: kAppleLanguagesPreferences, defaultValue: [])
|
||||
@objc static var appleLanguages: Array<String>
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ bool AssociatedPhrases::open(const char *path)
|
|||
// 下面這一段或許可以做成開關、來詢問是否對使用者語彙採取寬鬆策略(哪怕有行內容寫錯也會放行)
|
||||
if (state == KeyValueBlobReader::State::ERROR) {
|
||||
// close();
|
||||
syslog(LOG_CONS, "AssociatedPhrases: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "AssociatedPhrases: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
// return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -24,6 +24,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
|
|||
#include <fstream>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include "vChewing-Swift.h"
|
||||
|
||||
using namespace Gramambular;
|
||||
|
||||
|
@ -123,7 +124,7 @@ start:
|
|||
c = *head;
|
||||
// \s -> error
|
||||
if (c == ' ') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // Start: \\s -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // Start: \\s -> error");
|
||||
goto error;
|
||||
}
|
||||
// \n -> start
|
||||
|
@ -140,14 +141,14 @@ start:
|
|||
state1:
|
||||
// EOF -> error
|
||||
if (head == end) {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 1: EOF -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 1: EOF -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
c = *head;
|
||||
// \n -> error
|
||||
if (c == '\n') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 1: \\n -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 1: \\n -> error");
|
||||
goto error;
|
||||
}
|
||||
// \s -> state2 + zero out ending + record column start
|
||||
|
@ -165,14 +166,14 @@ state1:
|
|||
state2:
|
||||
// eof -> error
|
||||
if (head == end) {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 2: EOF -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 2: EOF -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
c = *head;
|
||||
// \n, \s -> error
|
||||
if (c == '\n' || c == ' ') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 2: \\n \\s -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 2: \\n \\s -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -184,7 +185,7 @@ state2:
|
|||
state3:
|
||||
// eof -> error
|
||||
if (head == end) {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 3: EOF -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 3: EOF -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -192,7 +193,7 @@ state3:
|
|||
|
||||
// \n -> error
|
||||
if (c == '\n') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 3: \\n -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 3: \\n -> error");
|
||||
goto error;
|
||||
}
|
||||
// \s -> state4 + zero out ending + record column start
|
||||
|
@ -210,14 +211,14 @@ state3:
|
|||
state4:
|
||||
// eof -> error
|
||||
if (head == end) {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 4: EOF -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 4: EOF -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
c = *head;
|
||||
// \n, \s -> error
|
||||
if (c == '\n' || c == ' ') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 4: \\n \\s -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 4: \\n \\s -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -230,14 +231,14 @@ state4:
|
|||
state5:
|
||||
// eof -> error
|
||||
if (head == end) {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 5: EOF -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 5: EOF -> error");
|
||||
goto error;
|
||||
}
|
||||
|
||||
c = *head;
|
||||
// \s -> error
|
||||
if (c == ' ') {
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // state 5: \\s -> error");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // state 5: \\s -> error");
|
||||
goto error;
|
||||
}
|
||||
// \n -> start
|
||||
|
@ -264,7 +265,7 @@ end:
|
|||
emptyRow.value = space;
|
||||
emptyRow.logProbability = zero;
|
||||
keyRowMap[space].push_back(emptyRow);
|
||||
syslog(LOG_CONS, "vChewingDebug: CoreLM // File Load Complete.");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "vChewingDebug: CoreLM // File Load Complete.");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ bool PhraseReplacementMap::open(const char *path)
|
|||
// 下面這一段或許可以做成開關、來詢問是否對使用者語彙採取寬鬆策略(哪怕有行內容寫錯也會放行)
|
||||
if (state == KeyValueBlobReader::State::ERROR) {
|
||||
// close();
|
||||
syslog(LOG_CONS, "PhraseReplacementMap: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "PhraseReplacementMap: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
// return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -94,7 +94,7 @@ bool UserPhrasesLM::open(const char *path)
|
|||
// 下面這一段或許可以做成開關、來詢問是否對使用者語彙採取寬鬆策略(哪怕有行內容寫錯也會放行)
|
||||
if (state == KeyValueBlobReader::State::ERROR) {
|
||||
// close();
|
||||
syslog(LOG_CONS, "UserPhrasesLM: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
if (mgrPrefs.isDebugModeEnabled) syslog(LOG_CONS, "UserPhrasesLM: Failed at Open Step 5. On Error Resume Next.\n");
|
||||
// return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -30,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
+ (void)loadUserPhraseReplacement;
|
||||
+ (BOOL)checkIfUserLanguageModelFilesExist;
|
||||
+ (BOOL)checkIfUserDataFolderExists;
|
||||
+ (BOOL)checkIfSpecifiedUserDataFolderValid:(NSString *)folderPath;
|
||||
+ (NSString *)dataFolderPath:(bool)isDefaultFolder NS_SWIFT_NAME(dataFolderPath(isDefaultFolder:));
|
||||
|
||||
+ (BOOL)checkIfUserPhraseExist:(NSString *)userPhrase inputMode:(InputMode)mode key:(NSString *)key NS_SWIFT_NAME(checkIfUserPhraseExist(userPhrase:mode:key:));
|
||||
+ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode areWeDuplicating:(BOOL)areWeDuplicating areWeDeleting:(BOOL)areWeDeleting;
|
||||
|
@ -44,8 +46,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
+ (NSString *)excludedPhrasesDataPath:(InputMode)mode;
|
||||
+ (NSString *)phraseReplacementDataPath:(InputMode)mode;
|
||||
|
||||
@property (class, readonly, nonatomic) NSString *dataFolderPath;
|
||||
|
||||
@end
|
||||
|
||||
/// The following methods are merely for testing.
|
||||
|
|
|
@ -136,7 +136,7 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
|
|||
|
||||
+ (BOOL)checkIfUserDataFolderExists
|
||||
{
|
||||
NSString *folderPath = [self dataFolderPath];
|
||||
NSString *folderPath = [self dataFolderPath:false];
|
||||
BOOL isFolder = NO;
|
||||
BOOL folderExist = [[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:&isFolder];
|
||||
if (folderExist && !isFolder) {
|
||||
|
@ -159,6 +159,16 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
|
|||
return YES;
|
||||
}
|
||||
|
||||
+ (BOOL)checkIfSpecifiedUserDataFolderValid:(NSString *)folderPath
|
||||
{
|
||||
BOOL isFolder = NO;
|
||||
BOOL folderExist = [[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:&isFolder];
|
||||
if ((folderExist && !isFolder) || (!folderExist)) {
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
+ (BOOL)ensureFileExists:(NSString *)filePath populateWithTemplate:(NSString *)templateBasename extension:(NSString *)ext
|
||||
{
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
|
||||
|
@ -250,42 +260,52 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
|
|||
return YES;
|
||||
}
|
||||
|
||||
+ (NSString *)dataFolderPath
|
||||
+ (NSString *)dataFolderPath:(bool)isDefaultFolder
|
||||
{
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDirectory, YES);
|
||||
NSString *appSupportPath = paths[0];
|
||||
NSString *userDictPath = [appSupportPath stringByAppendingPathComponent:@"vChewing"];
|
||||
// 此處不能用「~」來取代當前使用者目錄名稱。不然的話,一旦輸入法被系統的沙箱干預的話,則反而會定位到沙箱目錄內。
|
||||
NSString *appSupportPath = [NSFileManager.defaultManager URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask][0].path;
|
||||
NSString *userDictPath = [appSupportPath stringByAppendingPathComponent:@"vChewing"].stringByExpandingTildeInPath;
|
||||
if (mgrPrefs.userDataFolderSpecified.stringByExpandingTildeInPath == userDictPath || isDefaultFolder) {
|
||||
return userDictPath;
|
||||
}
|
||||
if ([mgrPrefs ifSpecifiedUserDataPathExistsInPlist]) {
|
||||
if ([self checkIfSpecifiedUserDataFolderValid:mgrPrefs.userDataFolderSpecified.stringByExpandingTildeInPath]) {
|
||||
return mgrPrefs.userDataFolderSpecified.stringByExpandingTildeInPath;
|
||||
} else {
|
||||
[NSUserDefaults.standardUserDefaults removeObjectForKey:@"UserDataFolderSpecified"];
|
||||
}
|
||||
}
|
||||
return userDictPath;
|
||||
}
|
||||
|
||||
+ (NSString *)userPhrasesDataPath:(InputMode)mode;
|
||||
{
|
||||
NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"userdata-cht.txt" : @"userdata-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
return [[self dataFolderPath:false] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (NSString *)userSymbolDataPath:(InputMode)mode;
|
||||
{
|
||||
NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"usersymbolphrases-cht.txt" : @"usersymbolphrases-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
return [[self dataFolderPath:false] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (NSString *)userAssociatedPhrasesDataPath:(InputMode)mode;
|
||||
{
|
||||
NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"associatedPhrases-cht.txt" : @"associatedPhrases-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
return [[self dataFolderPath:false] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (NSString *)excludedPhrasesDataPath:(InputMode)mode;
|
||||
{
|
||||
NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"exclude-phrases-cht.txt" : @"exclude-phrases-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
return [[self dataFolderPath:false] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (NSString *)phraseReplacementDataPath:(InputMode)mode;
|
||||
{
|
||||
NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"phrases-replacement-cht.txt" : @"phrases-replacement-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
return [[self dataFolderPath:false] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (vChewing::LMInstantiator *)lmCHT
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
"Apple Zhuyin Bopomofo" = "Apple Zhuyin Bopomofo (Standard)";
|
||||
"Apple Zhuyin Eten" = "Apple Zhuyin Eten";
|
||||
"Symbol & Emoji Input" = "Symbol & Emoji Input";
|
||||
"Choose your desired user data folder." = "Choose your desired user data folder.";
|
||||
|
||||
// The followings are the category names used in the Symbol menu.
|
||||
"catCommonSymbols" = "CommonSymbols";
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
"Apple Zhuyin Eten" = "Apple Zhuyin Eten";
|
||||
"Symbol & Emoji Input" = "Symbol & Emoji Input";
|
||||
"Edit User Symbol & Emoji Data…" = "Edit User Symbol & Emoji Data…";
|
||||
"Choose your desired user data folder." = "Choose your desired user data folder.";
|
||||
|
||||
// The followings are the category names used in the Symbol menu.
|
||||
"catCommonSymbols" = "CommonSymbols";
|
||||
|
|
|
@ -48,10 +48,11 @@
|
|||
"zh-Hant" = "繁體中国語";
|
||||
"ja" = "和語";
|
||||
"Alphanumerical Input Mode" = "英数入力モード";
|
||||
"Apple Zhuyin Bopomofo" = "Apple 注音ボポモフォ配列(大千標準)";
|
||||
"Apple Zhuyin Eten" = "Apple 注音ボポモフォ配列(倚天伝統)";
|
||||
"Apple Zhuyin Bopomofo" = "Apple 注音ボポモフォ(大千標準)";
|
||||
"Apple Zhuyin Eten" = "Apple 注音ボポモフォ(倚天伝統)";
|
||||
"Symbol & Emoji Input" = "符号&絵文字入力";
|
||||
"Edit User Symbol & Emoji Data…" = "ユーザー符号&絵文字辞書を編集…";
|
||||
"Choose your desired user data folder." = "欲しがるユーザー辞書フォルダをお選びください。";
|
||||
|
||||
// The followings are the category names used in the Symbol menu.
|
||||
"catCommonSymbols" = "常用";
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
"Apple Zhuyin Eten" = "Apple 倚天注音键盘布局";
|
||||
"Symbol & Emoji Input" = "符号&绘文字输入";
|
||||
"Edit User Symbol & Emoji Data…" = "编辑自订符号&绘文字资料…";
|
||||
"Choose your desired user data folder." = "请选择您想指定的使用者语汇档案目录。";
|
||||
|
||||
// The followings are the category names used in the Symbol menu.
|
||||
"catCommonSymbols" = "常用";
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
"Apple Zhuyin Eten" = "Apple 倚天注音鍵盤佈局";
|
||||
"Symbol & Emoji Input" = "符號&繪文字輸入";
|
||||
"Edit User Symbol & Emoji Data…" = "編輯自訂符號&繪文字資料…";
|
||||
"Choose your desired user data folder." = "請選擇您想指定的使用者語彙檔案目錄。";
|
||||
|
||||
// The followings are the category names used in the Symbol menu.
|
||||
"catCommonSymbols" = "常用";
|
||||
|
|
|
@ -38,12 +38,15 @@ extension RangeReplaceableCollection where Element: Hashable {
|
|||
@IBOutlet weak var selectionKeyComboBox: NSComboBox!
|
||||
@IBOutlet weak var chkTrad2KangXi: NSButton!
|
||||
@IBOutlet weak var chkTrad2JISShinjitai: NSButton!
|
||||
@IBOutlet weak var lblCurrentlySpecifiedUserDataFolder: NSTextFieldCell!
|
||||
|
||||
var currentLanguageSelectItem: NSMenuItem? = nil
|
||||
|
||||
override func windowDidLoad() {
|
||||
super.windowDidLoad()
|
||||
|
||||
lblCurrentlySpecifiedUserDataFolder.placeholderString = mgrLangModel.dataFolderPath(isDefaultFolder: true)
|
||||
|
||||
let languages = ["auto", "en", "zh-Hans", "zh-Hant", "ja"]
|
||||
var autoMUISelectItem: NSMenuItem? = nil
|
||||
var chosenLanguageItem: NSMenuItem? = nil
|
||||
|
@ -234,4 +237,43 @@ extension RangeReplaceableCollection where Element: Hashable {
|
|||
}
|
||||
}
|
||||
|
||||
@IBAction func resetSpecifiedUserDataFolder(_ sender: Any) {
|
||||
UserDefaults.standard.removeObject(forKey: "UserDataFolderSpecified")
|
||||
IME.initLangModels(userOnly: true)
|
||||
}
|
||||
|
||||
@IBAction func chooseUserDataFolderToSpecify(_ sender: Any) {
|
||||
IME.dlgOpenPath.title = NSLocalizedString("Choose your desired user data folder.", comment: "");
|
||||
IME.dlgOpenPath.showsResizeIndicator = true;
|
||||
IME.dlgOpenPath.showsHiddenFiles = true;
|
||||
IME.dlgOpenPath.canChooseFiles = false;
|
||||
IME.dlgOpenPath.canChooseDirectories = true;
|
||||
|
||||
let PreviousFolderValidity = mgrLangModel.checkIfSpecifiedUserDataFolderValid(NSString(string: mgrPrefs.userDataFolderSpecified).expandingTildeInPath)
|
||||
|
||||
if self.window != nil {
|
||||
IME.dlgOpenPath.beginSheetModal(for: self.window!) { result in
|
||||
if result == NSApplication.ModalResponse.OK {
|
||||
if (IME.dlgOpenPath.url != nil) {
|
||||
if (mgrLangModel.checkIfSpecifiedUserDataFolderValid(IME.dlgOpenPath.url!.path)) {
|
||||
mgrPrefs.userDataFolderSpecified = IME.dlgOpenPath.url!.path
|
||||
IME.initLangModels(userOnly: true)
|
||||
} else {
|
||||
clsSFX.beep()
|
||||
if !PreviousFolderValidity {
|
||||
self.resetSpecifiedUserDataFolder(self)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if !PreviousFolderValidity {
|
||||
self.resetSpecifiedUserDataFolder(self)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
} // End If self.window != nil
|
||||
} // End IBAction
|
||||
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
<outlet property="chkTrad2JISShinjitai" destination="h4r-Sp-LBI" id="pk8-xi-IJi"/>
|
||||
<outlet property="chkTrad2KangXi" destination="5IL-zZ-CL9" id="PGS-Dy-BBY"/>
|
||||
<outlet property="fontSizePopUpButton" destination="90" id="108"/>
|
||||
<outlet property="lblCurrentlySpecifiedUserDataFolder" destination="REC-r4-T7m" id="eEq-XN-mMq"/>
|
||||
<outlet property="selectionKeyComboBox" destination="uHU-aL-du7" id="cEx-Ui-Phc"/>
|
||||
<outlet property="uiLanguageButton" destination="oS6-u5-7dP" id="V3u-XK-z7G"/>
|
||||
<outlet property="window" destination="1" id="30"/>
|
||||
|
@ -162,7 +163,7 @@
|
|||
</connections>
|
||||
</matrix>
|
||||
<button verticalHuggingPriority="750" id="233">
|
||||
<rect key="frame" x="169" y="25" width="245" height="17"/>
|
||||
<rect key="frame" x="169" y="25.5" width="245" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Show page buttons in candidate list" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="shc-Nu-UsM">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
|
@ -215,7 +216,7 @@
|
|||
</view>
|
||||
</box>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="Fc2-qh-r1H">
|
||||
<rect key="frame" x="26" y="13" width="204" height="16"/>
|
||||
<rect key="frame" x="26" y="12.5" width="204" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="o6K-VN-uxe"/>
|
||||
</constraints>
|
||||
|
@ -234,7 +235,7 @@
|
|||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Yaj-QY-7xV" userLabel="chkCNSSupport">
|
||||
<rect key="frame" x="19" y="105" width="406" height="16"/>
|
||||
<rect key="frame" x="19" y="104.5" width="406" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="KdE-Vd-Y50"/>
|
||||
</constraints>
|
||||
|
@ -248,7 +249,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5IL-zZ-CL9" userLabel="chkTrad2KangXi">
|
||||
<rect key="frame" x="19" y="83" width="406" height="16"/>
|
||||
<rect key="frame" x="19" y="83.5" width="406" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="Auto-convert traditional Chinese glyphs to KangXi characters" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="BSK-bH-Gct">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -259,7 +260,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h4r-Sp-LBI" userLabel="chkTrad2JISShinjitai">
|
||||
<rect key="frame" x="19" y="61" width="406" height="16"/>
|
||||
<rect key="frame" x="19" y="62.5" width="406" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="eia-1F-Do0">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -270,7 +271,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pYB-E5-4Nv">
|
||||
<rect key="frame" x="19" y="39" width="406" height="16"/>
|
||||
<rect key="frame" x="19" y="41.5" width="406" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="Stop farting (when typed phonetic combination is invalid, etc.)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="62u-jY-BRh">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -298,7 +299,7 @@
|
|||
</view>
|
||||
</box>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mwD-Yz-AU9">
|
||||
<rect key="frame" x="346" y="13" width="94" height="16"/>
|
||||
<rect key="frame" x="346" y="12.5" width="94" height="17"/>
|
||||
<buttonCell key="cell" type="check" title="Debug Mode" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="sZx-18-8dO">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -333,13 +334,13 @@
|
|||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<box title="Advanced Settings" translatesAutoresizingMaskIntoConstraints="NO" id="E1l-m8-xgb">
|
||||
<rect key="frame" x="6" y="8" width="451" height="411"/>
|
||||
<rect key="frame" x="6" y="10" width="451" height="409"/>
|
||||
<view key="contentView" id="Zaa-dP-WdF">
|
||||
<rect key="frame" x="3" y="3" width="445" height="393"/>
|
||||
<rect key="frame" x="3" y="3" width="445" height="391"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField autoresizesSubviews="NO" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IpX-f7-rTL">
|
||||
<rect key="frame" x="18" y="362" width="317" height="16"/>
|
||||
<rect key="frame" x="18" y="360" width="317" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="0OB-uY-HxG"/>
|
||||
</constraints>
|
||||
|
@ -350,7 +351,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uHU-aL-du7">
|
||||
<rect key="frame" x="128" y="331" width="150" height="25"/>
|
||||
<rect key="frame" x="128" y="329" width="150" height="25"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="147" id="WdR-Sg-xvh"/>
|
||||
</constraints>
|
||||
|
@ -369,7 +370,7 @@
|
|||
</connections>
|
||||
</comboBox>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ETa-09-qWI">
|
||||
<rect key="frame" x="31" y="336" width="91" height="15"/>
|
||||
<rect key="frame" x="31" y="334" width="91" height="15"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Selection Keys:" id="FnD-oH-El5">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -377,7 +378,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13">
|
||||
<rect key="frame" x="18" y="312" width="403" height="15"/>
|
||||
<rect key="frame" x="18" y="310" width="403" height="15"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the cursor position where you want to list possible candidates." id="14">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -385,7 +386,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<matrix verticalHuggingPriority="751" tag="1" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="15">
|
||||
<rect key="frame" x="33" y="266" width="402" height="38"/>
|
||||
<rect key="frame" x="33" y="264" width="402" height="38"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="cellSize" width="402" height="18"/>
|
||||
<size key="intercellSpacing" width="4" height="2"/>
|
||||
|
@ -410,7 +411,7 @@
|
|||
</connections>
|
||||
</matrix>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7z2-DD-c58">
|
||||
<rect key="frame" x="33" y="243" width="392" height="16"/>
|
||||
<rect key="frame" x="33" y="240.5" width="392" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="0iq-1M-a8l"/>
|
||||
</constraints>
|
||||
|
@ -423,7 +424,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n7q-ew-DYu">
|
||||
<rect key="frame" x="33" y="174" width="386" height="38"/>
|
||||
<rect key="frame" x="33" y="172" width="386" height="38"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="cellSize" width="386" height="18"/>
|
||||
<size key="intercellSpacing" width="4" height="2"/>
|
||||
|
@ -448,7 +449,7 @@
|
|||
</connections>
|
||||
</matrix>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMn-LX-3Ub">
|
||||
<rect key="frame" x="18" y="219" width="369" height="15"/>
|
||||
<rect key="frame" x="18" y="217" width="369" height="15"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Tab key in the candidate window." id="ueU-Rz-a1C">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -456,7 +457,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YkJ-lr-EP6">
|
||||
<rect key="frame" x="33" y="106" width="386" height="38"/>
|
||||
<rect key="frame" x="33" y="104" width="386" height="38"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="cellSize" width="386" height="18"/>
|
||||
<size key="intercellSpacing" width="4" height="2"/>
|
||||
|
@ -481,7 +482,7 @@
|
|||
</connections>
|
||||
</matrix>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J0f-Aw-dxC">
|
||||
<rect key="frame" x="18" y="151" width="383" height="15"/>
|
||||
<rect key="frame" x="18" y="149" width="383" height="15"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Space key in the candidate window." id="Pg5-G9-pY5">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -489,7 +490,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bE0-Lq-Pj7">
|
||||
<rect key="frame" x="19" y="59" width="266" height="16"/>
|
||||
<rect key="frame" x="19" y="57.5" width="266" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="pOO-rh-Jhh"/>
|
||||
</constraints>
|
||||
|
@ -502,7 +503,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="109">
|
||||
<rect key="frame" x="19" y="81" width="285" height="16"/>
|
||||
<rect key="frame" x="19" y="79.5" width="285" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="Enable Space key for calling candidate window" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="110">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -512,7 +513,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mzw-F2-aAQ">
|
||||
<rect key="frame" x="19" y="37" width="314" height="16"/>
|
||||
<rect key="frame" x="19" y="36.5" width="314" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="Emulating select-candidate-per-character mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="ArK-Vk-OoT">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
|
@ -575,20 +576,45 @@
|
|||
</tabViewItem>
|
||||
<tabViewItem label="Dictionary" identifier="" id="2iG-Ic-gbl" userLabel="Dictionary">
|
||||
<view key="view" id="DCm-Zy-lr2">
|
||||
<rect key="frame" x="10" y="33" width="463" height="418"/>
|
||||
<rect key="frame" x="10" y="33" width="463" height="424"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<box title="Dictionary and Language Models" translatesAutoresizingMaskIntoConstraints="NO" id="cf2-se-PDO" userLabel="Dictionary and Language Models">
|
||||
<rect key="frame" x="6" y="4" width="451" height="409"/>
|
||||
<rect key="frame" x="6" y="10" width="451" height="409"/>
|
||||
<view key="contentView" id="cy4-aV-hhk">
|
||||
<rect key="frame" x="3" y="3" width="445" height="391"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="p7V-IN-OTr">
|
||||
<rect key="frame" x="19" y="356" width="336" height="17"/>
|
||||
<textField autoresizesSubviews="NO" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FUV-qx-xkC">
|
||||
<rect key="frame" x="18" y="360" width="409" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="8eX-Tw-Erk"/>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="234" id="yhP-XF-CQj"/>
|
||||
<constraint firstAttribute="height" constant="16" id="al8-y9-Y36"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Choose your desired user data folder path. Will be omitted if invalid." id="wN3-k3-b2a">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s7t-Kk-EPu">
|
||||
<rect key="frame" x="20" y="327" width="346" height="20"/>
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" borderStyle="border" baseWritingDirection="leftToRight" alignment="left" drawsBackground="YES" usesSingleLineMode="YES" id="REC-r4-T7m">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="32" name="displayPatternValue1" keyPath="values.UserDataFolderSpecified" id="NCT-LY-hj0">
|
||||
<dictionary key="options">
|
||||
<string key="NSDisplayPattern">%{value1}@</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="p7V-IN-OTr">
|
||||
<rect key="frame" x="19" y="294.5" width="406" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="4e2-n5-KWF"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="check" title="Automatically reload user data files if changes detected" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="f8i-69-zxm">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
|
@ -599,10 +625,9 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O4B-Z2-XYi">
|
||||
<rect key="frame" x="19" y="334" width="406" height="17"/>
|
||||
<rect key="frame" x="19" y="271.5" width="406" height="17"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="234" id="b55-tE-4Xz"/>
|
||||
<constraint firstAttribute="height" constant="16" id="xK8-Au-QSC"/>
|
||||
<constraint firstAttribute="height" constant="16" id="45X-6Q-Dm8"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="check" title="Enable symbol input support (incl. certain emoji symbols)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="hSv-LJ-Cq3" userLabel="chkSymbolEnabled">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
|
@ -613,14 +638,53 @@
|
|||
<binding destination="32" name="value" keyPath="values.SymbolInputEnabled" id="XWG-G3-DRu"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MPN-np-SbT" userLabel="btnOpenFolderToSpecifyForUserData">
|
||||
<rect key="frame" x="366" y="326" width="30" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="19" id="BjU-G3-RBx"/>
|
||||
<constraint firstAttribute="width" constant="30" id="T0S-6A-QBe"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="smallSquare" title="…" bezelStyle="smallSquare" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5YP-ws-KLH">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<connections>
|
||||
<action selector="chooseUserDataFolderToSpecify:" target="-2" id="DYG-k1-z3R"/>
|
||||
</connections>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jXe-xz-9Sd" userLabel="btnOpenFolderToSpecifyForUserData">
|
||||
<rect key="frame" x="395" y="326" width="30" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="30" id="k59-3x-inJ"/>
|
||||
<constraint firstAttribute="height" constant="19" id="rUV-D4-dXJ"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="smallSquare" title="↻" bezelStyle="smallSquare" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="4Jw-5h-CdV">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="resetSpecifiedUserDataFolder:" target="-2" id="pqR-AG-4cm"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="p7V-IN-OTr" firstAttribute="top" secondItem="cy4-aV-hhk" secondAttribute="top" constant="18.5" id="GTZ-mq-8zK"/>
|
||||
<constraint firstItem="O4B-Z2-XYi" firstAttribute="top" secondItem="p7V-IN-OTr" secondAttribute="bottom" constant="6" id="Vhi-Ma-ErF"/>
|
||||
<constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="cy4-aV-hhk" secondAttribute="leading" constant="20" id="gvI-87-PEb"/>
|
||||
<constraint firstAttribute="trailing" secondItem="O4B-Z2-XYi" secondAttribute="trailing" constant="20" symbolic="YES" id="h9K-ln-6cI"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="p7V-IN-OTr" secondAttribute="trailing" constant="20" symbolic="YES" id="hSy-OW-G1A"/>
|
||||
<constraint firstItem="O4B-Z2-XYi" firstAttribute="leading" secondItem="p7V-IN-OTr" secondAttribute="leading" id="s7z-z0-Zhe"/>
|
||||
<constraint firstItem="s7t-Kk-EPu" firstAttribute="bottom" secondItem="MPN-np-SbT" secondAttribute="bottom" id="0Fo-ya-hQ9"/>
|
||||
<constraint firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="20" symbolic="YES" id="6QR-tj-5cH"/>
|
||||
<constraint firstItem="MPN-np-SbT" firstAttribute="leading" secondItem="p7V-IN-OTr" secondAttribute="leading" constant="346" id="7xl-xX-CEQ"/>
|
||||
<constraint firstItem="s7t-Kk-EPu" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-376" id="9at-E8-Bt1"/>
|
||||
<constraint firstItem="FUV-qx-xkC" firstAttribute="top" secondItem="cy4-aV-hhk" secondAttribute="top" constant="15" id="BZE-dD-V2R"/>
|
||||
<constraint firstItem="MPN-np-SbT" firstAttribute="top" secondItem="FUV-qx-xkC" secondAttribute="bottom" constant="14" id="Bp9-2u-f9E"/>
|
||||
<constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="cy4-aV-hhk" secondAttribute="leading" constant="20" symbolic="YES" id="Hy2-ZC-cvb"/>
|
||||
<constraint firstItem="s7t-Kk-EPu" firstAttribute="firstBaseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="OYH-gA-WcA"/>
|
||||
<constraint firstItem="p7V-IN-OTr" firstAttribute="top" secondItem="s7t-Kk-EPu" secondAttribute="bottom" constant="16" id="PBC-ZC-ahn"/>
|
||||
<constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="leading" constant="-346" id="Zet-wH-kmC"/>
|
||||
<constraint firstItem="O4B-Z2-XYi" firstAttribute="top" secondItem="p7V-IN-OTr" secondAttribute="bottom" constant="7" id="ZsG-Rv-Xjo"/>
|
||||
<constraint firstItem="p7V-IN-OTr" firstAttribute="trailing" secondItem="O4B-Z2-XYi" secondAttribute="trailing" id="auY-l9-U7h"/>
|
||||
<constraint firstItem="jXe-xz-9Sd" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-1" id="cYQ-Rx-tuG"/>
|
||||
<constraint firstItem="s7t-Kk-EPu" firstAttribute="trailing" secondItem="p7V-IN-OTr" secondAttribute="trailing" constant="-59" id="eIn-kD-FGz"/>
|
||||
<constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="mmu-SS-jac"/>
|
||||
<constraint firstItem="s7t-Kk-EPu" firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="-59" id="vIO-x1-7Q2"/>
|
||||
<constraint firstItem="jXe-xz-9Sd" firstAttribute="baseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="wys-ML-2Q2"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</box>
|
||||
|
@ -635,41 +699,35 @@
|
|||
</tabViewItem>
|
||||
<tabViewItem label="Keyboard" identifier="" id="1AW-xf-c2f">
|
||||
<view key="view" id="FxL-ZG-Eue">
|
||||
<rect key="frame" x="10" y="33" width="463" height="418"/>
|
||||
<rect key="frame" x="10" y="33" width="463" height="424"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<box title="Keyboard Layout" translatesAutoresizingMaskIntoConstraints="NO" id="Wvt-HE-LOv">
|
||||
<rect key="frame" x="6" y="4" width="451" height="409"/>
|
||||
<rect key="frame" x="6" y="10" width="451" height="409"/>
|
||||
<view key="contentView" id="mE9-SY-ijS">
|
||||
<rect key="frame" x="3" y="3" width="445" height="391"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="onD-QP-KPf">
|
||||
<rect key="frame" x="18" y="361" width="246" height="15"/>
|
||||
<rect key="frame" x="18" y="361" width="345" height="15"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="242" id="7Fg-39-CRo"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Choose your preferred keyboard layout." id="RQ6-MS-m4C">
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Choose your preferred keyboard layout and phonetic parser." id="RQ6-MS-m4C">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hab-1o-1kS">
|
||||
<rect key="frame" x="18" y="13" width="409" height="277"/>
|
||||
<rect key="frame" x="18" y="253" width="409" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="277" id="DuE-Bj-q43"/>
|
||||
<constraint firstAttribute="height" constant="37" id="DuE-Bj-q43"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" selectable="YES" id="wQ9-px-b07">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<string key="title">Regarding On-Screen Keyboard Viewer Support:
|
||||
|
||||
Since v1.3.2, vChewing supports on-screen keyboard by supporting "Apple Zhuyin Bopomofo" and "Apple Zhuyin Eten" alphanumeric layout. Theoreotically, these two dynamic layouts work with all types of Apple physical keyboards, and you can report failure cases through macOS Feedback Assistant app if macOS built-in Zhuyin / Eten-Zhuyin Input Method fails from working with your non-US keyboard.
|
||||
|
||||
HOWEVER, choosing such dynamic alphanumeric layouts REQUIRING THAT you have to choose the Bopomofo layout above to Standard (Microsoft / Dachen) since the Bopomofo / Eten layout support in this case is already finished by the macOS system.
|
||||
|
||||
Note that If you have chosen those "vChewing****" Alphanumerical layouts, then the Bopomofo layouts MUST MATCH the choices.</string>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<string key="title">Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.</string>
|
||||
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
|
@ -679,7 +737,7 @@
|
|||
<constraint firstAttribute="height" constant="17" id="3Lz-Gj-jiD"/>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="82" id="Vfj-gd-B0r"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bopomofo:" id="12">
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="BPMF Parser:" id="12">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -726,7 +784,7 @@
|
|||
</popUpButton>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="125">
|
||||
<rect key="frame" x="18" y="308" width="86" height="15"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Alphanumeric:" id="126">
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Basic Layout:" id="126">
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
/* Class = "NSMenuItem"; title = "Hanyu Pinyin"; ObjectID = "10"; */
|
||||
"10.title" = "Hanyu Pinyin";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Bopomofo:"; ObjectID = "12"; */
|
||||
"12.title" = "Bopomofo:";
|
||||
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
|
||||
"12.title" = "BPMF Parser:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
|
||||
"14.title" = "Choose the cursor position where you want to list possible candidates.";
|
||||
|
@ -86,8 +86,8 @@
|
|||
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
|
||||
"110.title" = "Enable Space key for calling candidate window";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Alphanumeric:"; ObjectID = "126"; */
|
||||
"126.title" = "Alphanumeric:";
|
||||
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
|
||||
"126.title" = "Basic Layout:";
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
|
||||
"128.title" = "OtherViews";
|
||||
|
@ -140,8 +140,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
|
||||
"QUQ-oY-4Hc.label" = "General";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "Choose your preferred keyboard layout.";
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "Choose your preferred keyboard layout and phonetic parser.";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Push the cursor to the front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
|
||||
"RUG-ls-KyA.title" = "Push the cursor to the front of the phrase after selection";
|
||||
|
@ -200,8 +200,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
|
||||
"2iG-Ic-gbl.label" = "Dictionary";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Regarding On-Screen Keyboard Support:"; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "Regarding On-Screen Keyboard Viewer Support:\n\n\tSince v1.3.2, vChewing supports on-screen keyboard by supporting \"Apple Zhuyin Bopomofo\" and \"Apple Zhuyin Eten\" alphanumeric layout. Theoreotically, these two dynamic layouts work with all types of Apple physical keyboards, and you can report failure cases through macOS Feedback Assistant app if macOS built-in Zhuyin / Eten-Zhuyin Input Method fails from working with your non-US keyboard. HOWEVER, choosing such dynamic alphanumeric layouts REQUIRING THAT you have to choose the Bopomofo layout above to Standard (Microsoft / Dachen) since the Bopomofo / Eten layout support in this case is already finished by the macOS system.\n\n\tAlso: If you have chosen those \"vChewing****\" Alphanumerical layouts, then the Bopomofo layouts MUST MATCH the choices.";
|
||||
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
|
||||
"ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window.";
|
||||
|
@ -223,3 +223,6 @@
|
|||
|
||||
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
|
||||
"hSv-LJ-Cq3.title" = "Enable symbol input support (incl. certain emoji symbols)";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
|
||||
"wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid.";
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"5.title" = "OtherViews";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
|
||||
"6.title" = "標準配列(Microsoft・大千・王安など)";
|
||||
"6.title" = "大千配列(Microsoft 標準・王安など)";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
|
||||
"7.title" = "倚天伝統配列";
|
||||
|
@ -18,13 +18,13 @@
|
|||
"8.title" = "許氏国音自然配列";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "ETen26"; ObjectID = "9"; */
|
||||
"9.title" = "倚天26キー配列";
|
||||
"9.title" = "倚天形忘れ配列 (26キー)";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hanyu Pinyin"; ObjectID = "10"; */
|
||||
"10.title" = "漢語弁音(ローマ字+数字音調)";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Bopomofo:"; ObjectID = "12"; */
|
||||
"12.title" = "注音キーボード配列:";
|
||||
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
|
||||
"12.title" = "注音配列:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
|
||||
"14.title" = "カーソルはどこで入力候補を呼び出すかとご選択ください:";
|
||||
|
@ -86,20 +86,20 @@
|
|||
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
|
||||
"110.title" = "Space キーで入力候補を呼び出す";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Alphanumeric:"; ObjectID = "126"; */
|
||||
"126.title" = "英数キーボード配列:";
|
||||
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
|
||||
"126.title" = "基礎キーボード:";
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
|
||||
"128.title" = "OtherViews";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "IBM"; ObjectID = "137"; */
|
||||
"137.title" = "IBM";
|
||||
"137.title" = "IBM 配列";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
|
||||
"7fV-x8-WHQ.title" = "神通";
|
||||
"7fV-x8-WHQ.title" = "神通配列";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
|
||||
"27F-8T-FkQ.title" = "偽精業";
|
||||
"27F-8T-FkQ.title" = "偽精業配列";
|
||||
|
||||
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
|
||||
"1AW-xf-c2f.label" = "キーボード";
|
||||
|
@ -140,8 +140,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
|
||||
"QUQ-oY-4Hc.label" = "全般";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "お好きなるキーボード配列をお選びください。";
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "お好きなるキーボードとそれに相応しい注音配列をお選びください。";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Push the cursor to the front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
|
||||
"RUG-ls-KyA.title" = "候補選択の直後、すぐカーソルを単語の向こうに推す";
|
||||
|
@ -156,7 +156,7 @@
|
|||
"W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-01-07)";
|
||||
|
||||
/* Class = "NSBox"; title = "Keyboard Layout"; ObjectID = "Wvt-HE-LOv"; */
|
||||
"Wvt-HE-LOv.title" = "キーボード配列";
|
||||
"Wvt-HE-LOv.title" = "キーボード";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Check for updates automatically"; ObjectID = "Z9t-P0-BLF"; */
|
||||
"Z9t-P0-BLF.title" = "アプリの更新通知を受く";
|
||||
|
@ -200,8 +200,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
|
||||
"2iG-Ic-gbl.label" = "辞書";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Regarding On-Screen Keyboard Support:"; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "macOS 内蔵のキーボードビューアについて:\n\n\t威注音は v1.3.2 版にて macOS 内蔵のキーボードビューアをサポートし始めたが、「Apple Zhuyin Bopomofo」と「Apple Zhuyin Eten」この2つダイナミック英数キーボード配列をサポートしたためである。基本的には、この機能は全ての言語の Apple キーボードと一緒に動けるはず。macOS 内蔵の注音入力と倚天注音入力が支障なく使える限り(支障があったら Feedback Assistant.app で Apple にご報告を)、この2つダイナミック英数キーボード配列も威注音で作動できるだと考えられる。だが、もし、ダイナミック英数キーボード配列を起用すると、今のこの画面の上の「注音キーボード配列」を標準配列にしなければならぬこと。なぜなら、この場合、倚天などの注音配列のサポート役割は macOS である。\n\n\t他に注意:英数配列を「vChewing○○○○」と名付けた配列に設定した場合、注音配列も必ず一致して下さい。";
|
||||
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の注音配列を大千と設定すべきである。";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
|
||||
"ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。";
|
||||
|
@ -223,3 +223,6 @@
|
|||
|
||||
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
|
||||
"hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
|
||||
"wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。";
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
/* Class = "NSMenuItem"; title = "Hanyu Pinyin"; ObjectID = "10"; */
|
||||
"10.title" = "汉语拼音二式(字母拼音+数字标调)";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Bopomofo:"; ObjectID = "12"; */
|
||||
"12.title" = "注音键盘布局:";
|
||||
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
|
||||
"12.title" = "基础键盘布局:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
|
||||
"14.title" = "用以触发选字的光标相对位置:";
|
||||
|
@ -86,7 +86,7 @@
|
|||
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
|
||||
"110.title" = "敲空格键以选字";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Alphanumeric:"; ObjectID = "126"; */
|
||||
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
|
||||
"126.title" = "英数键盘布局:";
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
|
||||
|
@ -140,8 +140,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
|
||||
"QUQ-oY-4Hc.label" = "一般";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "选择您所偏好的键盘布局。";
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "选择您所偏好的系统键盘布局与注音分析器配列。";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Push the cursor to the front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
|
||||
"RUG-ls-KyA.title" = "在选字后将光标置于该字词的前方";
|
||||
|
@ -200,8 +200,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
|
||||
"2iG-Ic-gbl.label" = "辞典";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Regarding On-Screen Keyboard Support:"; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "关于 macOS 内建萤幕模拟键盘支援:\n\n\t自 v1.3.2 版开始,威注音支援 macOS 内建的萤幕小键盘。该功能是借由对「Apple 标准注音键盘布局」与「Apple 倚天注音键盘布局」这两个动态英数键盘布局来完成的。理论上来讲,这两个动态英数键盘布局应该可以与所有语种的 Apple 物理键盘相容。如果有不相容的情况的话,macOS 内建的注音与倚天注音输入法一定也会有相同的故障(可以借由 Feedback Assistant.app 向 Apple 反馈这种键盘布局问题)。然而,如果您启用了这种动态英数键盘布局的话,请将当前画面顶端的注音键盘布局设为「微软/大千……」,因为对诸如倚天等异种键盘的支援已经交给 macOS 系统来事先完成了。\n\n\t另外:如果您在「英数键盘布局」内选了所有以「vChewing」开头的键盘配列的话,对应的「注音键盘布局」也要选成相同的配列才可以。比如说前者选「vChewing Dachen」那后者就得选「微软/大千……」、前者选「vChewing FakeSeigyou」那后者就得选「伪精业」,依此类推。";
|
||||
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器的注音配列得配置为大千配列。";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
|
||||
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。";
|
||||
|
@ -223,3 +223,6 @@
|
|||
|
||||
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
|
||||
"hSv-LJ-Cq3.title" = "启用包括少许绘文字在内的符号输入支援";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
|
||||
"wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
/* Class = "NSMenuItem"; title = "Hanyu Pinyin"; ObjectID = "10"; */
|
||||
"10.title" = "漢語拼音二式(字母拼音+數字標調)";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Bopomofo:"; ObjectID = "12"; */
|
||||
"12.title" = "注音鍵盤佈局:";
|
||||
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
|
||||
"12.title" = "注音配列:";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
|
||||
"14.title" = "用以觸發選字的游標相對位置:";
|
||||
|
@ -86,8 +86,8 @@
|
|||
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
|
||||
"110.title" = "敲空格鍵以選字";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Alphanumeric:"; ObjectID = "126"; */
|
||||
"126.title" = "英數鍵盤佈局:";
|
||||
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
|
||||
"126.title" = "基礎鍵盤佈局:";
|
||||
|
||||
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
|
||||
"128.title" = "OtherViews";
|
||||
|
@ -140,8 +140,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
|
||||
"QUQ-oY-4Hc.label" = "一般";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "選擇您所偏好的鍵盤佈局。";
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
|
||||
"RQ6-MS-m4C.title" = "選擇您所偏好的系統鍵盤佈局與注音分析器配列。";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Push the cursor to the front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
|
||||
"RUG-ls-KyA.title" = "在選字後將游標置於該字詞的前方";
|
||||
|
@ -200,8 +200,8 @@
|
|||
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
|
||||
"2iG-Ic-gbl.label" = "辭典";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Regarding On-Screen Keyboard Support:"; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "關於 macOS 內建螢幕模擬鍵盤支援:\n\n\t自 v1.3.2 版開始,威注音支援 macOS 內建的螢幕小鍵盤。該功能是藉由對「Apple 標準注音鍵盤佈局」與「Apple 倚天注音鍵盤佈局」這兩個動態英數鍵盤佈局來完成的。理論上來講,這兩個動態英數鍵盤佈局應該可以與所有語種的 Apple 物理鍵盤相容。如果有不相容的情況的話,macOS 內建的注音與倚天注音輸入法一定也會有相同的故障(可以藉由 Feedback Assistant.app 向 Apple 反饋這種鍵盤佈局問題)。然而,如果您啟用了這種動態英數鍵盤佈局的話,請將當前畫面頂端的注音鍵盤佈局設為「微軟/大千……」,因為對諸如倚天等異種鍵盤的支援已經交給 macOS 系統來事先完成了。\n\n\t另外:如果您在「英數鍵盤佈局」內選了所有以「vChewing」開頭的鍵盤配列的話,對應的「注音鍵盤佈局」也要選成相同的配列才可以。比如說前者選「vChewing Dachen」那後者就得選「微軟/大千……」、前者選「vChewing FakeSeigyou」那後者就得選「偽精業」,依此類推。";
|
||||
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
|
||||
"wQ9-px-b07.title" = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器的注音配列得配置為大千配列。";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
|
||||
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。";
|
||||
|
@ -224,3 +224,5 @@
|
|||
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
|
||||
"hSv-LJ-Cq3.title" = "啟用包括少許繪文字在內的符號輸入支援";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
|
||||
"wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
<key>UpdateInfoSite</key>
|
||||
<string>https://gitee.com/vChewing/vChewing-macOS/releases</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1944</string>
|
||||
<string>1945</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
@ -726,7 +726,7 @@
|
|||
<key>USE_HFS+_COMPRESSION</key>
|
||||
<false/>
|
||||
<key>VERSION</key>
|
||||
<string>1.4.4</string>
|
||||
<string>1.4.5</string>
|
||||
</dict>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
|
@ -941,11 +941,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Traditional Chinese</string>
|
||||
<string>Simplified Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>Installer/pkgTextWarning-CHT.txt</string>
|
||||
<string>Installer/pkgTextWarning-CHS.txt</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
|
@ -963,11 +963,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Simplified Chinese</string>
|
||||
<string>Traditional Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>Installer/pkgTextWarning-CHS.txt</string>
|
||||
<string>Installer/pkgTextWarning-CHT.txt</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
|
@ -991,11 +991,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Traditional Chinese</string>
|
||||
<string>Simplified Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>LICENSE-CHT.txt</string>
|
||||
<string>LICENSE-CHS.txt</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
|
@ -1013,11 +1013,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Simplified Chinese</string>
|
||||
<string>Traditional Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>LICENSE-CHS.txt</string>
|
||||
<string>LICENSE-CHT.txt</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
|
@ -1048,9 +1048,9 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Simplified Chinese</string>
|
||||
<string>Traditional Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<string>威注音输入法</string>
|
||||
<string>威注音輸入法</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
|
@ -1060,9 +1060,9 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Traditional Chinese</string>
|
||||
<string>Simplified Chinese</string>
|
||||
<key>VALUE</key>
|
||||
<string>威注音輸入法</string>
|
||||
<string>威注音输入法</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
|
@ -1099,11 +1099,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Simplified Chinese</string>
|
||||
<string>Traditional Chinese</string>
|
||||
<key>SECONDARY_VALUE</key>
|
||||
<string>至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。</string>
|
||||
<string>至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。</string>
|
||||
<key>VALUE</key>
|
||||
<string>作业系统版本太旧</string>
|
||||
<string>作業系統版本太舊</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
|
@ -1115,11 +1115,11 @@
|
|||
</dict>
|
||||
<dict>
|
||||
<key>LANGUAGE</key>
|
||||
<string>Traditional Chinese</string>
|
||||
<string>Simplified Chinese</string>
|
||||
<key>SECONDARY_VALUE</key>
|
||||
<string>至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。</string>
|
||||
<string>至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。</string>
|
||||
<key>VALUE</key>
|
||||
<string>作業系統版本太舊</string>
|
||||
<string>作业系统版本太旧</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>NAME</key>
|
||||
|
|
|
@ -1183,7 +1183,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
|
@ -1206,7 +1206,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
|
||||
|
@ -1239,7 +1239,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
|
@ -1258,7 +1258,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
|
||||
|
@ -1373,7 +1373,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
|
@ -1408,7 +1408,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -1441,7 +1441,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
|
@ -1471,7 +1471,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
@ -1555,7 +1555,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
|
@ -1580,7 +1580,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -1608,7 +1608,7 @@
|
|||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1944;
|
||||
CURRENT_PROJECT_VERSION = 1945;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
|
@ -1628,7 +1628,7 @@
|
|||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11.5;
|
||||
MARKETING_VERSION = 1.4.4;
|
||||
MARKETING_VERSION = 1.4.5;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
|
Loading…
Reference in New Issue