Merge pull request #50 from ShikiSuen/upd/1.3.2

v1.3.2 Update // Fake-SEIGYOU Phonetic Layout, etc.
This commit is contained in:
Shiki Suen 2022-02-14 21:07:27 +08:00 committed by GitHub
commit 67af811b95
35 changed files with 6156 additions and 448 deletions

View File

@ -42,7 +42,7 @@
"593.title" = "取消"; "593.title" = "取消";
/* Class = "NSTextFieldCell"; title = "3-Clause BSD License:"; ObjectID = "AVS-ih-FXM"; */ /* Class = "NSTextFieldCell"; title = "3-Clause BSD License:"; ObjectID = "AVS-ih-FXM"; */
"AVS-ih-FXM.title" = "3条項BSDライセンス (3-Clause BSD License):"; "AVS-ih-FXM.title" = "MIT商標不許可ライセンス (MIT-NTL License):";
/* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */ /* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */
"GNc-8S-1VG.title" = "vChewing for macOS"; "GNc-8S-1VG.title" = "vChewing for macOS";

View File

@ -42,7 +42,7 @@
"593.title" = "取消安装"; "593.title" = "取消安装";
/* Class = "NSTextFieldCell"; title = "MIT-NTL License:"; ObjectID = "AVS-ih-FXM"; */ /* Class = "NSTextFieldCell"; title = "MIT-NTL License:"; ObjectID = "AVS-ih-FXM"; */
"AVS-ih-FXM.title" = "麻理去商标授权合约 (3-Clause BSD License):"; "AVS-ih-FXM.title" = "麻理去商标授权合约 (MIT-NTL License):";
/* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */ /* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */
"GNc-8S-1VG.title" = "vChewing for macOS"; "GNc-8S-1VG.title" = "vChewing for macOS";

View File

@ -42,7 +42,7 @@
"593.title" = "取消安裝"; "593.title" = "取消安裝";
/* Class = "NSTextFieldCell"; title = "MIT-NTL License:"; ObjectID = "AVS-ih-FXM"; */ /* Class = "NSTextFieldCell"; title = "MIT-NTL License:"; ObjectID = "AVS-ih-FXM"; */
"AVS-ih-FXM.title" = "麻理去商標授權合約 (3-Clause BSD License):"; "AVS-ih-FXM.title" = "麻理去商標授權合約 (MIT-NTL License):";
/* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */ /* Class = "NSTextFieldCell"; title = "vChewing for macOS"; ObjectID = "GNc-8S-1VG"; */
"GNc-8S-1VG.title" = "vChewing for macOS"; "GNc-8S-1VG.title" = "vChewing for macOS";

View File

@ -549,329 +549,6 @@ const std::string BPMF::HanyuPinyinString(bool includesTone,
return consonant + middle + vowel + tone; return consonant + middle + vowel + tone;
} }
const std::string BPMF::PHTString(bool includesTone) const {
std::string consonant, middle, vowel, tone;
Component cc = consonantComponent(), mvc = middleVowelComponent(),
vc = vowelComponent();
bool hasNoMVCOrVC = !(mvc || vc);
switch (cc) {
case B:
consonant = "p";
break;
case P:
consonant = "ph";
break;
case M:
consonant = "m";
break;
case F:
consonant = "f";
break;
case D:
consonant = "t";
break;
case T:
consonant = "th";
break;
case N:
consonant = "n";
break;
case L:
consonant = "l";
break;
case G:
consonant = "k";
break;
case K:
consonant = "kh";
break;
case H:
consonant = "h";
break;
case J:
consonant = "ch";
if (mvc != I) middle = "i";
break;
case Q:
consonant = "chh";
if (mvc != I) middle = "i";
break;
case X:
consonant = "hs";
if (mvc != I) middle = "i";
break;
case ZH:
consonant = "ch";
if (hasNoMVCOrVC) middle = "i";
break;
case CH:
consonant = "chh";
if (hasNoMVCOrVC) middle = "i";
break;
case SH:
consonant = "sh";
if (hasNoMVCOrVC) middle = "i";
break;
case R:
consonant = "r";
if (hasNoMVCOrVC) middle = "i";
break;
case Z:
consonant = "ts";
if (hasNoMVCOrVC) middle = "i";
break;
case C:
consonant = "tsh";
if (hasNoMVCOrVC) middle = "i";
break;
case S:
consonant = "s";
if (hasNoMVCOrVC) middle = "i";
break;
}
switch (mvc) {
case I:
middle = "i";
break;
case U:
middle = "u";
break;
case UE:
middle = "uu";
break;
}
switch (vc) {
case A:
vowel = "a";
break;
case O:
vowel = "o";
break;
case ER:
vowel = "e";
break;
case E:
vowel = (!(cc || mvc)) ? "eh" : "e";
break;
case AI:
vowel = "ai";
break;
case EI:
vowel = "ei";
break;
case AO:
vowel = "ao";
break;
case OU:
vowel = "ou";
break;
case AN:
vowel = "an";
break;
case EN:
vowel = "en";
break;
case ANG:
vowel = "ang";
break;
case ENG:
vowel = "eng";
break;
case ERR:
vowel = "err";
break;
}
// ieng -> ing
if (mvc == I && vc == ENG) {
middle = "";
vowel = "ing";
}
// zh/ch + i without third component -> append h
if (cc == BPMF::ZH || cc == BPMF::CH) {
if (!mvc && !vc) {
vowel = "h";
}
}
if (includesTone) {
switch (toneMarkerComponent()) {
case Tone2:
tone = "2";
break;
case Tone3:
tone = "3";
break;
case Tone4:
tone = "4";
break;
case Tone5:
tone = "5";
break;
}
}
return consonant + middle + vowel + tone;
}
const BPMF BPMF::FromPHT(const std::string& str) {
if (!str.length()) {
return BPMF();
}
std::string pht = str;
transform(pht.begin(), pht.end(), pht.begin(), ::tolower);
BPMF::Component firstComponent = 0;
BPMF::Component secondComponent = 0;
BPMF::Component thirdComponent = 0;
BPMF::Component toneComponent = 0;
#define IF_CONSUME1(k, v) \
else if (PinyinParseHelper::ConsumePrefix(pht, k)) { \
firstComponent = v; \
}
// consume the first part
if (0) {
}
IF_CONSUME1("ph", BPMF::P)
IF_CONSUME1("p", BPMF::B)
IF_CONSUME1("m", BPMF::M)
IF_CONSUME1("f", BPMF::F)
IF_CONSUME1("th", BPMF::T)
IF_CONSUME1("n", BPMF::N)
IF_CONSUME1("l", BPMF::L)
IF_CONSUME1("kh", BPMF::K)
IF_CONSUME1("k", BPMF::G)
IF_CONSUME1("chh", BPMF::Q)
IF_CONSUME1("ch", BPMF::J)
IF_CONSUME1("hs", BPMF::X)
IF_CONSUME1("sh", BPMF::SH)
IF_CONSUME1("r", BPMF::R)
IF_CONSUME1("tsh", BPMF::C)
IF_CONSUME1("ts", BPMF::Z)
IF_CONSUME1("s", BPMF::S)
IF_CONSUME1("t", BPMF::D)
IF_CONSUME1("h", BPMF::H)
#define IF_CONSUME2(k, v) \
else if (PinyinParseHelper::ConsumePrefix(pht, k)) { \
secondComponent = v; \
}
// consume the second part
if (0) {
} else if (PinyinParseHelper::ConsumePrefix(pht, "ing")) {
secondComponent = BPMF::I;
thirdComponent = BPMF::ENG;
} else if (PinyinParseHelper::ConsumePrefix(pht, "ih")) {
if (firstComponent == BPMF::J) {
firstComponent = BPMF::ZH;
} else if (firstComponent == BPMF::Q) {
firstComponent = BPMF::CH;
}
}
IF_CONSUME2("i", BPMF::I)
IF_CONSUME2("uu", BPMF::UE)
IF_CONSUME2("u", BPMF::U)
#undef IF_CONSUME1
#undef IF_CONSUME2
// the vowels, longer sequence takes precedence
if (0) {
} else if (PinyinParseHelper::ConsumePrefix(pht, "ang")) {
thirdComponent = BPMF::ANG;
} else if (PinyinParseHelper::ConsumePrefix(pht, "eng")) {
thirdComponent = BPMF::ENG;
} else if (PinyinParseHelper::ConsumePrefix(pht, "err")) {
thirdComponent = BPMF::ERR;
} else if (PinyinParseHelper::ConsumePrefix(pht, "ai")) {
thirdComponent = BPMF::AI;
} else if (PinyinParseHelper::ConsumePrefix(pht, "ei")) {
thirdComponent = BPMF::EI;
} else if (PinyinParseHelper::ConsumePrefix(pht, "ao")) {
thirdComponent = BPMF::AO;
} else if (PinyinParseHelper::ConsumePrefix(pht, "ou")) {
thirdComponent = BPMF::OU;
} else if (PinyinParseHelper::ConsumePrefix(pht, "an")) {
thirdComponent = BPMF::AN;
} else if (PinyinParseHelper::ConsumePrefix(pht, "en")) {
thirdComponent = BPMF::EN;
} else if (PinyinParseHelper::ConsumePrefix(pht, "er")) {
thirdComponent = BPMF::ERR;
} else if (PinyinParseHelper::ConsumePrefix(pht, "a")) {
thirdComponent = BPMF::A;
} else if (PinyinParseHelper::ConsumePrefix(pht, "o")) {
thirdComponent = BPMF::O;
} else if (PinyinParseHelper::ConsumePrefix(pht, "eh")) {
thirdComponent = BPMF::E;
} else if (PinyinParseHelper::ConsumePrefix(pht, "e")) {
if (secondComponent) {
thirdComponent = BPMF::E;
} else {
thirdComponent = BPMF::ER;
}
}
// fix ch/chh mappings
Component corresponding = 0;
if (firstComponent == BPMF::J) {
corresponding = BPMF::ZH;
} else if (firstComponent == BPMF::Q) {
corresponding = BPMF::CH;
}
if (corresponding) {
if (secondComponent == BPMF::I && !thirdComponent) {
// if the second component is I and there's no third component, we use the
// corresponding part firstComponent = corresponding;
} else if (secondComponent == BPMF::U) {
// if second component is U, we use the corresponding part
firstComponent = corresponding;
} else if (!secondComponent) {
// if there's no second component, it must be a corresponding part
firstComponent = corresponding;
}
}
if (secondComponent == BPMF::I) {
// fixes a few impossible occurances
switch (firstComponent) {
case BPMF::ZH:
case BPMF::CH:
case BPMF::SH:
case BPMF::R:
case BPMF::Z:
case BPMF::C:
case BPMF::S:
secondComponent = 0;
}
}
// at last!
if (0) {
} else if (PinyinParseHelper::ConsumePrefix(pht, "1")) {
toneComponent = BPMF::Tone1;
} else if (PinyinParseHelper::ConsumePrefix(pht, "2")) {
toneComponent = BPMF::Tone2;
} else if (PinyinParseHelper::ConsumePrefix(pht, "3")) {
toneComponent = BPMF::Tone3;
} else if (PinyinParseHelper::ConsumePrefix(pht, "4")) {
toneComponent = BPMF::Tone4;
} else if (PinyinParseHelper::ConsumePrefix(pht, "5")) {
toneComponent = BPMF::Tone5;
}
return BPMF(firstComponent | secondComponent | thirdComponent |
toneComponent);
}
const BPMF BPMF::FromComposedString(const std::string& str) { const BPMF BPMF::FromComposedString(const std::string& str) {
BPMF syllable; BPMF syllable;
auto iter = str.begin(); auto iter = str.begin();
@ -1258,9 +935,59 @@ static BopomofoKeyboardLayout* CreateETen26Layout() {
ASSIGNKEY1(ktcm, vec, 'r', BPMF::ER); ASSIGNKEY1(ktcm, vec, 'r', BPMF::ER);
ASSIGNKEY1(ktcm, vec, 'i', BPMF::AI); ASSIGNKEY1(ktcm, vec, 'i', BPMF::AI);
ASSIGNKEY1(ktcm, vec, 'z', BPMF::AO); ASSIGNKEY1(ktcm, vec, 'z', BPMF::AO);
return new BopomofoKeyboardLayout(ktcm, "ETen26"); return new BopomofoKeyboardLayout(ktcm, "ETen26");
} }
static BopomofoKeyboardLayout* CreateFakeSeigyouLayout() {
std::vector<BPMF::Component> vec;
BopomofoKeyToComponentMap ktcm;
ASSIGNKEY1(ktcm, vec, '1', BPMF::Tone5);
ASSIGNKEY1(ktcm, vec, '2', BPMF::B);
ASSIGNKEY1(ktcm, vec, '3', BPMF::D);
ASSIGNKEY1(ktcm, vec, '4', BPMF::I);
ASSIGNKEY1(ktcm, vec, '5', BPMF::U);
ASSIGNKEY1(ktcm, vec, '6', BPMF::ZH);
ASSIGNKEY1(ktcm, vec, '7', BPMF::UE);
ASSIGNKEY1(ktcm, vec, '8', BPMF::A);
ASSIGNKEY1(ktcm, vec, '9', BPMF::AI);
ASSIGNKEY1(ktcm, vec, '0', BPMF::AN);
ASSIGNKEY1(ktcm, vec, '-', BPMF::ERR);
ASSIGNKEY1(ktcm, vec, ';', BPMF::ANG);
ASSIGNKEY1(ktcm, vec, ',', BPMF::E);
ASSIGNKEY1(ktcm, vec, '.', BPMF::OU);
ASSIGNKEY1(ktcm, vec, '/', BPMF::ENG);
ASSIGNKEY1(ktcm, vec, 'a', BPMF::Tone3);
ASSIGNKEY1(ktcm, vec, 'b', BPMF::X);
ASSIGNKEY1(ktcm, vec, 'c', BPMF::L);
ASSIGNKEY1(ktcm, vec, 'd', BPMF::N);
ASSIGNKEY1(ktcm, vec, 'e', BPMF::T);
ASSIGNKEY1(ktcm, vec, 'f', BPMF::K);
ASSIGNKEY1(ktcm, vec, 'g', BPMF::Q);
ASSIGNKEY1(ktcm, vec, 'h', BPMF::SH);
ASSIGNKEY1(ktcm, vec, 'i', BPMF::O);
ASSIGNKEY1(ktcm, vec, 'j', BPMF::C);
ASSIGNKEY1(ktcm, vec, 'k', BPMF::ER);
ASSIGNKEY1(ktcm, vec, 'l', BPMF::AO);
ASSIGNKEY1(ktcm, vec, 'm', BPMF::S);
ASSIGNKEY1(ktcm, vec, 'n', BPMF::R);
ASSIGNKEY1(ktcm, vec, 'o', BPMF::EI);
ASSIGNKEY1(ktcm, vec, 'p', BPMF::EN);
ASSIGNKEY1(ktcm, vec, 'q', BPMF::Tone2);
ASSIGNKEY1(ktcm, vec, 'r', BPMF::G);
ASSIGNKEY1(ktcm, vec, 's', BPMF::M);
ASSIGNKEY1(ktcm, vec, 't', BPMF::J);
ASSIGNKEY1(ktcm, vec, 'u', BPMF::Z);
ASSIGNKEY1(ktcm, vec, 'v', BPMF::H);
ASSIGNKEY1(ktcm, vec, 'w', BPMF::P);
ASSIGNKEY1(ktcm, vec, 'x', BPMF::F);
ASSIGNKEY1(ktcm, vec, 'y', BPMF::CH);
ASSIGNKEY1(ktcm, vec, 'z', BPMF::Tone4);
return new BopomofoKeyboardLayout(ktcm, "FakeSeigyou");
}
static BopomofoKeyboardLayout* CreateHanyuPinyinLayout() { static BopomofoKeyboardLayout* CreateHanyuPinyinLayout() {
BopomofoKeyToComponentMap ktcm; BopomofoKeyToComponentMap ktcm;
return new BopomofoKeyboardLayout(ktcm, "HanyuPinyin"); return new BopomofoKeyboardLayout(ktcm, "HanyuPinyin");
@ -1296,6 +1023,11 @@ const BopomofoKeyboardLayout* BopomofoKeyboardLayout::MiTACLayout() {
return layout; return layout;
} }
const BopomofoKeyboardLayout* BopomofoKeyboardLayout::FakeSeigyouLayout() {
static BopomofoKeyboardLayout* layout = CreateFakeSeigyouLayout();
return layout;
}
const BopomofoKeyboardLayout* BopomofoKeyboardLayout::HanyuPinyinLayout() { const BopomofoKeyboardLayout* BopomofoKeyboardLayout::HanyuPinyinLayout() {
static BopomofoKeyboardLayout* layout = CreateHanyuPinyinLayout(); static BopomofoKeyboardLayout* layout = CreateHanyuPinyinLayout();
return layout; return layout;

View File

@ -46,12 +46,6 @@ public:
// TO DO: Support accented vowels // TO DO: Support accented vowels
const std::string HanyuPinyinString(bool includesTone, const std::string HanyuPinyinString(bool includesTone,
bool useVForUUmlaut) const; bool useVForUUmlaut) const;
// const std::string HanyuPinyinString(bool includesTone, bool useVForUUmlaut,
// bool composeAccentedVowel) const;
// PHT = Pai-hua-tsi
static const BopomofoSyllable FromPHT(const std::string& str);
const std::string PHTString(bool includesTone) const;
static const BopomofoSyllable FromComposedString(const std::string& str); static const BopomofoSyllable FromComposedString(const std::string& str);
const std::string composedString() const; const std::string composedString() const;
@ -140,38 +134,6 @@ syllable_ = (syllable_ & ~mask) | (another.syllable_ & mask); \
return *this; return *this;
} }
uint16_t absoluteOrder() const {
// turn BPMF syllable into a 4*14*4*22 number
return (uint16_t)(syllable_ & ConsonantMask) +
(uint16_t)((syllable_ & MiddleVowelMask) >> 5) * 22 +
(uint16_t)((syllable_ & VowelMask) >> 7) * 22 * 4 +
(uint16_t)((syllable_ & ToneMarkerMask) >> 11) * 22 * 4 * 14;
}
const std::string absoluteOrderString() const {
// 5*14*4*22 = 6160, we use a 79*79 encoding to represent that
uint16_t order = absoluteOrder();
char low = 48 + static_cast<char>(order % 79);
char high = 48 + static_cast<char>(order / 79);
std::string result(2, ' ');
result[0] = low;
result[1] = high;
return result;
}
static BopomofoSyllable FromAbsoluteOrder(uint16_t order) {
return BopomofoSyllable((order % 22) | ((order / 22) % 4) << 5 |
((order / (22 * 4)) % 14) << 7 |
((order / (22 * 4 * 14)) % 5) << 11);
}
static BopomofoSyllable FromAbsoluteOrderString(const std::string& str) {
if (str.length() != 2) return BopomofoSyllable();
return FromAbsoluteOrder((uint16_t)(str[1] - 48) * 79 +
(uint16_t)(str[0] - 48));
}
friend std::ostream& operator<<(std::ostream& stream, friend std::ostream& operator<<(std::ostream& stream,
const BopomofoSyllable& syllable); const BopomofoSyllable& syllable);
@ -214,6 +176,7 @@ public:
static const BopomofoKeyboardLayout* ETen26Layout(); static const BopomofoKeyboardLayout* ETen26Layout();
static const BopomofoKeyboardLayout* IBMLayout(); static const BopomofoKeyboardLayout* IBMLayout();
static const BopomofoKeyboardLayout* MiTACLayout(); static const BopomofoKeyboardLayout* MiTACLayout();
static const BopomofoKeyboardLayout* FakeSeigyouLayout();
static const BopomofoKeyboardLayout* HanyuPinyinLayout(); static const BopomofoKeyboardLayout* HanyuPinyinLayout();
BopomofoKeyboardLayout(const BopomofoKeyToComponentMap& ktcm, BopomofoKeyboardLayout(const BopomofoKeyToComponentMap& ktcm,
@ -498,10 +461,6 @@ public:
return BopomofoKeyboardLayout::StandardLayout()->keySequenceFromSyllable(syllable_); return BopomofoKeyboardLayout::StandardLayout()->keySequenceFromSyllable(syllable_);
} }
const std::string absoluteOrderQueryString() const {
return syllable_.absoluteOrderString();
}
bool hasToneMarker() const { return syllable_.hasToneMarker(); } bool hasToneMarker() const { return syllable_.hasToneMarker(); }
protected: protected:

@ -1 +1 @@
Subproject commit 2c41e514d64ef4fa9f92c619904b2b34a14ec847 Subproject commit 680243f6ed8f90cf71f17232eadc1c07aab43648

View File

@ -0,0 +1,175 @@
// Copyright (c) 2021 and onwards The vChewing Project (MIT-NTL License).
/*
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2. No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor,
except as required to fulfill notice requirements above.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import Cocoa
@objc class AppleKeyboardConverter: NSObject {
@objc class func isDynamicBaseKeyboardLayoutEnabled() -> Bool {
switch Preferences.basisKeyboardLayout {
case "com.apple.keylayout.ZhuyinBopomofo":
return true
case "com.apple.keylayout.ZhuyinEten":
return true
default:
return false
}
}
// Apple
@objc class func cnvApple2ABC(_ charCode: UniChar) -> UniChar {
var charCode = charCode
// OVMandarin OVMandarin
if self.isDynamicBaseKeyboardLayoutEnabled() {
// Apple
if charCode == 45 && (Preferences.basisKeyboardLayout == "com.apple.keylayout.ZhuyinBopomofo") { charCode = UniChar(96) }
if charCode == 183 && (Preferences.basisKeyboardLayout == "com.apple.keylayout.ZhuyinEten") { charCode = UniChar(96) }
//
if (charCode == 12573) {charCode = UniChar(44)}
if (charCode == 12582) {charCode = UniChar(45)}
if (charCode == 12577) {charCode = UniChar(46)}
if (charCode == 12581) {charCode = UniChar(47)}
if (charCode == 12578) {charCode = UniChar(48)}
if (charCode == 12549) {charCode = UniChar(49)}
if (charCode == 12553) {charCode = UniChar(50)}
if (charCode == 711) {charCode = UniChar(51)}
if (charCode == 715) {charCode = UniChar(52)}
if (charCode == 12563) {charCode = UniChar(53)}
if (charCode == 714) {charCode = UniChar(54)}
if (charCode == 729) {charCode = UniChar(55)}
if (charCode == 12570) {charCode = UniChar(56)}
if (charCode == 12574) {charCode = UniChar(57)}
if (charCode == 12580) {charCode = UniChar(59)}
if (charCode == 12551) {charCode = UniChar(97)}
if (charCode == 12566) {charCode = UniChar(98)}
if (charCode == 12559) {charCode = UniChar(99)}
if (charCode == 12558) {charCode = UniChar(100)}
if (charCode == 12557) {charCode = UniChar(101)}
if (charCode == 12561) {charCode = UniChar(102)}
if (charCode == 12565) {charCode = UniChar(103)}
if (charCode == 12568) {charCode = UniChar(104)}
if (charCode == 12571) {charCode = UniChar(105)}
if (charCode == 12584) {charCode = UniChar(106)}
if (charCode == 12572) {charCode = UniChar(107)}
if (charCode == 12576) {charCode = UniChar(108)}
if (charCode == 12585) {charCode = UniChar(109)}
if (charCode == 12569) {charCode = UniChar(110)}
if (charCode == 12575) {charCode = UniChar(111)}
if (charCode == 12579) {charCode = UniChar(112)}
if (charCode == 12550) {charCode = UniChar(113)}
if (charCode == 12560) {charCode = UniChar(114)}
if (charCode == 12555) {charCode = UniChar(115)}
if (charCode == 12564) {charCode = UniChar(116)}
if (charCode == 12583) {charCode = UniChar(117)}
if (charCode == 12562) {charCode = UniChar(118)}
if (charCode == 12554) {charCode = UniChar(119)}
if (charCode == 12556) {charCode = UniChar(120)}
if (charCode == 12567) {charCode = UniChar(121)}
if (charCode == 12552) {charCode = UniChar(122)}
//
if (charCode == 12289) {charCode = UniChar(92)}
if (charCode == 12300) {charCode = UniChar(91)}
if (charCode == 12301) {charCode = UniChar(93)}
if (charCode == 12302) {charCode = UniChar(123)}
if (charCode == 12303) {charCode = UniChar(125)}
if (charCode == 65292) {charCode = UniChar(60)}
if (charCode == 12290) {charCode = UniChar(62)}
// SHIFT
if (charCode == 65281) {charCode = UniChar(33)}
if (charCode == 65312) {charCode = UniChar(64)}
if (charCode == 65283) {charCode = UniChar(35)}
if (charCode == 65284) {charCode = UniChar(36)}
if (charCode == 65285) {charCode = UniChar(37)}
if (charCode == 65087) {charCode = UniChar(94)}
if (charCode == 65286) {charCode = UniChar(38)}
if (charCode == 65290) {charCode = UniChar(42)}
if (charCode == 65288) {charCode = UniChar(40)}
if (charCode == 65289) {charCode = UniChar(41)}
}
return charCode
}
@objc class func cnvStringApple2ABC(_ strProcessed: String) -> String {
var strProcessed = strProcessed
if self.isDynamicBaseKeyboardLayoutEnabled() {
// Apple
if (strProcessed == "-" && Preferences.basisKeyboardLayout == "com.apple.keylayout.ZhuyinBopomofo") { strProcessed = "`" }
if (strProcessed == "·" && Preferences.basisKeyboardLayout == "com.apple.keylayout.ZhuyinEten") { strProcessed = "`" }
//
if (strProcessed == "") {strProcessed = ","}
if (strProcessed == "") {strProcessed = "-"}
if (strProcessed == "") {strProcessed = "."}
if (strProcessed == "") {strProcessed = "/"}
if (strProcessed == "") {strProcessed = "0"}
if (strProcessed == "") {strProcessed = "1"}
if (strProcessed == "") {strProcessed = "2"}
if (strProcessed == "ˇ") {strProcessed = "3"}
if (strProcessed == "ˋ") {strProcessed = "4"}
if (strProcessed == "") {strProcessed = "5"}
if (strProcessed == "ˊ") {strProcessed = "6"}
if (strProcessed == "˙") {strProcessed = "7"}
if (strProcessed == "") {strProcessed = "8"}
if (strProcessed == "") {strProcessed = "9"}
if (strProcessed == "") {strProcessed = ";"}
if (strProcessed == "") {strProcessed = "a"}
if (strProcessed == "") {strProcessed = "b"}
if (strProcessed == "") {strProcessed = "c"}
if (strProcessed == "") {strProcessed = "d"}
if (strProcessed == "") {strProcessed = "e"}
if (strProcessed == "") {strProcessed = "f"}
if (strProcessed == "") {strProcessed = "g"}
if (strProcessed == "") {strProcessed = "h"}
if (strProcessed == "") {strProcessed = "i"}
if (strProcessed == "") {strProcessed = "j"}
if (strProcessed == "") {strProcessed = "k"}
if (strProcessed == "") {strProcessed = "l"}
if (strProcessed == "") {strProcessed = "m"}
if (strProcessed == "") {strProcessed = "n"}
if (strProcessed == "") {strProcessed = "o"}
if (strProcessed == "") {strProcessed = "p"}
if (strProcessed == "") {strProcessed = "q"}
if (strProcessed == "") {strProcessed = "r"}
if (strProcessed == "") {strProcessed = "s"}
if (strProcessed == "") {strProcessed = "t"}
if (strProcessed == "") {strProcessed = "u"}
if (strProcessed == "") {strProcessed = "v"}
if (strProcessed == "") {strProcessed = "w"}
if (strProcessed == "") {strProcessed = "x"}
if (strProcessed == "") {strProcessed = "y"}
if (strProcessed == "") {strProcessed = "z"}
//
if (strProcessed == "") {strProcessed = "\\"}
if (strProcessed == "") {strProcessed = "["}
if (strProcessed == "") {strProcessed = "]"}
if (strProcessed == "") {strProcessed = "{"}
if (strProcessed == "") {strProcessed = "}"}
if (strProcessed == "") {strProcessed = "<"}
if (strProcessed == "") {strProcessed = ">"}
// SHIFT
if (strProcessed == "") {strProcessed = "!"}
if (strProcessed == "") {strProcessed = "@"}
if (strProcessed == "") {strProcessed = "#"}
if (strProcessed == "") {strProcessed = "$"}
if (strProcessed == "") {strProcessed = "%"}
if (strProcessed == "︿") {strProcessed = "^"}
if (strProcessed == "") {strProcessed = "&"}
if (strProcessed == "") {strProcessed = "*"}
if (strProcessed == "") {strProcessed = "("}
if (strProcessed == "") {strProcessed = ")"}
}
return strProcessed
}
}

View File

@ -185,6 +185,9 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
case KeyboardLayoutMiTAC: case KeyboardLayoutMiTAC:
_bpmfReadingBuffer->setKeyboardLayout(BopomofoKeyboardLayout::MiTACLayout()); _bpmfReadingBuffer->setKeyboardLayout(BopomofoKeyboardLayout::MiTACLayout());
break; break;
case KeyboardLayoutFakeSeigyou:
_bpmfReadingBuffer->setKeyboardLayout(BopomofoKeyboardLayout::FakeSeigyouLayout());
break;
case KeyboardLayoutHanyuPinyin: case KeyboardLayoutHanyuPinyin:
_bpmfReadingBuffer->setKeyboardLayout(BopomofoKeyboardLayout::HanyuPinyinLayout()); _bpmfReadingBuffer->setKeyboardLayout(BopomofoKeyboardLayout::HanyuPinyinLayout());
break; break;
@ -198,10 +201,15 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
{ {
size_t cursorIndex = [self _actualCandidateCursorIndex]; size_t cursorIndex = [self _actualCandidateCursorIndex];
string stringValue = [value UTF8String]; string stringValue = [value UTF8String];
_builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue); NodeAnchor selectedNode = _builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue);
if (!Preferences.useSCPCTypingMode) { // 不要針對逐字選字模式啟用臨時半衰記憶模型。 if (!Preferences.useSCPCTypingMode) { // 不要針對逐字選字模式啟用臨時半衰記憶模型。
// If the length of the readings and the characters do not match,
// it often means it is a special symbol and it should not be stored
// in the user override model.
if (selectedNode.spanningLength == [value count]) {
_userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]); _userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]);
} }
}
[self _walk]; [self _walk];
if (Preferences.selectPhraseAfterCursorAsCandidate && if (Preferences.selectPhraseAfterCursorAsCandidate &&
@ -482,6 +490,9 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
// MARK: Enter // MARK: Enter
if (charCode == 13) { if (charCode == 13) {
if ([input isControlHold]) {
return [self _handleCtrlEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback];
}
return [self _handleEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback]; return [self _handleEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback];
} }
@ -783,6 +794,24 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
return YES; return YES;
} }
- (BOOL)_handleCtrlEnterWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback
{
if (![state isKindOfClass:[InputStateInputting class]]) {
return NO;
}
NSArray *readings = [self _currentReadings];
NSString *composingBuffer = [readings componentsJoinedByString:@"-"];
[self clear];
InputStateCommitting *committing = [[InputStateCommitting alloc] initWithPoppedText:composingBuffer];
stateCallback(committing);
InputStateEmpty *empty = [[InputStateEmpty alloc] init];
stateCallback(empty);
return YES;
}
- (BOOL)_handleEnterWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback - (BOOL)_handleEnterWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback
{ {
if (![state isKindOfClass:[InputStateInputting class]]) { if (![state isKindOfClass:[InputStateInputting class]]) {
@ -914,6 +943,8 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
{ {
NSString *inputText = input.inputText; NSString *inputText = input.inputText;
UniChar charCode = input.charCode; UniChar charCode = input.charCode;
NSString *char2Print = [NSString stringWithCharacters:&charCode length:1];
NSLog(@"vChewingCandidateKeyDebug: %@", char2Print);
VTCandidateController *gCurrentCandidateController = [self.delegate candidateControllerForKeyHandler:self]; VTCandidateController *gCurrentCandidateController = [self.delegate candidateControllerForKeyHandler:self];
BOOL cancelCandidateKey = (charCode == 27) || (charCode == 8) || [input isDelete]; BOOL cancelCandidateKey = (charCode == 27) || (charCode == 8) || [input isDelete];

View File

@ -48,13 +48,15 @@ class KeyHandlerInput: NSObject {
@objc private (set) var emacsKey: vChewingEmacsKey @objc private (set) var emacsKey: vChewingEmacsKey
@objc init(inputText: String?, keyCode: UInt16, charCode: UInt16, flags: NSEvent.ModifierFlags, isVerticalMode: Bool, inputTextIgnoringModifiers: String? = nil) { @objc init(inputText: String?, keyCode: UInt16, charCode: UInt16, flags: NSEvent.ModifierFlags, isVerticalMode: Bool, inputTextIgnoringModifiers: String? = nil) {
let inputText = AppleKeyboardConverter.cnvStringApple2ABC(inputText ?? "")
let inputTextIgnoringModifiers = AppleKeyboardConverter.cnvStringApple2ABC(inputTextIgnoringModifiers ?? inputText)
self.inputText = inputText self.inputText = inputText
self.inputTextIgnoringModifiers = inputTextIgnoringModifiers ?? inputText self.inputTextIgnoringModifiers = inputTextIgnoringModifiers
self.keyCode = keyCode self.keyCode = keyCode
self.charCode = charCode self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
self.flags = flags self.flags = flags
useVerticalMode = isVerticalMode useVerticalMode = isVerticalMode
emacsKey = EmacsKeyHelper.detect(charCode: charCode, flags: flags) emacsKey = EmacsKeyHelper.detect(charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags)
cursorForwardKey = useVerticalMode ? .down : .right cursorForwardKey = useVerticalMode ? .down : .right
cursorBackwardKey = useVerticalMode ? .up : .left cursorBackwardKey = useVerticalMode ? .up : .left
extraChooseCandidateKey = useVerticalMode ? .left : .down extraChooseCandidateKey = useVerticalMode ? .left : .down
@ -64,8 +66,8 @@ class KeyHandlerInput: NSObject {
} }
@objc init(event: NSEvent, isVerticalMode: Bool) { @objc init(event: NSEvent, isVerticalMode: Bool) {
inputText = event.characters inputText = AppleKeyboardConverter.cnvStringApple2ABC(event.characters ?? "")
inputTextIgnoringModifiers = event.charactersIgnoringModifiers inputTextIgnoringModifiers = AppleKeyboardConverter.cnvStringApple2ABC(event.charactersIgnoringModifiers ?? "")
keyCode = event.keyCode keyCode = event.keyCode
flags = event.modifierFlags flags = event.modifierFlags
useVerticalMode = isVerticalMode useVerticalMode = isVerticalMode
@ -76,8 +78,8 @@ class KeyHandlerInput: NSObject {
let first = inputText[inputText.startIndex].utf16.first! let first = inputText[inputText.startIndex].utf16.first!
return first return first
}() }()
self.charCode = charCode self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
emacsKey = EmacsKeyHelper.detect(charCode: charCode, flags: event.modifierFlags) emacsKey = EmacsKeyHelper.detect(charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: event.modifierFlags)
cursorForwardKey = useVerticalMode ? .down : .right cursorForwardKey = useVerticalMode ? .down : .right
cursorBackwardKey = useVerticalMode ? .up : .left cursorBackwardKey = useVerticalMode ? .up : .left
extraChooseCandidateKey = useVerticalMode ? .left : .down extraChooseCandidateKey = useVerticalMode ? .left : .down
@ -87,6 +89,9 @@ class KeyHandlerInput: NSObject {
} }
override var description: String { override var description: String {
charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
inputText = AppleKeyboardConverter.cnvStringApple2ABC(inputText ?? "")
inputTextIgnoringModifiers = AppleKeyboardConverter.cnvStringApple2ABC(inputTextIgnoringModifiers ?? "")
return "<\(super.description) inputText:\(String(describing: inputText)), inputTextIgnoringModifiers:\(String(describing: inputTextIgnoringModifiers)) charCode:\(charCode), keyCode:\(keyCode), flags:\(flags), cursorForwardKey:\(cursorForwardKey), cursorBackwardKey:\(cursorBackwardKey), extraChooseCandidateKey:\(extraChooseCandidateKey), absorbedArrowKey:\(absorbedArrowKey), verticalModeOnlyChooseCandidateKey:\(verticalModeOnlyChooseCandidateKey), emacsKey:\(emacsKey), useVerticalMode:\(useVerticalMode)>" return "<\(super.description) inputText:\(String(describing: inputText)), inputTextIgnoringModifiers:\(String(describing: inputTextIgnoringModifiers)) charCode:\(charCode), keyCode:\(keyCode), flags:\(flags), cursorForwardKey:\(cursorForwardKey), cursorBackwardKey:\(cursorBackwardKey), extraChooseCandidateKey:\(extraChooseCandidateKey), absorbedArrowKey:\(absorbedArrowKey), verticalModeOnlyChooseCandidateKey:\(verticalModeOnlyChooseCandidateKey), emacsKey:\(emacsKey), useVerticalMode:\(useVerticalMode)>"
} }
@ -199,6 +204,7 @@ class KeyHandlerInput: NSObject {
class EmacsKeyHelper: NSObject { class EmacsKeyHelper: NSObject {
@objc static func detect(charCode: UniChar, flags: NSEvent.ModifierFlags) -> vChewingEmacsKey { @objc static func detect(charCode: UniChar, flags: NSEvent.ModifierFlags) -> vChewingEmacsKey {
let charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
if flags.contains(.control) { if flags.contains(.control) {
return vChewingEmacsKey(rawValue: charCode) ?? .none return vChewingEmacsKey(rawValue: charCode) ?? .none
} }

View File

@ -156,6 +156,7 @@ struct ComposingBufferSize {
case eten26 = 3 case eten26 = 3
case IBM = 4 case IBM = 4
case MiTAC = 5 case MiTAC = 5
case FakeSeigyou = 6
case hanyuPinyin = 10 case hanyuPinyin = 10
var name: String { var name: String {
@ -172,6 +173,8 @@ struct ComposingBufferSize {
return "IBM" return "IBM"
case .MiTAC: case .MiTAC:
return "MiTAC" return "MiTAC"
case .FakeSeigyou:
return "FakeSeigyou"
case .hanyuPinyin: case .hanyuPinyin:
return "HanyuPinyin" return "HanyuPinyin"
} }
@ -336,10 +339,10 @@ struct ComposingBufferSize {
(KeyboardLayout(rawValue: self.keyboardLayout) ?? KeyboardLayout.standard).name (KeyboardLayout(rawValue: self.keyboardLayout) ?? KeyboardLayout.standard).name
} }
@UserDefault(key: kBasisKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.US") @UserDefault(key: kBasisKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.ZhuyinBopomofo")
@objc static var basisKeyboardLayout: String @objc static var basisKeyboardLayout: String
@UserDefault(key: kFunctionKeyKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.US") @UserDefault(key: kFunctionKeyKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.ZhuyinBopomofo")
@objc static var functionKeyboardLayout: String @objc static var functionKeyboardLayout: String
@UserDefault(key: kFunctionKeyKeyboardLayoutOverrideIncludeShift, defaultValue: false) @UserDefault(key: kFunctionKeyKeyboardLayoutOverrideIncludeShift, defaultValue: false)

View File

@ -20,7 +20,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
import Cocoa import Cocoa
import InputMethodKit import InputMethodKit
extension Bool { private extension Bool {
var state: NSControl.StateValue { var state: NSControl.StateValue {
self ? .on : .off self ? .on : .off
} }
@ -30,11 +30,14 @@ private let kMinKeyLabelSize: CGFloat = 10
private var gCurrentCandidateController: CandidateController? private var gCurrentCandidateController: CandidateController?
private extension CandidateController {
static let horizontal = HorizontalCandidateController()
static let vertical = VerticalCandidateController()
}
@objc(ctlInputMethod) @objc(ctlInputMethod)
class ctlInputMethod: IMKInputController { class ctlInputMethod: IMKInputController {
private static let horizontalCandidateController = HorizontalCandidateController()
private static let verticalCandidateController = VerticalCandidateController()
private static let tooltipController = TooltipController() private static let tooltipController = TooltipController()
// MARK: - // MARK: -
@ -183,11 +186,6 @@ class ctlInputMethod: IMKInputController {
let attributes: [AnyHashable: Any]? = (client as? IMKTextInput)?.attributes(forCharacterIndex: 0, lineHeightRectangle: &textFrame) let attributes: [AnyHashable: Any]? = (client as? IMKTextInput)?.attributes(forCharacterIndex: 0, lineHeightRectangle: &textFrame)
let useVerticalMode = (attributes?["IMKTextOrientation"] as? NSNumber)?.intValue == 0 || false let useVerticalMode = (attributes?["IMKTextOrientation"] as? NSNumber)?.intValue == 0 || false
if (client as? IMKTextInput)?.bundleIdentifier() == "com.apple.Terminal" &&
NSStringFromClass(client.self as! AnyClass) == "IPMDServerClientWrapper" {
currentDeferredClient = client
}
let input = KeyHandlerInput(event: event, isVerticalMode: useVerticalMode) let input = KeyHandlerInput(event: event, isVerticalMode: useVerticalMode)
let result = keyHandler.handle(input: input, state: state) { newState in let result = keyHandler.handle(input: input, state: state) { newState in
@ -241,7 +239,7 @@ class ctlInputMethod: IMKInputController {
private func open(userFileAt path: String) { private func open(userFileAt path: String) {
func checkIfUserFilesExist() -> Bool { func checkIfUserFilesExist() -> Bool {
if !mgrLangModel.checkIfUserLanguageModelFilesExist() { if !mgrLangModel.checkIfUserLanguageModelFilesExist() {
let content = String(format: NSLocalizedString("Please check the permission of at \"%@\".", comment: ""), mgrLangModel.dataFolderPath) let content = String(format: NSLocalizedString("Please check the permission at \"%@\".", comment: ""), mgrLangModel.dataFolderPath)
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) 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)
return false return false
} }
@ -329,15 +327,6 @@ extension ctlInputMethod {
if buffer.isEmpty { if buffer.isEmpty {
return return
} }
// if it's Terminal, we don't commit at the first call (the client of which will not be IPMDServerClientWrapper)
// then we defer the update in the next runloop round -- so that the composing buffer is not
// meaninglessly flushed, an annoying bug in Terminal.app since Mac OS X 10.5
if (client as? IMKTextInput)?.bundleIdentifier() == "com.apple.Terminal" && NSStringFromClass(client.self as! AnyClass) != "IPMDServerClientWrapper" {
let innerCurrentDeferredClient = currentDeferredClient
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {
(innerCurrentDeferredClient as? IMKTextInput)?.insertText(buffer, replacementRange: NSRange(location: NSNotFound, length: NSNotFound))
}
}
(client as? IMKTextInput)?.insertText(buffer, replacementRange: NSRange(location: NSNotFound, length: NSNotFound)) (client as? IMKTextInput)?.insertText(buffer, replacementRange: NSRange(location: NSNotFound, length: NSNotFound))
} }
@ -464,20 +453,37 @@ extension ctlInputMethod {
private func show(candidateWindowWith state: InputState, client: Any!) { private func show(candidateWindowWith state: InputState, client: Any!) {
let useVerticalMode: Bool = { let useVerticalMode: Bool = {
var useVerticalMode = false
var candidates: [String] = []
if let state = state as? InputState.ChoosingCandidate { if let state = state as? InputState.ChoosingCandidate {
return state.useVerticalMode useVerticalMode = state.useVerticalMode
candidates = state.candidates
} else if let state = state as? InputState.AssociatedPhrases { } else if let state = state as? InputState.AssociatedPhrases {
return state.useVerticalMode useVerticalMode = state.useVerticalMode
candidates = state.candidates
}
if useVerticalMode == true {
return true
}
candidates.sort {
return $0.count > $1.count
}
// If there is a candidate which is too long, we use the vertical
// candidate list window automatically.
if candidates.first?.count ?? 0 > 8 {
// return true //
} }
return false return false
}() }()
gCurrentCandidateController?.delegate = nil
if useVerticalMode { if useVerticalMode {
gCurrentCandidateController = ctlInputMethod.verticalCandidateController gCurrentCandidateController = .vertical
} else if Preferences.useHorizontalCandidateList { } else if Preferences.useHorizontalCandidateList {
gCurrentCandidateController = ctlInputMethod.horizontalCandidateController gCurrentCandidateController = .horizontal
} else { } else {
gCurrentCandidateController = ctlInputMethod.verticalCandidateController gCurrentCandidateController = .vertical
} }
// set the attributes for the candidate panel (which uses NSAttributedString) // set the attributes for the candidate panel (which uses NSAttributedString)
@ -551,7 +557,7 @@ extension ctlInputMethod {
extension ctlInputMethod: KeyHandlerDelegate { extension ctlInputMethod: KeyHandlerDelegate {
func candidateController(for keyHandler: KeyHandler) -> Any { func candidateController(for keyHandler: KeyHandler) -> Any {
gCurrentCandidateController ?? ctlInputMethod.verticalCandidateController gCurrentCandidateController ?? .vertical
} }
func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) { func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) {

View File

@ -40,11 +40,11 @@ namespace Taiyan {
vector<NodeAnchor> nodesEndingAt(size_t inLocation); vector<NodeAnchor> nodesEndingAt(size_t inLocation);
vector<NodeAnchor> nodesCrossingOrEndingAt(size_t inLocation); vector<NodeAnchor> nodesCrossingOrEndingAt(size_t inLocation);
// "Freeze" the node with the unigram that represents the selected canditate value. // "Freeze" the node with the unigram that represents the selected candidate value.
// After this, the node that contains the unigram will always be evaluated to that // After this, the node that contains the unigram will always be evaluated to that
// unigram, while all other overlapping nodes will be reset to their initial state // unigram, while all other overlapping nodes will be reset to their initial state
// (that is, if any of those nodes were "frozen" or fixed, they will be unfrozen.) // (that is, if any of those nodes were "frozen" or fixed, they will be unfrozen.)
void fixNodeSelectedCandidate(size_t location, const string& value); NodeAnchor fixNodeSelectedCandidate(size_t location, const string& value);
// Similar to fixNodeSelectedCandidate, but instead of "freezing" the node, only // Similar to fixNodeSelectedCandidate, but instead of "freezing" the node, only
// boost the unigram that represents the value with an overriding score. This // boost the unigram that represents the value with an overriding score. This
@ -180,9 +180,10 @@ namespace Taiyan {
} }
// For nodes found at the location, fix their currently-selected candidate using the supplied string value. // For nodes found at the location, fix their currently-selected candidate using the supplied string value.
inline void Grid::fixNodeSelectedCandidate(size_t location, const string& value) inline NodeAnchor Grid::fixNodeSelectedCandidate(size_t location, const string& value)
{ {
vector<NodeAnchor> nodes = nodesCrossingOrEndingAt(location); vector<NodeAnchor> nodes = nodesCrossingOrEndingAt(location);
NodeAnchor node;
for (auto nodeAnchor : nodes) { for (auto nodeAnchor : nodes) {
auto candidates = nodeAnchor.node->candidates(); auto candidates = nodeAnchor.node->candidates();
@ -192,10 +193,12 @@ namespace Taiyan {
for (size_t i = 0, c = candidates.size(); i < c; ++i) { for (size_t i = 0, c = candidates.size(); i < c; ++i) {
if (candidates[i].value == value) { if (candidates[i].value == value) {
const_cast<Node*>(nodeAnchor.node)->selectCandidateAtIndex(i); const_cast<Node*>(nodeAnchor.node)->selectCandidateAtIndex(i);
break; node = nodeAnchor;
break;;
} }
} }
} }
return node;
} }
inline void Grid::overrideNodeScoreForSelectedCandidate(size_t location, const string& value, float overridingScore) inline void Grid::overrideNodeScoreForSelectedCandidate(size_t location, const string& value, float overridingScore)

View File

@ -43,6 +43,7 @@ namespace Taiyan {
const string& key() const; const string& key() const;
double score() const; double score() const;
// double scoreForCandidate(string &candidate) const; // Prevents the override model to remember symbols with scode -X or lower.
const KeyValuePair currentKeyValue() const; const KeyValuePair currentKeyValue() const;
double highestUnigramScore() const; double highestUnigramScore() const;
@ -190,6 +191,17 @@ namespace Taiyan {
return m_score; return m_score;
} }
// Prevents the override model to remember symbols with scode -X or lower.
// inline double Node::scoreForCandidate(string &candidate) const
// {
// for (auto unigram : m_unigrams) {
// if (unigram.keyValue.value == candidate) {
// return unigram.score;
// }
// }
// return 0.0;
// }
inline double Node::highestUnigramScore() const { inline double Node::highestUnigramScore() const {
if (m_unigrams.empty()) { if (m_unigrams.empty()) {
return 0.0; return 0.0;

View File

@ -18,7 +18,7 @@
"Edit User Phrases…" = "Edit User Phrases…"; "Edit User Phrases…" = "Edit User Phrases…";
"Reload User Phrases" = "Reload User Phrases"; "Reload User Phrases" = "Reload User Phrases";
"Unable to create the user phrase file." = "Unable to create the user phrase file."; "Unable to create the user phrase file." = "Unable to create the user phrase file.";
"Please check the permission of at \"%@\"." = "Please check the permission of at \"%@\"."; "Please check the permission at \"%@\"." = "Please check the permission at \"%@\".";
"Edit Excluded Phrases" = "Edit Excluded Phrases…"; "Edit Excluded Phrases" = "Edit Excluded Phrases…";
"Half-Width Punctuation Mode" = "Half-Width Punctuation Mode"; "Half-Width Punctuation Mode" = "Half-Width Punctuation Mode";
"\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase.";
@ -46,7 +46,8 @@
"zh-Hans" = "Simplified Chinese"; "zh-Hans" = "Simplified Chinese";
"zh-Hant" = "Traditional Chinese"; "zh-Hant" = "Traditional Chinese";
"ja" = "Japanese"; "ja" = "Japanese";
"Apple Zhuyin Bopomofo" = "Apple Zhuyin Bopomofo"; "Apple Zhuyin Bopomofo" = "Apple Zhuyin Bopomofo (Standard)";
"Apple Zhuyin Eten" = "Apple Zhuyin Eten";
// The followings are the category names used in the Symbol menu. // The followings are the category names used in the Symbol menu.
"catCommonSymbols" = "CommonSymbols"; "catCommonSymbols" = "CommonSymbols";

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>org.atelierInmu.vChewing.keyLayouts</string>
<key>CFBundleName</key>
<string>vChewingKeyLayout</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>KLInfo_Zhuyin Dachen</key>
<dict>
<key>TICapsLockLanguageSwitchCapable</key>
<false/>
<key>TISInputSourceID</key>
<string>org.atelierInmu.vChewing.keyLayouts.zhuyindachen</string>
<key>TISIntendedLanguage</key>
<string>zh-Hanb</string>
</dict>
<key>KLInfo_Zhuyin ETen</key>
<dict>
<key>TICapsLockLanguageSwitchCapable</key>
<false/>
<key>TISInputSourceID</key>
<string>org.atelierInmu.vChewing.keyLayouts.zhuyineten</string>
<key>TISIntendedLanguage</key>
<string>zh-Hanb</string>
</dict>
<key>KLInfo_Zhuyin IBM</key>
<dict>
<key>TICapsLockLanguageSwitchCapable</key>
<false/>
<key>TISInputSourceID</key>
<string>org.atelierInmu.vChewing.keyLayouts.zhuyinibm</string>
<key>TISIntendedLanguage</key>
<string>zh-Hanb</string>
</dict>
<key>KLInfo_Zhuyin MiTAC</key>
<dict>
<key>TICapsLockLanguageSwitchCapable</key>
<false/>
<key>TISInputSourceID</key>
<string>org.atelierInmu.vChewing.keyLayouts.zhuyinmitac</string>
<key>TISIntendedLanguage</key>
<string>zh-Hanb</string>
</dict>
<key>KLInfo_Zhuyin Seigyou</key>
<dict>
<key>TICapsLockLanguageSwitchCapable</key>
<false/>
<key>TISInputSourceID</key>
<string>org.atelierInmu.vChewing.keyLayouts.zhuyinseigyou</string>
<key>TISIntendedLanguage</key>
<string>zh-Hanb</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildVersion</key>
<string>22M2</string>
<key>ProjectName</key>
<string>vChewingKeyLayout</string>
<key>SourceVersion</key>
<string></string>
</dict>
</plist>

View File

@ -18,7 +18,7 @@
"Edit User Phrases…" = "Edit User Phrases…"; "Edit User Phrases…" = "Edit User Phrases…";
"Reload User Phrases" = "Reload User Phrases"; "Reload User Phrases" = "Reload User Phrases";
"Unable to create the user phrase file." = "Unable to create the user phrase file."; "Unable to create the user phrase file." = "Unable to create the user phrase file.";
"Please check the permission of at \"%@\"." = "Please check the permission of at \"%@\"."; "Please check the permission at \"%@\"." = "Please check the permission at \"%@\".";
"Edit Excluded Phrases" = "Edit Excluded Phrases…"; "Edit Excluded Phrases" = "Edit Excluded Phrases…";
"Half-Width Punctuation Mode" = "Half-Width Punctuation Mode"; "Half-Width Punctuation Mode" = "Half-Width Punctuation Mode";
"\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase.";
@ -46,12 +46,13 @@
"zh-Hans" = "Simplified Chinese"; "zh-Hans" = "Simplified Chinese";
"zh-Hant" = "Traditional Chinese"; "zh-Hant" = "Traditional Chinese";
"ja" = "Japanese"; "ja" = "Japanese";
"Apple Zhuyin Bopomofo" = "Apple Zhuyin Bopomofo"; "Apple Zhuyin Bopomofo" = "Apple Zhuyin Bopomofo (Standard)";
"Apple Zhuyin Eten" = "Apple Zhuyin Eten";
// The followings are the category names used in the Symbol menu. // The followings are the category names used in the Symbol menu.
"catCommonSymbols" = "CommonSymbols"; "catCommonSymbols" = "CommonSymbols";
"catHoriBrackets" = "HoriBrackets"; "catHoriBrackets" = "HorizontalBrackets";
"catVertBrackets" = "VertBrackets"; "catVertBrackets" = "VerticalBrackets";
"catGreekLetters" = "GreekLetters"; "catGreekLetters" = "GreekLetters";
"catMathSymbols" = "MathSymbols"; "catMathSymbols" = "MathSymbols";
"catCurrencyUnits" = "CurrencyUnits"; "catCurrencyUnits" = "CurrencyUnits";

View File

@ -18,14 +18,14 @@
"Edit User Phrases…" = "ユーザー辞書を編集…"; "Edit User Phrases…" = "ユーザー辞書を編集…";
"Reload User Phrases" = "ユーザー辞書を再び読込む"; "Reload User Phrases" = "ユーザー辞書を再び読込む";
"Unable to create the user phrase file." = "ユーザー辞書ファイルの作成は失敗しました。"; "Unable to create the user phrase file." = "ユーザー辞書ファイルの作成は失敗しました。";
"Please check the permission of at \"%@\"." = "「%@」に書き出す権限は不足らしい。"; "Please check the permission at \"%@\"." = "「%@」に書き出す権限は不足らしい。";
"Edit Excluded Phrases" = "辞書条目排除表を編集…"; "Edit Excluded Phrases" = "辞書条目排除表を編集…";
"Half-Width Punctuation Mode" = "半角句読モード"; "Half-Width Punctuation Mode" = "半角句読モード";
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。";
"\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。";
"\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。";
"\"%@\" already exists." = "「%@」は既存語彙である。"; "\"%@\" already exists." = "「%@」は既存語彙である。";
"Edit Phrase Replacement Table" = "言葉置換表を編集…"; "Edit Phrase Replacement Table" = "言葉置換表を編集…";
"Use Phrase Replacement" = "言葉置換機能"; "Use Phrase Replacement" = "言葉置換機能";
"Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。"; "Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。";
"Candidate keys can only contain ASCII characters like alphanumerals." = "言選り用キー陣列にはASCII文字だけをご登録ください英数など。"; "Candidate keys can only contain ASCII characters like alphanumerals." = "言選り用キー陣列にはASCII文字だけをご登録ください英数など。";
@ -46,7 +46,8 @@
"zh-Hans" = "簡體中国語"; "zh-Hans" = "簡體中国語";
"zh-Hant" = "繁體中国語"; "zh-Hant" = "繁體中国語";
"ja" = "和語"; "ja" = "和語";
"Apple Zhuyin Bopomofo" = "Apple 注音ボポモフォ配列"; "Apple Zhuyin Bopomofo" = "Apple 注音ボポモフォ配列(大千標準)";
"Apple Zhuyin Bopomofo" = "Apple 注音ボポモフォ配列(倚天伝統)";
// The followings are the category names used in the Symbol menu. // The followings are the category names used in the Symbol menu.
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";

View File

@ -18,7 +18,7 @@
"Edit User Phrases…" = "编辑自订语汇…"; "Edit User Phrases…" = "编辑自订语汇…";
"Reload User Phrases" = "重载自订语汇"; "Reload User Phrases" = "重载自订语汇";
"Unable to create the user phrase file." = "无法创建自订语汇档案。"; "Unable to create the user phrase file." = "无法创建自订语汇档案。";
"Please check the permission of at \"%@\"." = "请检查此处的存取权限:\"%@\"."; "Please check the permission at \"%@\"." = "请检查此处的存取权限:\"%@\".";
"Edit Excluded Phrases" = "编辑要滤除的语汇…"; "Edit Excluded Phrases" = "编辑要滤除的语汇…";
"Half-Width Punctuation Mode" = "半角标点模式"; "Half-Width Punctuation Mode" = "半角标点模式";
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。";
@ -38,7 +38,7 @@
"Per-Char Select Mode" = "仿真逐字选字输入"; "Per-Char Select Mode" = "仿真逐字选字输入";
"CNS11643 Mode" = "全字库模式"; "CNS11643 Mode" = "全字库模式";
"Per-Char Associated Phrases" = "逐字选字联想模式"; "Per-Char Associated Phrases" = "逐字选字联想模式";
"Open User Data Folder" = "开启使用者数据夹"; "Open User Data Folder" = "开启使用者资料夹";
"Edit Associated Phrases…" = "编辑联想词…"; "Edit Associated Phrases…" = "编辑联想词…";
"Reboot vChewing…" = "重新启动输入法…"; "Reboot vChewing…" = "重新启动输入法…";
"auto" = "与系统设定一致"; "auto" = "与系统设定一致";
@ -46,7 +46,8 @@
"zh-Hans" = "简体中文"; "zh-Hans" = "简体中文";
"zh-Hant" = "繁体中文"; "zh-Hant" = "繁体中文";
"ja" = "和文"; "ja" = "和文";
"Apple Zhuyin Bopomofo" = "Apple 注音键盘布局"; "Apple Zhuyin Bopomofo" = "Apple 标准注音键盘布局";
"Apple Zhuyin Eten" = "Apple 倚天注音键盘布局";
// The followings are the category names used in the Symbol menu. // The followings are the category names used in the Symbol menu.
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";

View File

@ -18,7 +18,7 @@
"Edit User Phrases…" = "編輯自訂語彙…"; "Edit User Phrases…" = "編輯自訂語彙…";
"Reload User Phrases" = "重載自訂語彙"; "Reload User Phrases" = "重載自訂語彙";
"Unable to create the user phrase file." = "無法創建自訂語彙檔案。"; "Unable to create the user phrase file." = "無法創建自訂語彙檔案。";
"Please check the permission of at \"%@\"." = "請檢查此處的存取權限:\"%@\"."; "Please check the permission at \"%@\"." = "請檢查此處的存取權限:\"%@\".";
"Edit Excluded Phrases" = "編輯要濾除的語彙…"; "Edit Excluded Phrases" = "編輯要濾除的語彙…";
"Half-Width Punctuation Mode" = "半形標點模式"; "Half-Width Punctuation Mode" = "半形標點模式";
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。";
@ -46,7 +46,8 @@
"zh-Hans" = "簡體中文"; "zh-Hans" = "簡體中文";
"zh-Hant" = "繁體中文"; "zh-Hant" = "繁體中文";
"ja" = "和文"; "ja" = "和文";
"Apple Zhuyin Bopomofo" = "Apple 注音鍵盤佈局"; "Apple Zhuyin Bopomofo" = "Apple 標準注音鍵盤佈局";
"Apple Zhuyin Eten" = "Apple 倚天注音鍵盤佈局";
// The followings are the category names used in the Symbol menu. // The followings are the category names used in the Symbol menu.
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";

View File

@ -72,6 +72,16 @@ extension RangeReplaceableCollection where Element: Hashable {
basisKeyboardLayoutButton.menu?.removeAllItems() basisKeyboardLayoutButton.menu?.removeAllItems()
let menuItem_AppleZhuyinBopomofo = NSMenuItem()
menuItem_AppleZhuyinBopomofo.title = String(format: NSLocalizedString("Apple Zhuyin Bopomofo", comment: ""))
menuItem_AppleZhuyinBopomofo.representedObject = String("com.apple.keylayout.ZhuyinBopomofo")
basisKeyboardLayoutButton.menu?.addItem(menuItem_AppleZhuyinBopomofo)
let menuItem_AppleZhuyinEten = NSMenuItem()
menuItem_AppleZhuyinEten.title = String(format: NSLocalizedString("Apple Zhuyin Eten", comment: ""))
menuItem_AppleZhuyinEten.representedObject = String("com.apple.keylayout.ZhuyinEten")
basisKeyboardLayoutButton.menu?.addItem(menuItem_AppleZhuyinEten)
let basisKeyboardLayoutID = Preferences.basisKeyboardLayout let basisKeyboardLayoutID = Preferences.basisKeyboardLayout
for source in list { for source in list {
@ -132,10 +142,12 @@ extension RangeReplaceableCollection where Element: Hashable {
basisKeyboardLayoutButton.menu?.addItem(menuItem) basisKeyboardLayoutButton.menu?.addItem(menuItem)
} }
let menuItem = NSMenuItem() if (basisKeyboardLayoutID == "com.apple.keylayout.ZhuyinBopomofo") {
menuItem.title = String(format: NSLocalizedString("Apple Zhuyin Bopomofo", comment: "")) chosenBaseKeyboardLayoutItem = menuItem_AppleZhuyinBopomofo
menuItem.representedObject = String("com.apple.keylayout.ZhuyinBopomofo") } else if basisKeyboardLayoutID == "com.apple.keylayout.ZhuyinEten" {
basisKeyboardLayoutButton.menu?.addItem(menuItem) chosenBaseKeyboardLayoutItem = menuItem_AppleZhuyinEten
}
basisKeyboardLayoutButton.select(chosenBaseKeyboardLayoutItem ?? usKeyboardLayoutItem) basisKeyboardLayoutButton.select(chosenBaseKeyboardLayoutItem ?? usKeyboardLayoutItem)
selectionKeyComboBox.usesDataSource = false selectionKeyComboBox.usesDataSource = false

View File

@ -596,6 +596,7 @@
<menuItem title="ETen26" tag="3" id="9"/> <menuItem title="ETen26" tag="3" id="9"/>
<menuItem title="IBM" tag="4" id="137"/> <menuItem title="IBM" tag="4" id="137"/>
<menuItem title="MiTAC" tag="5" id="7fV-x8-WHQ"/> <menuItem title="MiTAC" tag="5" id="7fV-x8-WHQ"/>
<menuItem title="Fake Seigyou" tag="6" id="27F-8T-FkQ"/>
<menuItem title="Hanyu Pinyin" tag="10" id="10"/> <menuItem title="Hanyu Pinyin" tag="10" id="10"/>
</items> </items>
</menu> </menu>
@ -626,6 +627,22 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hab-1o-1kS">
<rect key="frame" x="18" y="41" width="409" height="235"/>
<constraints>
<constraint firstAttribute="height" constant="235" id="DuE-Bj-q43"/>
</constraints>
<textFieldCell key="cell" selectable="YES" id="wQ9-px-b07">
<font key="font" metaFont="system"/>
<mutableString 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.</mutableString>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="onD-QP-KPf" firstAttribute="leading" secondItem="mE9-SY-ijS" secondAttribute="leading" constant="20" symbolic="YES" id="2R9-Gu-Kmf"/> <constraint firstItem="onD-QP-KPf" firstAttribute="leading" secondItem="mE9-SY-ijS" secondAttribute="leading" constant="20" symbolic="YES" id="2R9-Gu-Kmf"/>
@ -640,9 +657,12 @@
<constraint firstItem="onD-QP-KPf" firstAttribute="top" secondItem="mE9-SY-ijS" secondAttribute="top" constant="15" id="XSD-Vc-x52"/> <constraint firstItem="onD-QP-KPf" firstAttribute="top" secondItem="mE9-SY-ijS" secondAttribute="top" constant="15" id="XSD-Vc-x52"/>
<constraint firstAttribute="trailing" secondItem="3" secondAttribute="trailing" constant="60" id="Z1E-EK-5Ts"/> <constraint firstAttribute="trailing" secondItem="3" secondAttribute="trailing" constant="60" id="Z1E-EK-5Ts"/>
<constraint firstItem="124" firstAttribute="top" secondItem="3" secondAttribute="bottom" constant="7" id="Zl4-5d-SJ5"/> <constraint firstItem="124" firstAttribute="top" secondItem="3" secondAttribute="bottom" constant="7" id="Zl4-5d-SJ5"/>
<constraint firstItem="hab-1o-1kS" firstAttribute="leading" secondItem="onD-QP-KPf" secondAttribute="leading" id="fLo-kq-NYc"/>
<constraint firstItem="3" firstAttribute="leading" secondItem="11" secondAttribute="trailing" constant="8" symbolic="YES" id="hZ7-qC-PmJ"/> <constraint firstItem="3" firstAttribute="leading" secondItem="11" secondAttribute="trailing" constant="8" symbolic="YES" id="hZ7-qC-PmJ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="onD-QP-KPf" secondAttribute="trailing" constant="20" symbolic="YES" id="nMf-Gq-Hm1"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="onD-QP-KPf" secondAttribute="trailing" constant="20" symbolic="YES" id="nMf-Gq-Hm1"/>
<constraint firstAttribute="trailing" secondItem="hab-1o-1kS" secondAttribute="trailing" constant="20" symbolic="YES" id="obq-hT-3AF"/>
<constraint firstItem="11" firstAttribute="centerY" secondItem="3" secondAttribute="centerY" id="t9r-zq-f68"/> <constraint firstItem="11" firstAttribute="centerY" secondItem="3" secondAttribute="centerY" id="t9r-zq-f68"/>
<constraint firstItem="hab-1o-1kS" firstAttribute="top" secondItem="124" secondAttribute="bottom" constant="22" id="vkh-FL-eIW"/>
</constraints> </constraints>
</view> </view>
</box> </box>

View File

@ -6,7 +6,7 @@
"5.title" = "OtherViews"; "5.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */ /* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
"6.title" = "Standard"; "6.title" = "Microsoft, Dachen, Wang, etc.";
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */ /* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
"7.title" = "ETen"; "7.title" = "ETen";
@ -92,6 +92,9 @@
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */ /* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
"7fV-x8-WHQ.title" = "MiTAC"; "7fV-x8-WHQ.title" = "MiTAC";
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
"27F-8T-FkQ.title" = "Fake Seigyou (similar to JinYei)";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */ /* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "Keyboard"; "1AW-xf-c2f.label" = "Keyboard";
@ -193,3 +196,6 @@
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */ /* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "Advanced"; "xrE-8T-WKO.label" = "Advanced";
/* 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.\n\n\tHOWEVER, 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.";

View File

@ -92,6 +92,9 @@
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */ /* 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" = "偽精業";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */ /* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "キーボード"; "1AW-xf-c2f.label" = "キーボード";
@ -193,3 +196,6 @@
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */ /* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "詳細"; "xrE-8T-WKO.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」このつダイナミック英数キーボード配列をサポートしたためである。基本的には、この機能は全ての言語の Apple キーボードと一緒に動けるはず。macOS 内蔵の注音入力と倚天注音入力が支障なく使える限り(支障があったら Feedback Assistant.app で Apple にご報告を)、この2つダイナミック英数キーボード配列も威注音で作動できるだと考えられる。\n\n\tだが、もし、ダイナミック英数キーボード配列を起用すると、今のこの画面の上の「注音キーボード配列」を標準配列にしなければならぬこと。なぜなら、この場合、倚天などの注音配列のサポート役割は macOS である。";

View File

@ -92,6 +92,9 @@
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */ /* 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" = "伪精业";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */ /* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "键盘"; "1AW-xf-c2f.label" = "键盘";
@ -162,13 +165,13 @@
"f2j-xD-4xK.title" = "敲 ESC 键以清空整个输入缓冲区"; "f2j-xD-4xK.title" = "敲 ESC 键以清空整个输入缓冲区";
/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */ /* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */
"f8i-69-zxm.title" = "自动重新加载变更过的使用者数据内容"; "f8i-69-zxm.title" = "自动重新加载变更过的使用者资料内容";
/* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */ /* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */
"iRg-wx-Nx2.title" = "变更候选字窗的字型大小。"; "iRg-wx-Nx2.title" = "变更候选字窗的字型大小。";
/* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */ /* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */
"j48-5a-cEs.title" = "请指定在使用者数据重载时要启用的功能。"; "j48-5a-cEs.title" = "请指定在使用者资料重载时要启用的功能。";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */ /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
@ -193,3 +196,6 @@
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */ /* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "进阶"; "xrE-8T-WKO.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 反馈这种键盘布局问题)。\n\n\t然而如果您启用了这种动态英数键盘布局的话请将当前画面顶端的注音键盘布局设为「微软/大千……」,因为对诸如倚天等异种键盘的支援已经交给 macOS 系统来事先完成了。";

View File

@ -92,6 +92,9 @@
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */ /* 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" = "偽精業";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */ /* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "鍵盤"; "1AW-xf-c2f.label" = "鍵盤";
@ -193,3 +196,6 @@
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */ /* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "進階"; "xrE-8T-WKO.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 反饋這種鍵盤佈局問題)。\n\n\t然而如果您啟用了這種動態英數鍵盤佈局的話請將當前畫面頂端的注音鍵盤佈局設為「微軟/大千……」,因為對諸如倚天等異種鍵盤的支援已經交給 macOS 系統來事先完成了。";

View File

@ -7,8 +7,8 @@
<key>UpdateInfoSite</key> <key>UpdateInfoSite</key>
<string>https://gitee.com/vchewing/vChewing-macOS</string> <string>https://gitee.com/vchewing/vChewing-macOS</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1920</string> <string>1921</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.3.1</string> <string>1.3.2</string>
</dict> </dict>
</plist> </plist>

View File

@ -341,8 +341,8 @@
/* Class = "NSMenuItem"; title = "显示工具列"; ObjectID = "snW-S8-Cw5"; */ /* Class = "NSMenuItem"; title = "显示工具列"; ObjectID = "snW-S8-Cw5"; */
"snW-S8-Cw5.title" = "显示工具列"; "snW-S8-Cw5.title" = "显示工具列";
/* Class = "NSMenuItem"; title = "数据侦测器"; ObjectID = "tRr-pd-1PS"; */ /* Class = "NSMenuItem"; title = "资料侦测器"; ObjectID = "tRr-pd-1PS"; */
"tRr-pd-1PS.title" = "数据侦测器"; "tRr-pd-1PS.title" = "资料侦测器";
/* Class = "NSMenuItem"; title = "开启近期的档案"; ObjectID = "tXI-mr-wws"; */ /* Class = "NSMenuItem"; title = "开启近期的档案"; ObjectID = "tXI-mr-wws"; */
"tXI-mr-wws.title" = "开启近期的档案"; "tXI-mr-wws.title" = "开启近期的档案";

View File

@ -8,8 +8,10 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; }; 5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; };
5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */; };
5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16D27AF6891006D874E /* data-chs.txt */; }; 5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16D27AF6891006D874E /* data-chs.txt */; };
5B2DB17027AF6891006D874E /* data-cht.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16E27AF6891006D874E /* data-cht.txt */; }; 5B2DB17027AF6891006D874E /* data-cht.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16E27AF6891006D874E /* data-cht.txt */; };
5B30F11327BA568800484E24 /* vChewingKeyLayout.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */; };
5B62A31727AE73A700A19448 /* unzip.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30927AE73A700A19448 /* unzip.m */; }; 5B62A31727AE73A700A19448 /* unzip.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30927AE73A700A19448 /* unzip.m */; };
5B62A31827AE73A700A19448 /* zip.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30A27AE73A700A19448 /* zip.m */; }; 5B62A31827AE73A700A19448 /* zip.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30A27AE73A700A19448 /* zip.m */; };
5B62A31927AE73A700A19448 /* ioapi.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30B27AE73A700A19448 /* ioapi.m */; }; 5B62A31927AE73A700A19448 /* ioapi.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A30B27AE73A700A19448 /* ioapi.m */; };
@ -137,9 +139,11 @@
5B05A47F27AFF84200437698 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = "<group>"; }; 5B05A47F27AFF84200437698 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = "<group>"; };
5B0AF8B427B2C8290096FE54 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = "<group>"; }; 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = "<group>"; };
5B0CF37F27AD476E00784B08 /* SwiftyOpenCC */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = SwiftyOpenCC; path = Packages/SwiftyOpenCC; sourceTree = "<group>"; }; 5B0CF37F27AD476E00784B08 /* SwiftyOpenCC */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = SwiftyOpenCC; path = Packages/SwiftyOpenCC; sourceTree = "<group>"; };
5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleKeyboardConverter.swift; sourceTree = "<group>"; };
5B2DB16D27AF6891006D874E /* data-chs.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-chs.txt"; path = "Data/data-chs.txt"; sourceTree = "<group>"; }; 5B2DB16D27AF6891006D874E /* data-chs.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-chs.txt"; path = "Data/data-chs.txt"; sourceTree = "<group>"; };
5B2DB16E27AF6891006D874E /* data-cht.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-cht.txt"; path = "Data/data-cht.txt"; sourceTree = "<group>"; }; 5B2DB16E27AF6891006D874E /* data-cht.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-cht.txt"; path = "Data/data-cht.txt"; sourceTree = "<group>"; };
5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = "<group>"; }; 5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = "<group>"; };
5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = vChewingKeyLayout.bundle; sourceTree = "<group>"; };
5B62A30927AE73A700A19448 /* unzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = unzip.m; sourceTree = "<group>"; }; 5B62A30927AE73A700A19448 /* unzip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = unzip.m; sourceTree = "<group>"; };
5B62A30A27AE73A700A19448 /* zip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = zip.m; sourceTree = "<group>"; }; 5B62A30A27AE73A700A19448 /* zip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = zip.m; sourceTree = "<group>"; };
5B62A30B27AE73A700A19448 /* ioapi.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ioapi.m; sourceTree = "<group>"; }; 5B62A30B27AE73A700A19448 /* ioapi.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ioapi.m; sourceTree = "<group>"; };
@ -296,6 +300,14 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
5B30F10727BA501900484E24 /* KeyLayouts */ = {
isa = PBXGroup;
children = (
5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */,
);
path = KeyLayouts;
sourceTree = "<group>";
};
5B62A30127AE732800A19448 /* 3rdParty */ = { 5B62A30127AE732800A19448 /* 3rdParty */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -361,6 +373,7 @@
5B62A31F27AE74E900A19448 /* ControllerModules */ = { 5B62A31F27AE74E900A19448 /* ControllerModules */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */,
D4E569DA27A34CC100AC2CEF /* KeyHandler.h */, D4E569DA27A34CC100AC2CEF /* KeyHandler.h */,
D4E569DB27A34CC100AC2CEF /* KeyHandler.mm */, D4E569DB27A34CC100AC2CEF /* KeyHandler.mm */,
D456576D279E4F7B00DF6BC9 /* KeyHandlerInput.swift */, D456576D279E4F7B00DF6BC9 /* KeyHandlerInput.swift */,
@ -449,6 +462,7 @@
5B62A33027AE78E500A19448 /* Resources */ = { 5B62A33027AE78E500A19448 /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B30F10727BA501900484E24 /* KeyLayouts */,
6A0D4EEE15FC0DA600ABF4B3 /* Images */, 6A0D4EEE15FC0DA600ABF4B3 /* Images */,
5BBBB76E27AED70B0023B93A /* MenuIcons */, 5BBBB76E27AED70B0023B93A /* MenuIcons */,
5BBBB75C27AED54C0023B93A /* SoundFiles */, 5BBBB75C27AED54C0023B93A /* SoundFiles */,
@ -854,6 +868,7 @@
5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */, 5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */,
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */, 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */,
5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */, 5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */,
5B30F11327BA568800484E24 /* vChewingKeyLayout.bundle in Resources */,
5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */, 5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -930,6 +945,7 @@
D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */, D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */,
D47D73AC27A6CAE600255A50 /* AssociatedPhrases.mm in Sources */, D47D73AC27A6CAE600255A50 /* AssociatedPhrases.mm in Sources */,
5B62A34A27AE7CD900A19448 /* NotifierController.swift in Sources */, 5B62A34A27AE7CD900A19448 /* NotifierController.swift in Sources */,
5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */,
5B62A31827AE73A700A19448 /* zip.m in Sources */, 5B62A31827AE73A700A19448 /* zip.m in Sources */,
5B62A32E27AE78B000A19448 /* CNSLM.mm in Sources */, 5B62A32E27AE78B000A19448 /* CNSLM.mm in Sources */,
D41355DB278E6D17005E5CBD /* vChewingLM.mm in Sources */, D41355DB278E6D17005E5CBD /* vChewingLM.mm in Sources */,
@ -1141,7 +1157,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1163,7 +1179,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1196,7 +1212,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
@ -1213,7 +1229,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1327,7 +1343,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1361,7 +1377,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1393,7 +1409,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1421,7 +1437,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -1504,7 +1520,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1529,7 +1545,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1557,7 +1573,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1920; CURRENT_PROJECT_VERSION = 1921;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1576,7 +1592,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.3.1; MARKETING_VERSION = 1.3.2;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";