├── .clang-format ├── .github └── workflows │ └── check.yml ├── .gitignore ├── AUTHORS ├── CMakeLists.txt ├── INSTALL ├── LICENSES └── LGPL-2.1-or-later.txt ├── Messages.sh ├── README.md ├── data ├── 16x16 │ └── apps │ │ ├── fcitx-hangul.png │ │ ├── fcitx-hanja-active.png │ │ ├── fcitx-hanja-inactive.png │ │ ├── org.fcitx.Fcitx5.fcitx-hangul.png │ │ ├── org.fcitx.Fcitx5.fcitx-hanja-active.png │ │ └── org.fcitx.Fcitx5.fcitx-hanja-inactive.png ├── 22x22 │ └── apps │ │ ├── fcitx-hangul.png │ │ ├── fcitx-hanja-active.png │ │ ├── fcitx-hanja-inactive.png │ │ ├── org.fcitx.Fcitx5.fcitx-hangul.png │ │ ├── org.fcitx.Fcitx5.fcitx-hanja-active.png │ │ └── org.fcitx.Fcitx5.fcitx-hanja-inactive.png ├── 24x24 │ └── apps │ │ ├── fcitx-hangul.png │ │ ├── fcitx-hanja-active.png │ │ ├── fcitx-hanja-inactive.png │ │ ├── org.fcitx.Fcitx5.fcitx-hangul.png │ │ ├── org.fcitx.Fcitx5.fcitx-hanja-active.png │ │ └── org.fcitx.Fcitx5.fcitx-hanja-inactive.png ├── 48x48 │ └── apps │ │ ├── fcitx-hangul.png │ │ ├── fcitx-hanja-active.png │ │ ├── fcitx-hanja-inactive.png │ │ ├── org.fcitx.Fcitx5.fcitx-hangul.png │ │ ├── org.fcitx.Fcitx5.fcitx-hanja-active.png │ │ └── org.fcitx.Fcitx5.fcitx-hanja-inactive.png ├── 64x64 │ └── apps │ │ ├── fcitx-hangul.png │ │ └── org.fcitx.Fcitx5.fcitx-hangul.png ├── CMakeLists.txt └── symbol.txt ├── list ├── CMakeLists.txt └── gen_list.c ├── org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in ├── po ├── CMakeLists.txt ├── LINGUAS ├── ca.po ├── da.po ├── de.po ├── fcitx5-hangul.pot ├── getdescpo ├── he.po ├── ja.po ├── ko.po ├── ru.po ├── tr.po ├── vi.po ├── zh_CN.po └── zh_TW.po ├── src ├── CMakeLists.txt ├── engine.cpp ├── engine.h ├── hangul-addon.conf.in.in └── hangul.conf.in └── test ├── CMakeLists.txt ├── addon └── CMakeLists.txt ├── inputmethod └── CMakeLists.txt ├── testdir.h.in └── testhangul.cpp /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | # BasedOnStyle: LLVM 4 | AccessModifierOffset: -4 5 | ConstructorInitializerIndentWidth: 4 6 | AlignEscapedNewlinesLeft: false 7 | AlignTrailingComments: true 8 | AllowAllParametersOfDeclarationOnNextLine: true 9 | AllowShortBlocksOnASingleLine: false 10 | AllowShortIfStatementsOnASingleLine: false 11 | AllowShortLoopsOnASingleLine: false 12 | AllowShortFunctionsOnASingleLine: All 13 | AlwaysBreakTemplateDeclarations: true 14 | AlwaysBreakBeforeMultilineStrings: false 15 | BreakBeforeBinaryOperators: false 16 | BreakBeforeTernaryOperators: true 17 | BreakConstructorInitializersBeforeComma: false 18 | BinPackParameters: true 19 | ColumnLimit: 80 20 | ConstructorInitializerAllOnOneLineOrOnePerLine: false 21 | DerivePointerAlignment: false 22 | ExperimentalAutoDetectBinPacking: false 23 | IndentCaseLabels: false 24 | IndentWrappedFunctionNames: false 25 | IndentFunctionDeclarationAfterType: false 26 | MaxEmptyLinesToKeep: 1 27 | KeepEmptyLinesAtTheStartOfBlocks: true 28 | NamespaceIndentation: None 29 | ObjCSpaceAfterProperty: false 30 | ObjCSpaceBeforeProtocolList: true 31 | PenaltyBreakBeforeFirstCallParameter: 19 32 | PenaltyBreakComment: 300 33 | PenaltyBreakString: 1000 34 | PenaltyBreakFirstLessLess: 120 35 | PenaltyExcessCharacter: 1000000 36 | PenaltyReturnTypeOnItsOwnLine: 60 37 | PointerAlignment: Right 38 | SpacesBeforeTrailingComments: 1 39 | Cpp11BracedListStyle: true 40 | Standard: Cpp11 41 | IndentWidth: 4 42 | TabWidth: 4 43 | UseTab: Never 44 | BreakBeforeBraces: Attach 45 | SpacesInParentheses: false 46 | SpacesInAngles: false 47 | SpaceInEmptyParentheses: false 48 | SpacesInCStyleCastParentheses: false 49 | SpacesInContainerLiterals: true 50 | SpaceBeforeAssignmentOperators: true 51 | ContinuationIndentWidth: 4 52 | CommentPragmas: '^ IWYU pragma:' 53 | ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ] 54 | SpaceBeforeParens: ControlStatements 55 | DisableFormat: false 56 | SortIncludes: true 57 | ... 58 | 59 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: 7 | branches: 8 | - master 9 | jobs: 10 | clang-format: 11 | name: Check clang-format 12 | runs-on: ubuntu-latest 13 | container: archlinux:latest 14 | steps: 15 | - name: Install dependencies 16 | run: | 17 | pacman -Syu --noconfirm git clang diffutils 18 | git config --global --add safe.directory $GITHUB_WORKSPACE 19 | - uses: actions/checkout@v4 20 | - uses: fcitx/github-actions@clang-format 21 | check: 22 | name: Build and test 23 | needs: clang-format 24 | runs-on: ubuntu-latest 25 | container: archlinux:latest 26 | strategy: 27 | fail-fast: false 28 | matrix: 29 | compiler: [gcc, clang] 30 | include: 31 | - compiler: gcc 32 | cxx_compiler: g++ 33 | - compiler: clang 34 | cxx_compiler: clang++ 35 | env: 36 | CC: ${{ matrix.compiler }} 37 | CXX: ${{ matrix.cxx_compiler }} 38 | steps: 39 | - name: Install dependencies 40 | run: | 41 | pacman -Syu --noconfirm base-devel clang cmake ninja extra-cmake-modules fmt libuv libhangul 42 | - uses: actions/checkout@v4 43 | with: 44 | repository: fcitx/fcitx5 45 | path: fcitx5 46 | - name: Cache fcitx5 data files 47 | uses: actions/cache@v4 48 | with: 49 | path: 'fcitx5/**/*.tar.*' 50 | key: ${{ runner.os }}-${{ hashFiles('fcitx5/src/modules/spell/CMakeLists.txt') 51 | }} 52 | - name: Build and Install fcitx5 53 | uses: fcitx/github-actions@cmake 54 | with: 55 | path: fcitx5 56 | cmake-option: >- 57 | -DENABLE_KEYBOARD=Off -DENABLE_X11=Off -DENABLE_WAYLAND=Off -DENABLE_ENCHANT=Off 58 | -DENABLE_DBUS=Off -DENABLE_SERVER=Off -DENABLE_EMOJI=Off -DUSE_SYSTEMD=Off 59 | - uses: actions/checkout@v4 60 | with: 61 | path: fcitx5-hangul 62 | - name: Init CodeQL 63 | uses: github/codeql-action/init@v3 64 | with: 65 | languages: cpp 66 | source-root: fcitx5-hangul 67 | - name: Build and Install fcitx5-hangul 68 | uses: fcitx/github-actions@cmake 69 | with: 70 | path: fcitx5-hangul 71 | - name: Test 72 | run: | 73 | ctest --test-dir fcitx5-hangul/build 74 | - name: CodeQL Analysis 75 | uses: github/codeql-action/analyze@v2 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/* 2 | *.kdev4 3 | .kdev_include_paths 4 | .directory 5 | *.kate-swp 6 | *.orig 7 | *~ 8 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Weng Xuetian 2 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required (VERSION 3.6) 2 | 3 | project(fcitx5-hangul VERSION 5.1.6) 4 | 5 | set(REQUIRED_FCITX_VERSION 5.1.12) 6 | find_package(ECM REQUIRED 1.0.0) 7 | set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) 8 | include(FeatureSummary) 9 | include(GNUInstallDirs) 10 | include(ECMUninstallTarget) 11 | 12 | find_package(Fcitx5Core ${REQUIRED_FCITX_VERSION} REQUIRED) 13 | find_package(Gettext REQUIRED) 14 | find_package(PkgConfig REQUIRED) 15 | find_package(Fcitx5Module REQUIRED COMPONENTS TestFrontend) 16 | 17 | option(ENABLE_TEST "Build Test" On) 18 | option(ENABLE_COVERAGE "Build the project with gcov support (Need ENABLE_TEST=On)" Off) 19 | 20 | if (NOT DEFINED HANGUL_TARGET) 21 | find_package(hangul CONFIG) 22 | if (TARGET hangul) 23 | set(HANGUL_TARGET hangul) 24 | else() 25 | pkg_check_modules(Hangul IMPORTED_TARGET "libhangul>=0.0.12" REQUIRED) 26 | set(HANGUL_TARGET PkgConfig::Hangul) 27 | endif() 28 | endif() 29 | 30 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") 31 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") 32 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") 33 | 34 | include("${FCITX_INSTALL_CMAKECONFIG_DIR}/Fcitx5Utils/Fcitx5CompilerSettings.cmake") 35 | add_definitions(-DFCITX_GETTEXT_DOMAIN=\"fcitx5-hangul\" -D_GNU_SOURCE) 36 | fcitx5_add_i18n_definition() 37 | 38 | add_subdirectory(po) 39 | add_subdirectory(src) 40 | add_subdirectory(data) 41 | add_subdirectory(list) 42 | 43 | if (ENABLE_TEST) 44 | enable_testing() 45 | add_subdirectory(test) 46 | 47 | if (ENABLE_COVERAGE) 48 | add_custom_target(coverage 49 | COMMAND "${CMAKE_CTEST_COMMAND}" 50 | COMMAND lcov --gcov-tool "${GCOV_TOOL}" --no-external --capture --directory ./ -b "${CMAKE_CURRENT_SOURCE_DIR}" --output-file coverage.info 51 | COMMAND genhtml coverage.info --output-directory "coverage_pages" 52 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 53 | endif() 54 | endif () 55 | 56 | fcitx5_translate_desktop_file(org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in 57 | org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml XML) 58 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml" DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) 59 | feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) 60 | -------------------------------------------------------------------------------- /INSTALL: -------------------------------------------------------------------------------- 1 | fcitx-hangul install instructions 2 | ================================================= 3 | 4 | To compile and install, go in the source directory and type: 5 | mkdir build; cd build 6 | cmake .. 7 | (If you want to install in a different path, use instead: 8 | cmake .. -DCMAKE_INSTALL_PREFIX=/install/path) 9 | make 10 | 11 | To install, become root if required: 12 | 13 | make install 14 | 15 | Once installed, you can restart fcitx and it will be enabled by default. 16 | -------------------------------------------------------------------------------- /LICENSES/LGPL-2.1-or-later.txt: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | 3 | Version 2.1, February 1999 4 | 5 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 6 | 7 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 8 | 9 | Everyone is permitted to copy and distribute verbatim copies of this license 10 | document, but changing it is not allowed. 11 | 12 | [This is the first released version of the Lesser GPL. It also counts as the 13 | successor of the GNU Library Public License, version 2, hence the version 14 | number 2.1.] 15 | 16 | Preamble 17 | 18 | The licenses for most software are designed to take away your freedom to share 19 | and change it. By contrast, the GNU General Public Licenses are intended to 20 | guarantee your freedom to share and change free software--to make sure the 21 | software is free for all its users. 22 | 23 | This license, the Lesser General Public License, applies to some specially 24 | designated software packages--typically libraries--of the Free Software Foundation 25 | and other authors who decide to use it. You can use it too, but we suggest 26 | you first think carefully about whether this license or the ordinary General 27 | Public License is the better strategy to use in any particular case, based 28 | on the explanations below. 29 | 30 | When we speak of free software, we are referring to freedom of use, not price. 31 | Our General Public Licenses are designed to make sure that you have the freedom 32 | to distribute copies of free software (and charge for this service if you 33 | wish); that you receive source code or can get it if you want it; that you 34 | can change the software and use pieces of it in new free programs; and that 35 | you are informed that you can do these things. 36 | 37 | To protect your rights, we need to make restrictions that forbid distributors 38 | to deny you these rights or to ask you to surrender these rights. These restrictions 39 | translate to certain responsibilities for you if you distribute copies of 40 | the library or if you modify it. 41 | 42 | For example, if you distribute copies of the library, whether gratis or for 43 | a fee, you must give the recipients all the rights that we gave you. You must 44 | make sure that they, too, receive or can get the source code. If you link 45 | other code with the library, you must provide complete object files to the 46 | recipients, so that they can relink them with the library after making changes 47 | to the library and recompiling it. And you must show them these terms so they 48 | know their rights. 49 | 50 | We protect your rights with a two-step method: (1) we copyright the library, 51 | and (2) we offer you this license, which gives you legal permission to copy, 52 | distribute and/or modify the library. 53 | 54 | To protect each distributor, we want to make it very clear that there is no 55 | warranty for the free library. Also, if the library is modified by someone 56 | else and passed on, the recipients should know that what they have is not 57 | the original version, so that the original author's reputation will not be 58 | affected by problems that might be introduced by others. 59 | 60 | Finally, software patents pose a constant threat to the existence of any free 61 | program. We wish to make sure that a company cannot effectively restrict the 62 | users of a free program by obtaining a restrictive license from a patent holder. 63 | Therefore, we insist that any patent license obtained for a version of the 64 | library must be consistent with the full freedom of use specified in this 65 | license. 66 | 67 | Most GNU software, including some libraries, is covered by the ordinary GNU 68 | General Public License. This license, the GNU Lesser General Public License, 69 | applies to certain designated libraries, and is quite different from the ordinary 70 | General Public License. We use this license for certain libraries in order 71 | to permit linking those libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using a shared 74 | library, the combination of the two is legally speaking a combined work, a 75 | derivative of the original library. The ordinary General Public License therefore 76 | permits such linking only if the entire combination fits its criteria of freedom. 77 | The Lesser General Public License permits more lax criteria for linking other 78 | code with the library. 79 | 80 | We call this license the "Lesser" General Public License because it does Less 81 | to protect the user's freedom than the ordinary General Public License. It 82 | also provides other free software developers Less of an advantage over competing 83 | non-free programs. These disadvantages are the reason we use the ordinary 84 | General Public License for many libraries. However, the Lesser license provides 85 | advantages in certain special circumstances. 86 | 87 | For example, on rare occasions, there may be a special need to encourage the 88 | widest possible use of a certain library, so that it becomes a de-facto standard. 89 | To achieve this, non-free programs must be allowed to use the library. A more 90 | frequent case is that a free library does the same job as widely used non-free 91 | libraries. In this case, there is little to gain by limiting the free library 92 | to free software only, so we use the Lesser General Public License. 93 | 94 | In other cases, permission to use a particular library in non-free programs 95 | enables a greater number of people to use a large body of free software. For 96 | example, permission to use the GNU C Library in non-free programs enables 97 | many more people to use the whole GNU operating system, as well as its variant, 98 | the GNU/Linux operating system. 99 | 100 | Although the Lesser General Public License is Less protective of the users' 101 | freedom, it does ensure that the user of a program that is linked with the 102 | Library has the freedom and the wherewithal to run that program using a modified 103 | version of the Library. 104 | 105 | The precise terms and conditions for copying, distribution and modification 106 | follow. Pay close attention to the difference between a "work based on the 107 | library" and a "work that uses the library". The former contains code derived 108 | from the library, whereas the latter must be combined with the library in 109 | order to run. 110 | 111 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 112 | 113 | 0. This License Agreement applies to any software library or other program 114 | which contains a notice placed by the copyright holder or other authorized 115 | party saying it may be distributed under the terms of this Lesser General 116 | Public License (also called "this License"). Each licensee is addressed as 117 | "you". 118 | 119 | A "library" means a collection of software functions and/or data prepared 120 | so as to be conveniently linked with application programs (which use some 121 | of those functions and data) to form executables. 122 | 123 | The "Library", below, refers to any such software library or work which has 124 | been distributed under these terms. A "work based on the Library" means either 125 | the Library or any derivative work under copyright law: that is to say, a 126 | work containing the Library or a portion of it, either verbatim or with modifications 127 | and/or translated straightforwardly into another language. (Hereinafter, translation 128 | is included without limitation in the term "modification".) 129 | 130 | "Source code" for a work means the preferred form of the work for making modifications 131 | to it. For a library, complete source code means all the source code for all 132 | modules it contains, plus any associated interface definition files, plus 133 | the scripts used to control compilation and installation of the library. 134 | 135 | Activities other than copying, distribution and modification are not covered 136 | by this License; they are outside its scope. The act of running a program 137 | using the Library is not restricted, and output from such a program is covered 138 | only if its contents constitute a work based on the Library (independent of 139 | the use of the Library in a tool for writing it). Whether that is true depends 140 | on what the Library does and what the program that uses the Library does. 141 | 142 | 1. You may copy and distribute verbatim copies of the Library's complete source 143 | code as you receive it, in any medium, provided that you conspicuously and 144 | appropriately publish on each copy an appropriate copyright notice and disclaimer 145 | of warranty; keep intact all the notices that refer to this License and to 146 | the absence of any warranty; and distribute a copy of this License along with 147 | the Library. 148 | 149 | You may charge a fee for the physical act of transferring a copy, and you 150 | may at your option offer warranty protection in exchange for a fee. 151 | 152 | 2. You may modify your copy or copies of the Library or any portion of it, 153 | thus forming a work based on the Library, and copy and distribute such modifications 154 | or work under the terms of Section 1 above, provided that you also meet all 155 | of these conditions: 156 | 157 | a) The modified work must itself be a software library. 158 | 159 | b) You must cause the files modified to carry prominent notices stating that 160 | you changed the files and the date of any change. 161 | 162 | c) You must cause the whole of the work to be licensed at no charge to all 163 | third parties under the terms of this License. 164 | 165 | d) If a facility in the modified Library refers to a function or a table of 166 | data to be supplied by an application program that uses the facility, other 167 | than as an argument passed when the facility is invoked, then you must make 168 | a good faith effort to ensure that, in the event an application does not supply 169 | such function or table, the facility still operates, and performs whatever 170 | part of its purpose remains meaningful. 171 | 172 | (For example, a function in a library to compute square roots has a purpose 173 | that is entirely well-defined independent of the application. Therefore, Subsection 174 | 2d requires that any application-supplied function or table used by this function 175 | must be optional: if the application does not supply it, the square root function 176 | must still compute square roots.) 177 | 178 | These requirements apply to the modified work as a whole. If identifiable 179 | sections of that work are not derived from the Library, and can be reasonably 180 | considered independent and separate works in themselves, then this License, 181 | and its terms, do not apply to those sections when you distribute them as 182 | separate works. But when you distribute the same sections as part of a whole 183 | which is a work based on the Library, the distribution of the whole must be 184 | on the terms of this License, whose permissions for other licensees extend 185 | to the entire whole, and thus to each and every part regardless of who wrote 186 | it. 187 | 188 | Thus, it is not the intent of this section to claim rights or contest your 189 | rights to work written entirely by you; rather, the intent is to exercise 190 | the right to control the distribution of derivative or collective works based 191 | on the Library. 192 | 193 | In addition, mere aggregation of another work not based on the Library with 194 | the Library (or with a work based on the Library) on a volume of a storage 195 | or distribution medium does not bring the other work under the scope of this 196 | License. 197 | 198 | 3. You may opt to apply the terms of the ordinary GNU General Public License 199 | instead of this License to a given copy of the Library. To do this, you must 200 | alter all the notices that refer to this License, so that they refer to the 201 | ordinary GNU General Public License, version 2, instead of to this License. 202 | (If a newer version than version 2 of the ordinary GNU General Public License 203 | has appeared, then you can specify that version instead if you wish.) Do not 204 | make any other change in these notices. 205 | 206 | Once this change is made in a given copy, it is irreversible for that copy, 207 | so the ordinary GNU General Public License applies to all subsequent copies 208 | and derivative works made from that copy. 209 | 210 | This option is useful when you wish to copy part of the code of the Library 211 | into a program that is not a library. 212 | 213 | 4. You may copy and distribute the Library (or a portion or derivative of 214 | it, under Section 2) in object code or executable form under the terms of 215 | Sections 1 and 2 above provided that you accompany it with the complete corresponding 216 | machine-readable source code, which must be distributed under the terms of 217 | Sections 1 and 2 above on a medium customarily used for software interchange. 218 | 219 | If distribution of object code is made by offering access to copy from a designated 220 | place, then offering equivalent access to copy the source code from the same 221 | place satisfies the requirement to distribute the source code, even though 222 | third parties are not compelled to copy the source along with the object code. 223 | 224 | 5. A program that contains no derivative of any portion of the Library, but 225 | is designed to work with the Library by being compiled or linked with it, 226 | is called a "work that uses the Library". Such a work, in isolation, is not 227 | a derivative work of the Library, and therefore falls outside the scope of 228 | this License. 229 | 230 | However, linking a "work that uses the Library" with the Library creates an 231 | executable that is a derivative of the Library (because it contains portions 232 | of the Library), rather than a "work that uses the library". The executable 233 | is therefore covered by this License. Section 6 states terms for distribution 234 | of such executables. 235 | 236 | When a "work that uses the Library" uses material from a header file that 237 | is part of the Library, the object code for the work may be a derivative work 238 | of the Library even though the source code is not. Whether this is true is 239 | especially significant if the work can be linked without the Library, or if 240 | the work is itself a library. The threshold for this to be true is not precisely 241 | defined by law. 242 | 243 | If such an object file uses only numerical parameters, data structure layouts 244 | and accessors, and small macros and small inline functions (ten lines or less 245 | in length), then the use of the object file is unrestricted, regardless of 246 | whether it is legally a derivative work. (Executables containing this object 247 | code plus portions of the Library will still fall under Section 6.) 248 | 249 | Otherwise, if the work is a derivative of the Library, you may distribute 250 | the object code for the work under the terms of Section 6. Any executables 251 | containing that work also fall under Section 6, whether or not they are linked 252 | directly with the Library itself. 253 | 254 | 6. As an exception to the Sections above, you may also combine or link a "work 255 | that uses the Library" with the Library to produce a work containing portions 256 | of the Library, and distribute that work under terms of your choice, provided 257 | that the terms permit modification of the work for the customer's own use 258 | and reverse engineering for debugging such modifications. 259 | 260 | You must give prominent notice with each copy of the work that the Library 261 | is used in it and that the Library and its use are covered by this License. 262 | You must supply a copy of this License. If the work during execution displays 263 | copyright notices, you must include the copyright notice for the Library among 264 | them, as well as a reference directing the user to the copy of this License. 265 | Also, you must do one of these things: 266 | 267 | a) Accompany the work with the complete corresponding machine-readable source 268 | code for the Library including whatever changes were used in the work (which 269 | must be distributed under Sections 1 and 2 above); and, if the work is an 270 | executable linked with the Library, with the complete machine-readable "work 271 | that uses the Library", as object code and/or source code, so that the user 272 | can modify the Library and then relink to produce a modified executable containing 273 | the modified Library. (It is understood that the user who changes the contents 274 | of definitions files in the Library will not necessarily be able to recompile 275 | the application to use the modified definitions.) 276 | 277 | b) Use a suitable shared library mechanism for linking with the Library. A 278 | suitable mechanism is one that (1) uses at run time a copy of the library 279 | already present on the user's computer system, rather than copying library 280 | functions into the executable, and (2) will operate properly with a modified 281 | version of the library, if the user installs one, as long as the modified 282 | version is interface-compatible with the version that the work was made with. 283 | 284 | c) Accompany the work with a written offer, valid for at least three years, 285 | to give the same user the materials specified in Subsection 6a, above, for 286 | a charge no more than the cost of performing this distribution. 287 | 288 | d) If distribution of the work is made by offering access to copy from a designated 289 | place, offer equivalent access to copy the above specified materials from 290 | the same place. 291 | 292 | e) Verify that the user has already received a copy of these materials or 293 | that you have already sent this user a copy. 294 | 295 | For an executable, the required form of the "work that uses the Library" must 296 | include any data and utility programs needed for reproducing the executable 297 | from it. However, as a special exception, the materials to be distributed 298 | need not include anything that is normally distributed (in either source or 299 | binary form) with the major components (compiler, kernel, and so on) of the 300 | operating system on which the executable runs, unless that component itself 301 | accompanies the executable. 302 | 303 | It may happen that this requirement contradicts the license restrictions of 304 | other proprietary libraries that do not normally accompany the operating system. 305 | Such a contradiction means you cannot use both them and the Library together 306 | in an executable that you distribute. 307 | 308 | 7. You may place library facilities that are a work based on the Library side-by-side 309 | in a single library together with other library facilities not covered by 310 | this License, and distribute such a combined library, provided that the separate 311 | distribution of the work based on the Library and of the other library facilities 312 | is otherwise permitted, and provided that you do these two things: 313 | 314 | a) Accompany the combined library with a copy of the same work based on the 315 | Library, uncombined with any other library facilities. This must be distributed 316 | under the terms of the Sections above. 317 | 318 | b) Give prominent notice with the combined library of the fact that part of 319 | it is a work based on the Library, and explaining where to find the accompanying 320 | uncombined form of the same work. 321 | 322 | 8. You may not copy, modify, sublicense, link with, or distribute the Library 323 | except as expressly provided under this License. Any attempt otherwise to 324 | copy, modify, sublicense, link with, or distribute the Library is void, and 325 | will automatically terminate your rights under this License. However, parties 326 | who have received copies, or rights, from you under this License will not 327 | have their licenses terminated so long as such parties remain in full compliance. 328 | 329 | 9. You are not required to accept this License, since you have not signed 330 | it. However, nothing else grants you permission to modify or distribute the 331 | Library or its derivative works. These actions are prohibited by law if you 332 | do not accept this License. Therefore, by modifying or distributing the Library 333 | (or any work based on the Library), you indicate your acceptance of this License 334 | to do so, and all its terms and conditions for copying, distributing or modifying 335 | the Library or works based on it. 336 | 337 | 10. Each time you redistribute the Library (or any work based on the Library), 338 | the recipient automatically receives a license from the original licensor 339 | to copy, distribute, link with or modify the Library subject to these terms 340 | and conditions. You may not impose any further restrictions on the recipients' 341 | exercise of the rights granted herein. You are not responsible for enforcing 342 | compliance by third parties with this License. 343 | 344 | 11. If, as a consequence of a court judgment or allegation of patent infringement 345 | or for any other reason (not limited to patent issues), conditions are imposed 346 | on you (whether by court order, agreement or otherwise) that contradict the 347 | conditions of this License, they do not excuse you from the conditions of 348 | this License. If you cannot distribute so as to satisfy simultaneously your 349 | obligations under this License and any other pertinent obligations, then as 350 | a consequence you may not distribute the Library at all. For example, if a 351 | patent license would not permit royalty-free redistribution of the Library 352 | by all those who receive copies directly or indirectly through you, then the 353 | only way you could satisfy both it and this License would be to refrain entirely 354 | from distribution of the Library. 355 | 356 | If any portion of this section is held invalid or unenforceable under any 357 | particular circumstance, the balance of the section is intended to apply, 358 | and the section as a whole is intended to apply in other circumstances. 359 | 360 | It is not the purpose of this section to induce you to infringe any patents 361 | or other property right claims or to contest validity of any such claims; 362 | this section has the sole purpose of protecting the integrity of the free 363 | software distribution system which is implemented by public license practices. 364 | Many people have made generous contributions to the wide range of software 365 | distributed through that system in reliance on consistent application of that 366 | system; it is up to the author/donor to decide if he or she is willing to 367 | distribute software through any other system and a licensee cannot impose 368 | that choice. 369 | 370 | This section is intended to make thoroughly clear what is believed to be a 371 | consequence of the rest of this License. 372 | 373 | 12. If the distribution and/or use of the Library is restricted in certain 374 | countries either by patents or by copyrighted interfaces, the original copyright 375 | holder who places the Library under this License may add an explicit geographical 376 | distribution limitation excluding those countries, so that distribution is 377 | permitted only in or among countries not thus excluded. In such case, this 378 | License incorporates the limitation as if written in the body of this License. 379 | 380 | 13. The Free Software Foundation may publish revised and/or new versions of 381 | the Lesser General Public License from time to time. Such new versions will 382 | be similar in spirit to the present version, but may differ in detail to address 383 | new problems or concerns. 384 | 385 | Each version is given a distinguishing version number. If the Library specifies 386 | a version number of this License which applies to it and "any later version", 387 | you have the option of following the terms and conditions either of that version 388 | or of any later version published by the Free Software Foundation. If the 389 | Library does not specify a license version number, you may choose any version 390 | ever published by the Free Software Foundation. 391 | 392 | 14. If you wish to incorporate parts of the Library into other free programs 393 | whose distribution conditions are incompatible with these, write to the author 394 | to ask for permission. For software which is copyrighted by the Free Software 395 | Foundation, write to the Free Software Foundation; we sometimes make exceptions 396 | for this. Our decision will be guided by the two goals of preserving the free 397 | status of all derivatives of our free software and of promoting the sharing 398 | and reuse of software generally. 399 | 400 | NO WARRANTY 401 | 402 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 403 | THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 404 | STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY 405 | "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 406 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 407 | FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE 408 | OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 409 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 410 | 411 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 412 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 413 | THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 414 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE 415 | OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA 416 | OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES 417 | OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH 418 | HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 419 | END OF TERMS AND CONDITIONS 420 | 421 | How to Apply These Terms to Your New Libraries 422 | 423 | If you develop a new library, and you want it to be of the greatest possible 424 | use to the public, we recommend making it free software that everyone can 425 | redistribute and change. You can do so by permitting redistribution under 426 | these terms (or, alternatively, under the terms of the ordinary General Public 427 | License). 428 | 429 | To apply these terms, attach the following notices to the library. It is safest 430 | to attach them to the start of each source file to most effectively convey 431 | the exclusion of warranty; and each file should have at least the "copyright" 432 | line and a pointer to where the full notice is found. 433 | 434 | 435 | 436 | Copyright (C) 437 | 438 | This library is free software; you can redistribute it and/or modify it under 439 | the terms of the GNU Lesser General Public License as published by the Free 440 | Software Foundation; either version 2.1 of the License, or (at your option) 441 | any later version. 442 | 443 | This library is distributed in the hope that it will be useful, but WITHOUT 444 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 445 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 446 | details. 447 | 448 | You should have received a copy of the GNU Lesser General Public License along 449 | with this library; if not, write to the Free Software Foundation, Inc., 51 450 | Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 451 | 452 | Also add information on how to contact you by electronic and paper mail. 453 | 454 | You should also get your employer (if you work as a programmer) or your school, 455 | if any, to sign a "copyright disclaimer" for the library, if necessary. Here 456 | is a sample; alter the names: 457 | 458 | Yoyodyne, Inc., hereby disclaims all copyright interest in 459 | 460 | the library `Frob' (a library for tweaking knobs) written 461 | 462 | by James Random Hacker. 463 | 464 | < signature of Ty Coon > , 1 April 1990 465 | 466 | Ty Coon, President of Vice 467 | 468 | That's all there is to it! 469 | -------------------------------------------------------------------------------- /Messages.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | gen_pot cxx:desktop:appdata fcitx5-hangul po . 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | fcitx-hangul 2 | ===== 3 | Hangul Wrapper for Fcitx. 4 | 5 | [![Jenkins Build Status](https://img.shields.io/jenkins/s/https/jenkins.fcitx-im.org/job/fcitx5-hangul.svg)](https://jenkins.fcitx-im.org/job/fcitx5-hangul/) 6 | 7 | [![Coverity Scan Status](https://img.shields.io/coverity/scan/14725.svg)](https://scan.coverity.com/projects/fcitx-fcitx5-hangul) 8 | 9 | ## Using with non-qwerty English system layout 10 | The addon handles key input based on its string value, not keycode, so pressing `t` in Colemak is interpreted as ㅅ rather than ㄹ for Dubeolsik. To fix this, set `Default` (qwerty) layout for Hangul. 11 | 12 | Via `fcitx5-configtool`: in `Input Method` tab, select Hangul, then press `Select Layout` and choose Layout: English (US), Variant: Default. 13 | Or edit profile config file: 14 | ``` 15 | # group and item numbers may be different 16 | [Groups/1/Items/0] 17 | Name=hangul 18 | Layout=us 19 | ``` 20 | -------------------------------------------------------------------------------- /data/16x16/apps/fcitx-hangul.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/16x16/apps/fcitx-hanja-active.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/16x16/apps/fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/16x16/apps/org.fcitx.Fcitx5.fcitx-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/16x16/apps/org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/16x16/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/16x16/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/16x16/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/16x16/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/22x22/apps/fcitx-hangul.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/22x22/apps/fcitx-hanja-active.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/22x22/apps/fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/22x22/apps/org.fcitx.Fcitx5.fcitx-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/22x22/apps/org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/22x22/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/22x22/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/22x22/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/22x22/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/24x24/apps/fcitx-hangul.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/24x24/apps/fcitx-hanja-active.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/24x24/apps/fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/24x24/apps/org.fcitx.Fcitx5.fcitx-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/24x24/apps/org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/24x24/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/24x24/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/24x24/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/24x24/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/48x48/apps/fcitx-hangul.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/48x48/apps/fcitx-hanja-active.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/48x48/apps/fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/48x48/apps/org.fcitx.Fcitx5.fcitx-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/48x48/apps/org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/48x48/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/48x48/apps/org.fcitx.Fcitx5.fcitx-hanja-active.png -------------------------------------------------------------------------------- /data/48x48/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/48x48/apps/org.fcitx.Fcitx5.fcitx-hanja-inactive.png -------------------------------------------------------------------------------- /data/64x64/apps/fcitx-hangul.png: -------------------------------------------------------------------------------- 1 | org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/64x64/apps/org.fcitx.Fcitx5.fcitx-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fcitx/fcitx5-hangul/561d1ce8e6b2e115c36a60a338d95d88351a1ae4/data/64x64/apps/org.fcitx.Fcitx5.fcitx-hangul.png -------------------------------------------------------------------------------- /data/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | install(FILES symbol.txt DESTINATION ${FCITX_INSTALL_PKGDATADIR}/hangul/ COMPONENT config) 2 | 3 | install(DIRECTORY 16x16 22x22 24x24 48x48 64x64 DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor" 4 | PATTERN .* EXCLUDE 5 | PATTERN *~ EXCLUDE) 6 | -------------------------------------------------------------------------------- /data/symbol.txt: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2005,2006 Choe Hwanjin 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # 7 | # 1. Redistributions of source code must retain the above copyright notice, 8 | # this list of conditions and the following disclaimer. 9 | # 2. Redistributions in binary form must reproduce the above copyright notice, 10 | # this list of conditions and the following disclaimer in the documentation 11 | # and/or other materials provided with the distribution. 12 | # 3. Neither the name of the author nor the names of its contributors 13 | # may be used to endorse or promote products derived from this software 14 | # without specific prior written permission. 15 | # 16 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 | # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 | # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 | # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 | # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 | # POSSIBILITY OF SUCH DAMAGE. 27 | 28 | ㄱ: : 29 | ㄱ:!: 30 | ㄱ:': 31 | ㄱ:,: 32 | ㄱ:.: 33 | ㄱ:/: 34 | ㄱ::: 35 | ㄱ:;: 36 | ㄱ:?: 37 | ㄱ:^: 38 | ㄱ:_: 39 | ㄱ:`: 40 | ㄱ:|: 41 | ㄱ: ̄: 42 | ㄱ:、: 43 | ㄱ:。: 44 | ㄱ:·: 45 | ㄱ:‥: 46 | ㄱ:…: 47 | ㄱ:¨: 48 | ㄱ:〃: 49 | ㄱ:­: 50 | ㄱ:―: 51 | ㄱ:∥: 52 | ㄱ:\: 53 | ㄱ:∼: 54 | ㄱ:´: 55 | ㄱ:~: 56 | ㄱ:ˇ: 57 | ㄱ:˘: 58 | ㄱ:˝: 59 | ㄱ:˚: 60 | ㄱ:˙: 61 | ㄱ:¸: 62 | ㄱ:˛: 63 | ㄱ:¡: 64 | ㄱ:¿: 65 | ㄱ:ː: 66 | ㄲ:Æ: 67 | ㄲ:Ð: 68 | ㄲ:Ħ: 69 | ㄲ:IJ: 70 | ㄲ:Ŀ: 71 | ㄲ:Ł: 72 | ㄲ:Ø: 73 | ㄲ:Œ: 74 | ㄲ:Þ: 75 | ㄲ:Ŧ: 76 | ㄲ:Ŋ: 77 | ㄲ:æ: 78 | ㄲ:đ: 79 | ㄲ:ð: 80 | ㄲ:ħ: 81 | ㄲ:ı: 82 | ㄲ:ij: 83 | ㄲ:ĸ: 84 | ㄲ:ŀ: 85 | ㄲ:ł: 86 | ㄲ:ø: 87 | ㄲ:œ: 88 | ㄲ:ß: 89 | ㄲ:þ: 90 | ㄲ:ŧ: 91 | ㄲ:ŋ: 92 | ㄲ:ʼn: 93 | ㄴ:": 94 | ㄴ:(: 95 | ㄴ:): 96 | ㄴ:[: 97 | ㄴ:]: 98 | ㄴ:{: 99 | ㄴ:}: 100 | ㄴ:‘: 101 | ㄴ:’: 102 | ㄴ:“: 103 | ㄴ:”: 104 | ㄴ:〔: 105 | ㄴ:〕: 106 | ㄴ:〈: 107 | ㄴ:〉: 108 | ㄴ:《: 109 | ㄴ:》: 110 | ㄴ:「: 111 | ㄴ:」: 112 | ㄴ:『: 113 | ㄴ:』: 114 | ㄴ:【: 115 | ㄴ:】: 116 | ㄷ:+: 117 | ㄷ:-: 118 | ㄷ:<: 119 | ㄷ:=: 120 | ㄷ:>: 121 | ㄷ:±: 122 | ㄷ:×: 123 | ㄷ:÷: 124 | ㄷ:≠: 125 | ㄷ:≤: 126 | ㄷ:≥: 127 | ㄷ:∞: 128 | ㄷ:∴: 129 | ㄷ:♂: 130 | ㄷ:♀: 131 | ㄷ:∠: 132 | ㄷ:⊥: 133 | ㄷ:⌒: 134 | ㄷ:∂: 135 | ㄷ:∇: 136 | ㄷ:≡: 137 | ㄷ:≒: 138 | ㄷ:≪: 139 | ㄷ:≫: 140 | ㄷ:√: 141 | ㄷ:∽: 142 | ㄷ:∝: 143 | ㄷ:∵: 144 | ㄷ:∫: 145 | ㄷ:∬: 146 | ㄷ:∈: 147 | ㄷ:∋: 148 | ㄷ:⊆: 149 | ㄷ:⊇: 150 | ㄷ:⊂: 151 | ㄷ:⊃: 152 | ㄷ:∪: 153 | ㄷ:∩: 154 | ㄷ:∧: 155 | ㄷ:∨: 156 | ㄷ:¬: 157 | ㄷ:⇒: 158 | ㄷ:⇔: 159 | ㄷ:∀: 160 | ㄷ:∃: 161 | ㄷ:∮: 162 | ㄷ:∑: 163 | ㄷ:∏: 164 | ㄸ:ぁ: 165 | ㄸ:あ: 166 | ㄸ:ぃ: 167 | ㄸ:い: 168 | ㄸ:ぅ: 169 | ㄸ:う: 170 | ㄸ:ぇ: 171 | ㄸ:え: 172 | ㄸ:ぉ: 173 | ㄸ:お: 174 | ㄸ:か: 175 | ㄸ:が: 176 | ㄸ:き: 177 | ㄸ:ぎ: 178 | ㄸ:く: 179 | ㄸ:ぐ: 180 | ㄸ:け: 181 | ㄸ:げ: 182 | ㄸ:こ: 183 | ㄸ:ご: 184 | ㄸ:さ: 185 | ㄸ:ざ: 186 | ㄸ:し: 187 | ㄸ:じ: 188 | ㄸ:す: 189 | ㄸ:ず: 190 | ㄸ:せ: 191 | ㄸ:ぜ: 192 | ㄸ:そ: 193 | ㄸ:ぞ: 194 | ㄸ:た: 195 | ㄸ:だ: 196 | ㄸ:ち: 197 | ㄸ:ぢ: 198 | ㄸ:っ: 199 | ㄸ:つ: 200 | ㄸ:づ: 201 | ㄸ:て: 202 | ㄸ:で: 203 | ㄸ:と: 204 | ㄸ:ど: 205 | ㄸ:な: 206 | ㄸ:に: 207 | ㄸ:ぬ: 208 | ㄸ:ね: 209 | ㄸ:の: 210 | ㄸ:は: 211 | ㄸ:ば: 212 | ㄸ:ぱ: 213 | ㄸ:ひ: 214 | ㄸ:び: 215 | ㄸ:ぴ: 216 | ㄸ:ふ: 217 | ㄸ:ぶ: 218 | ㄸ:ぷ: 219 | ㄸ:へ: 220 | ㄸ:べ: 221 | ㄸ:ぺ: 222 | ㄸ:ほ: 223 | ㄸ:ぼ: 224 | ㄸ:ぽ: 225 | ㄸ:ま: 226 | ㄸ:み: 227 | ㄸ:む: 228 | ㄸ:め: 229 | ㄸ:も: 230 | ㄸ:ゃ: 231 | ㄸ:や: 232 | ㄸ:ゅ: 233 | ㄸ:ゆ: 234 | ㄸ:ょ: 235 | ㄸ:よ: 236 | ㄸ:ら: 237 | ㄸ:り: 238 | ㄸ:る: 239 | ㄸ:れ: 240 | ㄸ:ろ: 241 | ㄸ:ゎ: 242 | ㄸ:わ: 243 | ㄸ:ゐ: 244 | ㄸ:ゑ: 245 | ㄸ:を: 246 | ㄸ:ん: 247 | ㄹ:$: 248 | ㄹ:%: 249 | ㄹ:₩: 250 | ㄹ:F: 251 | ㄹ:′: 252 | ㄹ:″: 253 | ㄹ:℃: 254 | ㄹ:Å: 255 | ㄹ:¢: 256 | ㄹ:£: 257 | ㄹ:¥: 258 | ㄹ:¤: 259 | ㄹ:℉: 260 | ㄹ:‰: 261 | ㄹ:?: 262 | ㄹ:㎕: 263 | ㄹ:㎖: 264 | ㄹ:㎗: 265 | ㄹ:㎘: 266 | ㄹ:㏄: 267 | ㄹ:㎣: 268 | ㄹ:㎤: 269 | ㄹ:㎥: 270 | ㄹ:㎦: 271 | ㄹ:㎙: 272 | ㄹ:㎚: 273 | ㄹ:㎛: 274 | ㄹ:㎜: 275 | ㄹ:㎝: 276 | ㄹ:㎞: 277 | ㄹ:㎟: 278 | ㄹ:㎠: 279 | ㄹ:㎡: 280 | ㄹ:㎢: 281 | ㄹ:㏊: 282 | ㄹ:㎍: 283 | ㄹ:㎎: 284 | ㄹ:㎏: 285 | ㄹ:㏏: 286 | ㄹ:㎈: 287 | ㄹ:㎉: 288 | ㄹ:㏈: 289 | ㄹ:㎧: 290 | ㄹ:㎨: 291 | ㄹ:㎰: 292 | ㄹ:㎱: 293 | ㄹ:㎲: 294 | ㄹ:㎳: 295 | ㄹ:㎴: 296 | ㄹ:㎵: 297 | ㄹ:㎶: 298 | ㄹ:㎷: 299 | ㄹ:㎸: 300 | ㄹ:㎹: 301 | ㄹ:㎀: 302 | ㄹ:㎁: 303 | ㄹ:㎂: 304 | ㄹ:㎃: 305 | ㄹ:㎄: 306 | ㄹ:㎺: 307 | ㄹ:㎻: 308 | ㄹ:㎼: 309 | ㄹ:㎽: 310 | ㄹ:㎾: 311 | ㄹ:㎿: 312 | ㄹ:㎐: 313 | ㄹ:㎑: 314 | ㄹ:㎒: 315 | ㄹ:㎓: 316 | ㄹ:㎔: 317 | ㄹ:Ω: 318 | ㄹ:㏀: 319 | ㄹ:㏁: 320 | ㄹ:㎊: 321 | ㄹ:㎋: 322 | ㄹ:㎌: 323 | ㄹ:㏖: 324 | ㄹ:㏅: 325 | ㄹ:㎭: 326 | ㄹ:㎮: 327 | ㄹ:㎯: 328 | ㄹ:㏛: 329 | ㄹ:㎩: 330 | ㄹ:㎪: 331 | ㄹ:㎫: 332 | ㄹ:㎬: 333 | ㄹ:㏝: 334 | ㄹ:㏐: 335 | ㄹ:㏓: 336 | ㄹ:㏃: 337 | ㄹ:㏉: 338 | ㄹ:㏜: 339 | ㄹ:㏆: 340 | ㅁ:#: 341 | ㅁ:&: 342 | ㅁ:*: 343 | ㅁ:@: 344 | ㅁ:§: 345 | ㅁ:※: 346 | ㅁ:☆: 347 | ㅁ:★: 348 | ㅁ:○: 349 | ㅁ:●: 350 | ㅁ:◎: 351 | ㅁ:◇: 352 | ㅁ:◆: 353 | ㅁ:□: 354 | ㅁ:■: 355 | ㅁ:△: 356 | ㅁ:▲: 357 | ㅁ:▽: 358 | ㅁ:▼: 359 | ㅁ:→: 360 | ㅁ:←: 361 | ㅁ:↑: 362 | ㅁ:↓: 363 | ㅁ:↔: 364 | ㅁ:〓: 365 | ㅁ:▷: 366 | ㅁ:◀: 367 | ㅁ:▷: 368 | ㅁ:▶: 369 | ㅁ:♤: 370 | ㅁ:♠: 371 | ㅁ:♡: 372 | ㅁ:♥: 373 | ㅁ:♧: 374 | ㅁ:⊙: 375 | ㅁ:◈: 376 | ㅁ:▣: 377 | ㅁ:◐: 378 | ㅁ:◑: 379 | ㅁ:▒: 380 | ㅁ:▤: 381 | ㅁ:▥: 382 | ㅁ:▨: 383 | ㅁ:▧: 384 | ㅁ:▦: 385 | ㅁ:▩: 386 | ㅁ:♨: 387 | ㅁ:☏: 388 | ㅁ:☎: 389 | ㅁ:☜: 390 | ㅁ:☞: 391 | ㅁ:¶: 392 | ㅁ:†: 393 | ㅁ:‡: 394 | ㅁ:↕: 395 | ㅁ:↗: 396 | ㅁ:↙: 397 | ㅁ:↖: 398 | ㅁ:↘: 399 | ㅁ:♭: 400 | ㅁ:♩: 401 | ㅁ:♪: 402 | ㅁ:♬: 403 | ㅁ:㉿: 404 | ㅁ:㈜: 405 | ㅁ:№: 406 | ㅁ:㏇: 407 | ㅁ:™: 408 | ㅁ:㏂: 409 | ㅁ:㏘: 410 | ㅁ:℡: 411 | ㅁ:?: 412 | ㅁ:ª: 413 | ㅁ:º: 414 | ㅂ:─: 415 | ㅂ:│: 416 | ㅂ:┌: 417 | ㅂ:┐: 418 | ㅂ:┘: 419 | ㅂ:└: 420 | ㅂ:├: 421 | ㅂ:┬: 422 | ㅂ:┤: 423 | ㅂ:┴: 424 | ㅂ:┼: 425 | ㅂ:━: 426 | ㅂ:┃: 427 | ㅂ:┏: 428 | ㅂ:┓: 429 | ㅂ:┛: 430 | ㅂ:┗: 431 | ㅂ:┣: 432 | ㅂ:┳: 433 | ㅂ:┫: 434 | ㅂ:┻: 435 | ㅂ:╋: 436 | ㅂ:┠: 437 | ㅂ:┯: 438 | ㅂ:┨: 439 | ㅂ:┷: 440 | ㅂ:┿: 441 | ㅂ:┝: 442 | ㅂ:┰: 443 | ㅂ:┥: 444 | ㅂ:┸: 445 | ㅂ:╂: 446 | ㅂ:┒: 447 | ㅂ:┑: 448 | ㅂ:┚: 449 | ㅂ:┙: 450 | ㅂ:┖: 451 | ㅂ:┕: 452 | ㅂ:┎: 453 | ㅂ:┍: 454 | ㅂ:┞: 455 | ㅂ:┟: 456 | ㅂ:┡: 457 | ㅂ:┢: 458 | ㅂ:┦: 459 | ㅂ:┧: 460 | ㅂ:┩: 461 | ㅂ:┪: 462 | ㅂ:┭: 463 | ㅂ:┮: 464 | ㅂ:┲: 465 | ㅂ:┵: 466 | ㅂ:┶: 467 | ㅂ:┹: 468 | ㅂ:┺: 469 | ㅂ:┽: 470 | ㅂ:┾: 471 | ㅂ:╀: 472 | ㅂ:╁: 473 | ㅂ:╃: 474 | ㅂ:╄: 475 | ㅂ:╅: 476 | ㅂ:╆: 477 | ㅂ:╇: 478 | ㅂ:╈: 479 | ㅂ:╉: 480 | ㅂ:╊: 481 | ㅃ:ァ: 482 | ㅃ:ア: 483 | ㅃ:ィ: 484 | ㅃ:イ: 485 | ㅃ:ゥ: 486 | ㅃ:ウ: 487 | ㅃ:ェ: 488 | ㅃ:エ: 489 | ㅃ:ォ: 490 | ㅃ:オ: 491 | ㅃ:カ: 492 | ㅃ:ガ: 493 | ㅃ:キ: 494 | ㅃ:ギ: 495 | ㅃ:ク: 496 | ㅃ:グ: 497 | ㅃ:ケ: 498 | ㅃ:ゲ: 499 | ㅃ:コ: 500 | ㅃ:ゴ: 501 | ㅃ:サ: 502 | ㅃ:ザ: 503 | ㅃ:シ: 504 | ㅃ:ジ: 505 | ㅃ:ス: 506 | ㅃ:ズ: 507 | ㅃ:セ: 508 | ㅃ:ゼ: 509 | ㅃ:ソ: 510 | ㅃ:ゾ: 511 | ㅃ:タ: 512 | ㅃ:ダ: 513 | ㅃ:チ: 514 | ㅃ:ヂ: 515 | ㅃ:ッ: 516 | ㅃ:ツ: 517 | ㅃ:ヅ: 518 | ㅃ:テ: 519 | ㅃ:デ: 520 | ㅃ:ト: 521 | ㅃ:ド: 522 | ㅃ:ナ: 523 | ㅃ:ニ: 524 | ㅃ:ヌ: 525 | ㅃ:ネ: 526 | ㅃ:ノ: 527 | ㅃ:ハ: 528 | ㅃ:バ: 529 | ㅃ:パ: 530 | ㅃ:ヒ: 531 | ㅃ:ビ: 532 | ㅃ:ピ: 533 | ㅃ:フ: 534 | ㅃ:ブ: 535 | ㅃ:プ: 536 | ㅃ:ヘ: 537 | ㅃ:ベ: 538 | ㅃ:ペ: 539 | ㅃ:ホ: 540 | ㅃ:ボ: 541 | ㅃ:ポ: 542 | ㅃ:マ: 543 | ㅃ:ミ: 544 | ㅃ:ム: 545 | ㅃ:メ: 546 | ㅃ:モ: 547 | ㅃ:ャ: 548 | ㅃ:ヤ: 549 | ㅃ:ュ: 550 | ㅃ:ユ: 551 | ㅃ:ョ: 552 | ㅃ:ヨ: 553 | ㅃ:ラ: 554 | ㅃ:リ: 555 | ㅃ:ル: 556 | ㅃ:レ: 557 | ㅃ:ロ: 558 | ㅃ:ヮ: 559 | ㅃ:ワ: 560 | ㅃ:ヰ: 561 | ㅃ:ヱ: 562 | ㅃ:ヲ: 563 | ㅃ:ン: 564 | ㅃ:ヴ: 565 | ㅃ:ヵ: 566 | ㅃ:ヶ: 567 | ㅅ:㉠: 568 | ㅅ:㉡: 569 | ㅅ:㉢: 570 | ㅅ:㉣: 571 | ㅅ:㉤: 572 | ㅅ:㉥: 573 | ㅅ:㉦: 574 | ㅅ:㉧: 575 | ㅅ:㉨: 576 | ㅅ:㉩: 577 | ㅅ:㉪: 578 | ㅅ:㉫: 579 | ㅅ:㉬: 580 | ㅅ:㉭: 581 | ㅅ:㉮: 582 | ㅅ:㉯: 583 | ㅅ:㉰: 584 | ㅅ:㉱: 585 | ㅅ:㉲: 586 | ㅅ:㉳: 587 | ㅅ:㉴: 588 | ㅅ:㉵: 589 | ㅅ:㉶: 590 | ㅅ:㉷: 591 | ㅅ:㉸: 592 | ㅅ:㉹: 593 | ㅅ:㉺: 594 | ㅅ:㉻: 595 | ㅅ:㈀: 596 | ㅅ:㈁: 597 | ㅅ:㈂: 598 | ㅅ:㈃: 599 | ㅅ:㈄: 600 | ㅅ:㈅: 601 | ㅅ:㈆: 602 | ㅅ:㈇: 603 | ㅅ:㈈: 604 | ㅅ:㈉: 605 | ㅅ:㈊: 606 | ㅅ:㈋: 607 | ㅅ:㈌: 608 | ㅅ:㈍: 609 | ㅅ:㈎: 610 | ㅅ:㈏: 611 | ㅅ:㈐: 612 | ㅅ:㈑: 613 | ㅅ:㈒: 614 | ㅅ:㈓: 615 | ㅅ:㈔: 616 | ㅅ:㈕: 617 | ㅅ:㈖: 618 | ㅅ:㈗: 619 | ㅅ:㈘: 620 | ㅅ:㈙: 621 | ㅅ:㈚: 622 | ㅅ:㈛: 623 | ㅆ:А: 624 | ㅆ:Б: 625 | ㅆ:В: 626 | ㅆ:Г: 627 | ㅆ:Д: 628 | ㅆ:Е: 629 | ㅆ:Ё: 630 | ㅆ:Ж: 631 | ㅆ:З: 632 | ㅆ:И: 633 | ㅆ:Й: 634 | ㅆ:К: 635 | ㅆ:Л: 636 | ㅆ:М: 637 | ㅆ:Н: 638 | ㅆ:О: 639 | ㅆ:П: 640 | ㅆ:Р: 641 | ㅆ:С: 642 | ㅆ:Т: 643 | ㅆ:У: 644 | ㅆ:Ф: 645 | ㅆ:Х: 646 | ㅆ:Ц: 647 | ㅆ:Ч: 648 | ㅆ:Ш: 649 | ㅆ:Щ: 650 | ㅆ:Ъ: 651 | ㅆ:Ы: 652 | ㅆ:Ь: 653 | ㅆ:Э: 654 | ㅆ:Ю: 655 | ㅆ:Я: 656 | ㅆ:а: 657 | ㅆ:б: 658 | ㅆ:в: 659 | ㅆ:г: 660 | ㅆ:д: 661 | ㅆ:е: 662 | ㅆ:ё: 663 | ㅆ:ж: 664 | ㅆ:з: 665 | ㅆ:и: 666 | ㅆ:й: 667 | ㅆ:к: 668 | ㅆ:л: 669 | ㅆ:м: 670 | ㅆ:н: 671 | ㅆ:о: 672 | ㅆ:п: 673 | ㅆ:р: 674 | ㅆ:с: 675 | ㅆ:т: 676 | ㅆ:у: 677 | ㅆ:ф: 678 | ㅆ:х: 679 | ㅆ:ц: 680 | ㅆ:ч: 681 | ㅆ:ш: 682 | ㅆ:щ: 683 | ㅆ:ъ: 684 | ㅆ:ы: 685 | ㅆ:ь: 686 | ㅆ:э: 687 | ㅆ:ю: 688 | ㅆ:я: 689 | ㅇ:ⓐ: 690 | ㅇ:ⓑ: 691 | ㅇ:ⓒ: 692 | ㅇ:ⓓ: 693 | ㅇ:ⓔ: 694 | ㅇ:ⓕ: 695 | ㅇ:ⓖ: 696 | ㅇ:ⓗ: 697 | ㅇ:ⓘ: 698 | ㅇ:ⓙ: 699 | ㅇ:ⓚ: 700 | ㅇ:ⓛ: 701 | ㅇ:ⓜ: 702 | ㅇ:ⓝ: 703 | ㅇ:ⓞ: 704 | ㅇ:ⓟ: 705 | ㅇ:ⓠ: 706 | ㅇ:ⓡ: 707 | ㅇ:ⓢ: 708 | ㅇ:ⓣ: 709 | ㅇ:ⓤ: 710 | ㅇ:ⓥ: 711 | ㅇ:ⓦ: 712 | ㅇ:ⓧ: 713 | ㅇ:ⓨ: 714 | ㅇ:ⓩ: 715 | ㅇ:①: 716 | ㅇ:②: 717 | ㅇ:③: 718 | ㅇ:④: 719 | ㅇ:⑤: 720 | ㅇ:⑥: 721 | ㅇ:⑦: 722 | ㅇ:⑧: 723 | ㅇ:⑨: 724 | ㅇ:⑩: 725 | ㅇ:⑪: 726 | ㅇ:⑫: 727 | ㅇ:⑬: 728 | ㅇ:⑭: 729 | ㅇ:⑮: 730 | ㅇ:⒜: 731 | ㅇ:⒝: 732 | ㅇ:⒞: 733 | ㅇ:⒟: 734 | ㅇ:⒠: 735 | ㅇ:⒡: 736 | ㅇ:⒢: 737 | ㅇ:⒣: 738 | ㅇ:⒤: 739 | ㅇ:⒥: 740 | ㅇ:⒦: 741 | ㅇ:⒧: 742 | ㅇ:⒨: 743 | ㅇ:⒩: 744 | ㅇ:⒪: 745 | ㅇ:⒫: 746 | ㅇ:⒬: 747 | ㅇ:⒭: 748 | ㅇ:⒮: 749 | ㅇ:⒯: 750 | ㅇ:⒰: 751 | ㅇ:⒱: 752 | ㅇ:⒲: 753 | ㅇ:⒳: 754 | ㅇ:⒴: 755 | ㅇ:⒵: 756 | ㅇ:⑴: 757 | ㅇ:⑵: 758 | ㅇ:⑶: 759 | ㅇ:⑷: 760 | ㅇ:⑸: 761 | ㅇ:⑹: 762 | ㅇ:⑺: 763 | ㅇ:⑻: 764 | ㅇ:⑼: 765 | ㅇ:⑽: 766 | ㅇ:⑾: 767 | ㅇ:⑿: 768 | ㅇ:⒀: 769 | ㅇ:⒁: 770 | ㅇ:⒂: 771 | ㅈ:0: 772 | ㅈ:1: 773 | ㅈ:2: 774 | ㅈ:3: 775 | ㅈ:4: 776 | ㅈ:5: 777 | ㅈ:6: 778 | ㅈ:7: 779 | ㅈ:8: 780 | ㅈ:9: 781 | ㅈ:ⅰ: 782 | ㅈ:ⅱ: 783 | ㅈ:ⅲ: 784 | ㅈ:ⅳ: 785 | ㅈ:ⅴ: 786 | ㅈ:ⅵ: 787 | ㅈ:ⅶ: 788 | ㅈ:ⅷ: 789 | ㅈ:ⅸ: 790 | ㅈ:ⅹ: 791 | ㅈ:Ⅰ: 792 | ㅈ:Ⅱ: 793 | ㅈ:Ⅲ: 794 | ㅈ:Ⅳ: 795 | ㅈ:Ⅴ: 796 | ㅈ:Ⅵ: 797 | ㅈ:Ⅶ: 798 | ㅈ:Ⅷ: 799 | ㅈ:Ⅸ: 800 | ㅈ:Ⅹ: 801 | ㅊ:½: 802 | ㅊ:⅓: 803 | ㅊ:⅔: 804 | ㅊ:¼: 805 | ㅊ:¾: 806 | ㅊ:⅛: 807 | ㅊ:⅜: 808 | ㅊ:⅝: 809 | ㅊ:⅞: 810 | ㅊ:¹: 811 | ㅊ:²: 812 | ㅊ:³: 813 | ㅊ:⁴: 814 | ㅊ:ⁿ: 815 | ㅊ:₁: 816 | ㅊ:₂: 817 | ㅊ:₃: 818 | ㅊ:₄: 819 | ㅋ:ㄱ: 820 | ㅋ:ㄲ: 821 | ㅋ:ㄳ: 822 | ㅋ:ㄴ: 823 | ㅋ:ㄵ: 824 | ㅋ:ㄶ: 825 | ㅋ:ㄷ: 826 | ㅋ:ㄸ: 827 | ㅋ:ㄹ: 828 | ㅋ:ㄺ: 829 | ㅋ:ㄻ: 830 | ㅋ:ㄼ: 831 | ㅋ:ㄽ: 832 | ㅋ:ㄾ: 833 | ㅋ:ㄿ: 834 | ㅋ:ㅀ: 835 | ㅋ:ㅁ: 836 | ㅋ:ㅂ: 837 | ㅋ:ㅃ: 838 | ㅋ:ㅄ: 839 | ㅋ:ㅅ: 840 | ㅋ:ㅆ: 841 | ㅋ:ㅇ: 842 | ㅋ:ㅈ: 843 | ㅋ:ㅉ: 844 | ㅋ:ㅊ: 845 | ㅋ:ㅋ: 846 | ㅋ:ㅌ: 847 | ㅋ:ㅍ: 848 | ㅋ:ㅎ: 849 | ㅋ:ㅏ: 850 | ㅋ:ㅐ: 851 | ㅋ:ㅑ: 852 | ㅋ:ㅒ: 853 | ㅋ:ㅓ: 854 | ㅋ:ㅔ: 855 | ㅋ:ㅕ: 856 | ㅋ:ㅖ: 857 | ㅋ:ㅗ: 858 | ㅋ:ㅘ: 859 | ㅋ:ㅙ: 860 | ㅋ:ㅚ: 861 | ㅋ:ㅛ: 862 | ㅋ:ㅜ: 863 | ㅋ:ㅝ: 864 | ㅋ:ㅞ: 865 | ㅋ:ㅟ: 866 | ㅋ:ㅠ: 867 | ㅋ:ㅡ: 868 | ㅋ:ㅢ: 869 | ㅋ:ㅣ: 870 | ㅌ:ㅥ: 871 | ㅌ:ㅦ: 872 | ㅌ:ㅧ: 873 | ㅌ:ㅨ: 874 | ㅌ:ㅩ: 875 | ㅌ:ㅪ: 876 | ㅌ:ㅫ: 877 | ㅌ:ㅬ: 878 | ㅌ:ㅭ: 879 | ㅌ:ㅮ: 880 | ㅌ:ㅯ: 881 | ㅌ:ㅰ: 882 | ㅌ:ㅱ: 883 | ㅌ:ㅲ: 884 | ㅌ:ㅳ: 885 | ㅌ:ㅴ: 886 | ㅌ:ㅵ: 887 | ㅌ:ㅶ: 888 | ㅌ:ㅷ: 889 | ㅌ:ㅸ: 890 | ㅌ:ㅹ: 891 | ㅌ:ㅺ: 892 | ㅌ:ㆄ: 893 | ㅌ:ㅼ: 894 | ㅌ:ㅽ: 895 | ㅌ:ㅾ: 896 | ㅌ:ㅿ: 897 | ㅌ:ㆀ: 898 | ㅌ:ㆁ: 899 | ㅌ:ㆂ: 900 | ㅌ:ㆃ: 901 | ㅌ:ㆄ: 902 | ㅌ:ㆅ: 903 | ㅌ:ㆆ: 904 | ㅌ:ㆇ: 905 | ㅌ:ㆈ: 906 | ㅌ:ㆉ: 907 | ㅌ:ㆊ: 908 | ㅌ:ㆋ: 909 | ㅌ:ㆌ: 910 | ㅌ:ㆍ: 911 | ㅌ:ㆎ: 912 | ㅍ:A: 913 | ㅍ:B: 914 | ㅍ:C: 915 | ㅍ:D: 916 | ㅍ:E: 917 | ㅍ:F: 918 | ㅍ:G: 919 | ㅍ:H: 920 | ㅍ:I: 921 | ㅍ:J: 922 | ㅍ:K: 923 | ㅍ:L: 924 | ㅍ:M: 925 | ㅍ:N: 926 | ㅍ:O: 927 | ㅍ:P: 928 | ㅍ:Q: 929 | ㅍ:R: 930 | ㅍ:S: 931 | ㅍ:T: 932 | ㅍ:U: 933 | ㅍ:V: 934 | ㅍ:W: 935 | ㅍ:X: 936 | ㅍ:Y: 937 | ㅍ:Z: 938 | ㅍ:a: 939 | ㅍ:b: 940 | ㅍ:c: 941 | ㅍ:d: 942 | ㅍ:e: 943 | ㅍ:f: 944 | ㅍ:g: 945 | ㅍ:h: 946 | ㅍ:i: 947 | ㅍ:j: 948 | ㅍ:k: 949 | ㅍ:l: 950 | ㅍ:m: 951 | ㅍ:n: 952 | ㅍ:o: 953 | ㅍ:p: 954 | ㅍ:q: 955 | ㅍ:r: 956 | ㅍ:s: 957 | ㅍ:t: 958 | ㅍ:u: 959 | ㅍ:v: 960 | ㅍ:w: 961 | ㅍ:x: 962 | ㅍ:y: 963 | ㅍ:z: 964 | ㅎ:Α: 965 | ㅎ:Β: 966 | ㅎ:Γ: 967 | ㅎ:Δ: 968 | ㅎ:Ε: 969 | ㅎ:Ζ: 970 | ㅎ:Η: 971 | ㅎ:Θ: 972 | ㅎ:Ι: 973 | ㅎ:Κ: 974 | ㅎ:Λ: 975 | ㅎ:Μ: 976 | ㅎ:Ν: 977 | ㅎ:Ξ: 978 | ㅎ:Ο: 979 | ㅎ:Π: 980 | ㅎ:Ρ: 981 | ㅎ:Σ: 982 | ㅎ:Τ: 983 | ㅎ:Υ: 984 | ㅎ:Φ: 985 | ㅎ:Χ: 986 | ㅎ:Ψ: 987 | ㅎ:Ω: 988 | ㅎ:α: 989 | ㅎ:β: 990 | ㅎ:γ: 991 | ㅎ:δ: 992 | ㅎ:ε: 993 | ㅎ:ζ: 994 | ㅎ:η: 995 | ㅎ:θ: 996 | ㅎ:ι: 997 | ㅎ:κ: 998 | ㅎ:λ: 999 | ㅎ:μ: 1000 | ㅎ:ν: 1001 | ㅎ:ξ: 1002 | ㅎ:ο: 1003 | ㅎ:π: 1004 | ㅎ:ρ: 1005 | ㅎ:σ: 1006 | ㅎ:τ: 1007 | ㅎ:υ: 1008 | ㅎ:φ: 1009 | ㅎ:χ: 1010 | ㅎ:ψ: 1011 | ㅎ:ω: 1012 | -------------------------------------------------------------------------------- /list/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(gen_list gen_list.c) 2 | target_link_libraries (gen_list ${HANGUL_TARGET}) 3 | -------------------------------------------------------------------------------- /list/gen_list.c: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010~2021 CSSlayer 3 | * 4 | * SPDX-License-Identifier: LGPL-2.1-or-later 5 | * 6 | */ 7 | #include 8 | #include 9 | 10 | int main() { 11 | unsigned int nkeyboard = hangul_ic_get_n_keyboards(), i; 12 | for (i = 0; i < nkeyboard; i++) 13 | printf("\"%s\" \"%s\"\n", hangul_ic_get_keyboard_name(i), 14 | hangul_ic_get_keyboard_id(i)); 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.fcitx.Fcitx5.Addon.Hangul 4 | org.fcitx.Fcitx5 5 | CC0-1.0 6 | LGPL-2.1+ 7 | Hangul for Fcitx 5 8 | Hangul engine for Fcitx 5 9 | 10 | The Fcitx Team 11 | 12 | https://fcitx-im.org 13 | https://github.com/fcitx/fcitx5-hangul/issues 14 | https://github.com/fcitx/fcitx5-hangul 15 | Fcitx 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /po/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | fcitx5_install_translation(fcitx5-hangul) 2 | -------------------------------------------------------------------------------- /po/LINGUAS: -------------------------------------------------------------------------------- 1 | 2 | ca 3 | da 4 | de 5 | he 6 | ja 7 | ko 8 | ru 9 | tr 10 | vi 11 | zh_CN 12 | zh_TW 13 | -------------------------------------------------------------------------------- /po/ca.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: fcitx5-hangul\n" 11 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 12 | "POT-Creation-Date: 2020-11-02 15:55-0800\n" 13 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 14 | "Last-Translator: csslayer , 2017\n" 15 | "Language-Team: Catalan (https://www.transifex.com/fcitx/teams/12005/ca/)\n" 16 | "Language: ca\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | 22 | #: src/engine.h:40 23 | msgid "Ahnmatae" 24 | msgstr "Ahnmatae" 25 | 26 | #: src/engine.h:76 27 | msgid "Auto Reorder" 28 | msgstr "Reordenament automàtic" 29 | 30 | #: src/engine.h:35 31 | msgid "Dubeolsik" 32 | msgstr "Dubeolsik" 33 | 34 | #: src/engine.h:36 35 | msgid "Dubeolsik Yetgeul" 36 | msgstr "Dubeolsik yetgeul" 37 | 38 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in:3 39 | msgid "Hangul" 40 | msgstr "Hangul" 41 | 42 | #: src/hangul-addon.conf.in:4 43 | msgid "Hangul Wrapper For Fcitx" 44 | msgstr "Contenidor hangul per al fcitx" 45 | 46 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:8 47 | msgid "Hangul engine for Fcitx 5" 48 | msgstr "" 49 | 50 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:7 51 | msgid "Hangul for Fcitx 5" 52 | msgstr "" 53 | 54 | #: src/engine.h:78 55 | msgid "Hanja Mode" 56 | msgstr "Mode hanja" 57 | 58 | #: src/engine.h:49 59 | msgid "Hanja Mode Toggle Key" 60 | msgstr "Tecla de commutació de mode hanja" 61 | 62 | #: src/engine.h:45 63 | msgid "Keyboard Layout" 64 | msgstr "Disposició de teclat" 65 | 66 | #: src/engine.h:73 67 | msgid "Next Candidate" 68 | msgstr "" 69 | 70 | #: src/engine.h:61 71 | msgid "Next Page" 72 | msgstr "" 73 | 74 | #: src/engine.h:67 75 | msgid "Prev Candidate" 76 | msgstr "" 77 | 78 | #: src/engine.h:55 79 | msgid "Prev Page" 80 | msgstr "" 81 | 82 | #: src/engine.h:39 83 | msgid "Romaja" 84 | msgstr "Romaja" 85 | 86 | #: src/engine.h:36 87 | msgid "Sebeolsik 390" 88 | msgstr "Sebeolsik 390" 89 | 90 | #: src/engine.h:39 91 | msgid "Sebeolsik Dubeol Layout" 92 | msgstr "Disposició sebeolsik dubeol" 93 | 94 | #: src/engine.h:37 95 | msgid "Sebeolsik Final" 96 | msgstr "Sebeolsik final" 97 | 98 | #: src/engine.h:37 99 | msgid "Sebeolsik Noshift" 100 | msgstr "Sebeolsik sense desplaçament" 101 | 102 | #: src/engine.h:38 103 | msgid "Sebeolsik Yetgeul" 104 | msgstr "Sebeolsik yetgeul" 105 | 106 | #: src/engine.h:122 107 | msgid "Use Hangul" 108 | msgstr "Usa hangul" 109 | 110 | #: src/engine.h:121 111 | msgid "Use Hanja" 112 | msgstr "Usa hanja" 113 | 114 | #: src/engine.h:77 115 | msgid "Word Commit" 116 | msgstr "Enviament de paraula" 117 | -------------------------------------------------------------------------------- /po/da.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # scootergrisen, 2020 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: fcitx5-hangul\n" 11 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 12 | "POT-Creation-Date: 2020-11-03 00:02-0800\n" 13 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 14 | "Last-Translator: scootergrisen, 2020\n" 15 | "Language-Team: Danish (https://www.transifex.com/fcitx/teams/12005/da/)\n" 16 | "Language: da\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | 22 | #: src/engine.h:40 23 | msgid "Ahnmatae" 24 | msgstr "Ahnmatae" 25 | 26 | #: src/engine.h:76 27 | msgid "Auto Reorder" 28 | msgstr "Automatisk genplacering" 29 | 30 | #: src/engine.h:35 31 | msgid "Dubeolsik" 32 | msgstr "Dubeolsik" 33 | 34 | #: src/engine.h:36 35 | msgid "Dubeolsik Yetgeul" 36 | msgstr "Dubeolsik Yetgeul" 37 | 38 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in:3 39 | msgid "Hangul" 40 | msgstr "Hangul" 41 | 42 | #: src/hangul-addon.conf.in:4 43 | msgid "Hangul Wrapper For Fcitx" 44 | msgstr "Hangul-wrapper til Fcitx" 45 | 46 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:8 47 | msgid "Hangul engine for Fcitx 5" 48 | msgstr "Hangul-motor til Fcitx 5" 49 | 50 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:7 51 | msgid "Hangul for Fcitx 5" 52 | msgstr "Hangul til Fcitx 5" 53 | 54 | #: src/engine.h:78 55 | msgid "Hanja Mode" 56 | msgstr "Hanja-tilstand" 57 | 58 | #: src/engine.h:49 59 | msgid "Hanja Mode Toggle Key" 60 | msgstr "Tast til at skifte Hanja-tilstand" 61 | 62 | #: src/engine.h:45 63 | msgid "Keyboard Layout" 64 | msgstr "Tastaturlayout" 65 | 66 | #: src/engine.h:73 67 | msgid "Next Candidate" 68 | msgstr "Næste kandidat" 69 | 70 | #: src/engine.h:61 71 | msgid "Next Page" 72 | msgstr "Næste side" 73 | 74 | #: src/engine.h:67 75 | msgid "Prev Candidate" 76 | msgstr "Forrige kandidat" 77 | 78 | #: src/engine.h:55 79 | msgid "Prev Page" 80 | msgstr "Forrige side" 81 | 82 | #: src/engine.h:39 83 | msgid "Romaja" 84 | msgstr "Romaja" 85 | 86 | #: src/engine.h:36 87 | msgid "Sebeolsik 390" 88 | msgstr "Sebeolsik 390" 89 | 90 | #: src/engine.h:39 91 | msgid "Sebeolsik Dubeol Layout" 92 | msgstr "Sebeolsik Dubeol-layout" 93 | 94 | #: src/engine.h:37 95 | msgid "Sebeolsik Final" 96 | msgstr "Sebeolsik Final" 97 | 98 | #: src/engine.h:37 99 | msgid "Sebeolsik Noshift" 100 | msgstr "Sebeolsik Noshift" 101 | 102 | #: src/engine.h:38 103 | msgid "Sebeolsik Yetgeul" 104 | msgstr "Sebeolsik Yetgeul" 105 | 106 | #: src/engine.h:122 107 | msgid "Use Hangul" 108 | msgstr "Brug Hangul" 109 | 110 | #: src/engine.h:121 111 | msgid "Use Hanja" 112 | msgstr "Brug Hanja" 113 | 114 | #: src/engine.h:77 115 | msgid "Word Commit" 116 | msgstr "Ordudfør" 117 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # mar well , 2018 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: fcitx5-hangul\n" 12 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 13 | "POT-Creation-Date: 2020-11-02 15:55-0800\n" 14 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 15 | "Last-Translator: mar well , 2018\n" 16 | "Language-Team: German (https://www.transifex.com/fcitx/teams/12005/de/)\n" 17 | "Language: de\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 22 | 23 | #: src/engine.h:40 24 | msgid "Ahnmatae" 25 | msgstr "Ahnmatae" 26 | 27 | #: src/engine.h:76 28 | msgid "Auto Reorder" 29 | msgstr "Automatisch neu sortieren" 30 | 31 | #: src/engine.h:35 32 | msgid "Dubeolsik" 33 | msgstr "Dubeolsik" 34 | 35 | #: src/engine.h:36 36 | msgid "Dubeolsik Yetgeul" 37 | msgstr "Dubeolsik Yetgeul" 38 | 39 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in:3 40 | msgid "Hangul" 41 | msgstr "Hangul" 42 | 43 | #: src/hangul-addon.conf.in:4 44 | msgid "Hangul Wrapper For Fcitx" 45 | msgstr "Hangul Wrapper für Fcitx" 46 | 47 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:8 48 | msgid "Hangul engine for Fcitx 5" 49 | msgstr "" 50 | 51 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:7 52 | msgid "Hangul for Fcitx 5" 53 | msgstr "" 54 | 55 | #: src/engine.h:78 56 | msgid "Hanja Mode" 57 | msgstr "Hanja Modus" 58 | 59 | #: src/engine.h:49 60 | msgid "Hanja Mode Toggle Key" 61 | msgstr "Hanja Modus Umschalttaste" 62 | 63 | #: src/engine.h:45 64 | msgid "Keyboard Layout" 65 | msgstr "Tastaturlayout" 66 | 67 | #: src/engine.h:73 68 | msgid "Next Candidate" 69 | msgstr "Nächster Kandidat" 70 | 71 | #: src/engine.h:61 72 | msgid "Next Page" 73 | msgstr "Nächste Seite" 74 | 75 | #: src/engine.h:67 76 | msgid "Prev Candidate" 77 | msgstr "Vorheriger Kandidat" 78 | 79 | #: src/engine.h:55 80 | msgid "Prev Page" 81 | msgstr "Vorherige Seite" 82 | 83 | #: src/engine.h:39 84 | msgid "Romaja" 85 | msgstr "Romaja" 86 | 87 | #: src/engine.h:36 88 | msgid "Sebeolsik 390" 89 | msgstr "Sebeolsik 390" 90 | 91 | #: src/engine.h:39 92 | msgid "Sebeolsik Dubeol Layout" 93 | msgstr "Sebeolsik Dubeol Layout" 94 | 95 | #: src/engine.h:37 96 | msgid "Sebeolsik Final" 97 | msgstr "Sebeolsik Final" 98 | 99 | #: src/engine.h:37 100 | msgid "Sebeolsik Noshift" 101 | msgstr "Sebeolsik Noshift" 102 | 103 | #: src/engine.h:38 104 | msgid "Sebeolsik Yetgeul" 105 | msgstr "Sebeolsik Yetgeul" 106 | 107 | #: src/engine.h:122 108 | msgid "Use Hangul" 109 | msgstr "Hangul benutzen" 110 | 111 | #: src/engine.h:121 112 | msgid "Use Hanja" 113 | msgstr "Hanja benutzen" 114 | 115 | #: src/engine.h:77 116 | msgid "Word Commit" 117 | msgstr "Wort übergeben" 118 | -------------------------------------------------------------------------------- /po/fcitx5-hangul.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: fcitx5-hangul\n" 8 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 9 | "POT-Creation-Date: 2020-11-02 15:55-0800\n" 10 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "Last-Translator: FULL NAME \n" 12 | "Language-Team: LANGUAGE \n" 13 | "Language: LANG\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=utf-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: src/engine.h:40 19 | msgid "Ahnmatae" 20 | msgstr "" 21 | 22 | #: src/engine.h:76 23 | msgid "Auto Reorder" 24 | msgstr "" 25 | 26 | #: src/engine.h:35 27 | msgid "Dubeolsik" 28 | msgstr "" 29 | 30 | #: src/engine.h:36 31 | msgid "Dubeolsik Yetgeul" 32 | msgstr "" 33 | 34 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in:3 35 | msgid "Hangul" 36 | msgstr "" 37 | 38 | #: src/hangul-addon.conf.in:4 39 | msgid "Hangul Wrapper For Fcitx" 40 | msgstr "" 41 | 42 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:8 43 | msgid "Hangul engine for Fcitx 5" 44 | msgstr "" 45 | 46 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:7 47 | msgid "Hangul for Fcitx 5" 48 | msgstr "" 49 | 50 | #: src/engine.h:78 51 | msgid "Hanja Mode" 52 | msgstr "" 53 | 54 | #: src/engine.h:49 55 | msgid "Hanja Mode Toggle Key" 56 | msgstr "" 57 | 58 | #: src/engine.h:45 59 | msgid "Keyboard Layout" 60 | msgstr "" 61 | 62 | #: src/engine.h:73 63 | msgid "Next Candidate" 64 | msgstr "" 65 | 66 | #: src/engine.h:61 67 | msgid "Next Page" 68 | msgstr "" 69 | 70 | #: src/engine.h:67 71 | msgid "Prev Candidate" 72 | msgstr "" 73 | 74 | #: src/engine.h:55 75 | msgid "Prev Page" 76 | msgstr "" 77 | 78 | #: src/engine.h:39 79 | msgid "Romaja" 80 | msgstr "" 81 | 82 | #: src/engine.h:36 83 | msgid "Sebeolsik 390" 84 | msgstr "" 85 | 86 | #: src/engine.h:39 87 | msgid "Sebeolsik Dubeol Layout" 88 | msgstr "" 89 | 90 | #: src/engine.h:37 91 | msgid "Sebeolsik Final" 92 | msgstr "" 93 | 94 | #: src/engine.h:37 95 | msgid "Sebeolsik Noshift" 96 | msgstr "" 97 | 98 | #: src/engine.h:38 99 | msgid "Sebeolsik Yetgeul" 100 | msgstr "" 101 | 102 | #: src/engine.h:122 103 | msgid "Use Hangul" 104 | msgstr "" 105 | 106 | #: src/engine.h:121 107 | msgid "Use Hanja" 108 | msgstr "" 109 | 110 | #: src/engine.h:77 111 | msgid "Word Commit" 112 | msgstr "" 113 | -------------------------------------------------------------------------------- /po/getdescpo: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | filename=desc.po 3 | indir=$1 4 | outdir=$2 5 | 6 | cd "$outdir" 7 | 8 | rm -f "$outdir/$filename"; touch "$outdir/$filename" 9 | 10 | cat > "$outdir/$filename" <, YEAR. 15 | # 16 | #, fuzzy 17 | msgid "" 18 | msgstr "" 19 | "Project-Id-Version: PACKAGE VERSION\n" 20 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 21 | "POT-Creation-Date: 2010-11-17 11:48+0800\n" 22 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 23 | "Last-Translator: FULL NAME \n" 24 | "Language-Team: LANGUAGE \n" 25 | "Language: \n" 26 | "MIME-Version: 1.0\n" 27 | "Content-Type: text/plain; charset=UTF-8\n" 28 | "Content-Transfer-Encoding: 8bit\n" 29 | EOF 30 | 31 | cd $indir 32 | 33 | descfiles=`find "$indir" -name ".hg" -prune -or -name "test" -prune -or -iname "*.desc" | grep desc` 34 | 35 | # Extract Description 36 | for f in $descfiles 37 | do 38 | awk '/^[\t ]*Description=/ { print "\n#: '$f':" NR"\n" "msgid \"" substr($0, 13)"\"\n" "msgstr \"\""}' "$f" >> "$outdir/$filename" 39 | done 40 | 41 | # Extract Group Name 42 | grep -nH '^\[' $descfiles | grep -v 'DescriptionFile' | awk ' "^[" { split($0, a, ":"); split(a[3], b, "/"); print substr(b[1], 2); }' | sort | uniq | awk '{ print "# unknown\nmsgid \""$0"\"\nmsgstr \"\"\n"; }' >> "$outdir/$filename" 43 | 44 | # Extract Enum Name 45 | grep -h 'Enum[0-9]' $descfiles | sed -e 's/Enum[0-9]=//g' | sort | uniq | awk '{ print "#: unknown\nmsgid \""$0"\"\nmsgstr \"\"\n"; }' >> "$outdir/$filename" 46 | 47 | -------------------------------------------------------------------------------- /po/he.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # 63f334ffc0709ba0fc2361b80bf3c0f0_00ffd1e , 2020 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: fcitx5-hangul\n" 11 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 12 | "POT-Creation-Date: 2024-03-06 20:24+0000\n" 13 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 14 | "Last-Translator: 63f334ffc0709ba0fc2361b80bf3c0f0_00ffd1e " 15 | ", 2020\n" 16 | "Language-Team: Hebrew (https://app.transifex.com/fcitx/teams/12005/he/)\n" 17 | "Language: he\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " 22 | "1 == 0) ? 1: 2;\n" 23 | 24 | #: src/engine.h:40 25 | msgid "Ahnmatae" 26 | msgstr "" 27 | 28 | #: src/engine.h:76 29 | msgid "Auto Reorder" 30 | msgstr "" 31 | 32 | #: src/engine.h:35 33 | msgid "Dubeolsik" 34 | msgstr "" 35 | 36 | #: src/engine.h:36 37 | msgid "Dubeolsik Yetgeul" 38 | msgstr "" 39 | 40 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in.in:3 41 | msgid "Hangul" 42 | msgstr "הנגול" 43 | 44 | #: src/hangul-addon.conf.in.in:4 45 | msgid "Hangul Wrapper For Fcitx" 46 | msgstr "" 47 | 48 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 49 | msgid "Hangul engine for Fcitx 5" 50 | msgstr "" 51 | 52 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 53 | msgid "Hangul for Fcitx 5" 54 | msgstr "" 55 | 56 | #: src/engine.h:78 57 | msgid "Hanja Mode" 58 | msgstr "מצב הנג׳ה" 59 | 60 | #: src/engine.h:49 61 | msgid "Hanja Mode Toggle Key" 62 | msgstr "" 63 | 64 | #: src/engine.h:45 65 | msgid "Keyboard Layout" 66 | msgstr "פריסת מקלדת" 67 | 68 | #: src/engine.h:73 69 | msgid "Next Candidate" 70 | msgstr "" 71 | 72 | #: src/engine.h:61 73 | msgid "Next Page" 74 | msgstr "העמוד הבא" 75 | 76 | #: src/engine.h:67 77 | msgid "Prev Candidate" 78 | msgstr "" 79 | 80 | #: src/engine.h:55 81 | msgid "Prev Page" 82 | msgstr "העמוד הקודם" 83 | 84 | #: src/engine.h:39 85 | msgid "Romaja" 86 | msgstr "" 87 | 88 | #: src/engine.h:36 89 | msgid "Sebeolsik 390" 90 | msgstr "" 91 | 92 | #: src/engine.h:39 93 | msgid "Sebeolsik Dubeol Layout" 94 | msgstr "" 95 | 96 | #: src/engine.h:37 97 | msgid "Sebeolsik Final" 98 | msgstr "" 99 | 100 | #: src/engine.h:37 101 | msgid "Sebeolsik Noshift" 102 | msgstr "" 103 | 104 | #: src/engine.h:38 105 | msgid "Sebeolsik Yetgeul" 106 | msgstr "" 107 | 108 | #: src/engine.h:119 109 | msgid "Use Hangul" 110 | msgstr "שימוש בהנגול" 111 | 112 | #: src/engine.h:118 113 | msgid "Use Hanja" 114 | msgstr "שימוש בהנג׳ה" 115 | 116 | #: src/engine.h:77 117 | msgid "Word Commit" 118 | msgstr "" 119 | -------------------------------------------------------------------------------- /po/ja.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # Takuro Onoue , 2020 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: fcitx5-hangul\n" 12 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 13 | "POT-Creation-Date: 2020-12-05 00:03+0100\n" 14 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 15 | "Last-Translator: Takuro Onoue , 2020\n" 16 | "Language-Team: Japanese (https://www.transifex.com/fcitx/teams/12005/ja/)\n" 17 | "Language: ja\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=1; plural=0;\n" 22 | 23 | #: src/engine.h:40 24 | msgid "Ahnmatae" 25 | msgstr "Ahnmatae" 26 | 27 | #: src/engine.h:76 28 | msgid "Auto Reorder" 29 | msgstr "自動並び替え" 30 | 31 | #: src/engine.h:35 32 | msgid "Dubeolsik" 33 | msgstr "Dubeolsik" 34 | 35 | #: src/engine.h:36 36 | msgid "Dubeolsik Yetgeul" 37 | msgstr "Dubeolsik Yetgeul" 38 | 39 | #: src/hangul-addon.conf.in:3 src/hangul.conf.in:3 40 | msgid "Hangul" 41 | msgstr "ハングル" 42 | 43 | #: src/hangul-addon.conf.in:4 44 | msgid "Hangul Wrapper For Fcitx" 45 | msgstr "Fcitx 用 ハングルラッパー" 46 | 47 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 48 | msgid "Hangul engine for Fcitx 5" 49 | msgstr "Hangul engine for Fcitx 5" 50 | 51 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 52 | msgid "Hangul for Fcitx 5" 53 | msgstr "Hangul for Fcitx 5" 54 | 55 | #: src/engine.h:78 56 | msgid "Hanja Mode" 57 | msgstr "朝鮮漢字モード" 58 | 59 | #: src/engine.h:49 60 | msgid "Hanja Mode Toggle Key" 61 | msgstr "朝鮮漢字モードのトリガーとなるキー" 62 | 63 | #: src/engine.h:45 64 | msgid "Keyboard Layout" 65 | msgstr "キーボードレイアウト" 66 | 67 | #: src/engine.h:73 68 | msgid "Next Candidate" 69 | msgstr "次の候補" 70 | 71 | #: src/engine.h:61 72 | msgid "Next Page" 73 | msgstr "次のページ" 74 | 75 | #: src/engine.h:67 76 | msgid "Prev Candidate" 77 | msgstr "前の候補" 78 | 79 | #: src/engine.h:55 80 | msgid "Prev Page" 81 | msgstr "前のページ" 82 | 83 | #: src/engine.h:39 84 | msgid "Romaja" 85 | msgstr "Romaja" 86 | 87 | #: src/engine.h:36 88 | msgid "Sebeolsik 390" 89 | msgstr "Sebeolsik 390" 90 | 91 | #: src/engine.h:39 92 | msgid "Sebeolsik Dubeol Layout" 93 | msgstr "Sebeolsik Dubeol レイアウト" 94 | 95 | #: src/engine.h:37 96 | msgid "Sebeolsik Final" 97 | msgstr "Sebeolsik Final" 98 | 99 | #: src/engine.h:37 100 | msgid "Sebeolsik Noshift" 101 | msgstr "Sebeolsik Noshift" 102 | 103 | #: src/engine.h:38 104 | msgid "Sebeolsik Yetgeul" 105 | msgstr "Sebeolsik Yetgeul" 106 | 107 | #: src/engine.h:122 108 | msgid "Use Hangul" 109 | msgstr "ハングルを使う" 110 | 111 | #: src/engine.h:121 112 | msgid "Use Hanja" 113 | msgstr "朝鮮漢字を使う" 114 | 115 | #: src/engine.h:77 116 | msgid "Word Commit" 117 | msgstr "単語確定" 118 | -------------------------------------------------------------------------------- /po/ko.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # Bon Keun Seo , 2017 8 | # Junghee Lee , 2022 9 | # 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: fcitx5-hangul\n" 13 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 14 | "POT-Creation-Date: 2022-04-10 20:25+0000\n" 15 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 16 | "Last-Translator: Junghee Lee , 2022\n" 17 | "Language-Team: Korean (https://www.transifex.com/fcitx/teams/12005/ko/)\n" 18 | "Language: ko\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=1; plural=0;\n" 23 | 24 | #: src/engine.h:40 25 | msgid "Ahnmatae" 26 | msgstr "안마태" 27 | 28 | #: src/engine.h:76 29 | msgid "Auto Reorder" 30 | msgstr "자동 재배열" 31 | 32 | #: src/engine.h:35 33 | msgid "Dubeolsik" 34 | msgstr "두벌식" 35 | 36 | #: src/engine.h:36 37 | msgid "Dubeolsik Yetgeul" 38 | msgstr "두벌식 옛글" 39 | 40 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in.in:3 41 | msgid "Hangul" 42 | msgstr "한글" 43 | 44 | #: src/hangul-addon.conf.in.in:4 45 | msgid "Hangul Wrapper For Fcitx" 46 | msgstr "Fcitx용 한글 래퍼" 47 | 48 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 49 | msgid "Hangul engine for Fcitx 5" 50 | msgstr "Fcitx5용 한글 엔진" 51 | 52 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 53 | msgid "Hangul for Fcitx 5" 54 | msgstr "Fcitx5용 한글" 55 | 56 | #: src/engine.h:78 57 | msgid "Hanja Mode" 58 | msgstr "한자 모드" 59 | 60 | #: src/engine.h:49 61 | msgid "Hanja Mode Toggle Key" 62 | msgstr "한자 모드 변환 키" 63 | 64 | #: src/engine.h:45 65 | msgid "Keyboard Layout" 66 | msgstr "키보드 자판" 67 | 68 | #: src/engine.h:73 69 | msgid "Next Candidate" 70 | msgstr "다음 후보" 71 | 72 | #: src/engine.h:61 73 | msgid "Next Page" 74 | msgstr "다음 페이지" 75 | 76 | #: src/engine.h:67 77 | msgid "Prev Candidate" 78 | msgstr "이전 후보" 79 | 80 | #: src/engine.h:55 81 | msgid "Prev Page" 82 | msgstr "이전 페이지" 83 | 84 | #: src/engine.h:39 85 | msgid "Romaja" 86 | msgstr "로마자" 87 | 88 | #: src/engine.h:36 89 | msgid "Sebeolsik 390" 90 | msgstr "세벌식 390" 91 | 92 | #: src/engine.h:39 93 | msgid "Sebeolsik Dubeol Layout" 94 | msgstr "세벌식 두벌 자판" 95 | 96 | #: src/engine.h:37 97 | msgid "Sebeolsik Final" 98 | msgstr "세벌식 최종" 99 | 100 | #: src/engine.h:37 101 | msgid "Sebeolsik Noshift" 102 | msgstr "세벌식 순아래" 103 | 104 | #: src/engine.h:38 105 | msgid "Sebeolsik Yetgeul" 106 | msgstr "세벌식 옛글" 107 | 108 | #: src/engine.h:122 109 | msgid "Use Hangul" 110 | msgstr "한글 사용" 111 | 112 | #: src/engine.h:121 113 | msgid "Use Hanja" 114 | msgstr "한자 사용" 115 | 116 | #: src/engine.h:77 117 | msgid "Word Commit" 118 | msgstr "단어 단위 입력" 119 | -------------------------------------------------------------------------------- /po/ru.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # Dmitry , 2024 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: fcitx5-hangul\n" 12 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 13 | "POT-Creation-Date: 2024-05-31 20:25+0000\n" 14 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 15 | "Last-Translator: Dmitry , 2024\n" 16 | "Language-Team: Russian (https://app.transifex.com/fcitx/teams/12005/ru/)\n" 17 | "Language: ru\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 22 | "n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " 23 | "(n%100>=11 && n%100<=14)? 2 : 3);\n" 24 | 25 | #: src/engine.h:40 26 | msgid "Ahnmatae" 27 | msgstr "Ahnmatae" 28 | 29 | #: src/engine.h:76 30 | msgid "Auto Reorder" 31 | msgstr "Автоматическая пересортировка" 32 | 33 | #: src/engine.h:35 34 | msgid "Dubeolsik" 35 | msgstr "Dubeolsik" 36 | 37 | #: src/engine.h:36 38 | msgid "Dubeolsik Yetgeul" 39 | msgstr "Dubeolsik Yetgeul" 40 | 41 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in.in:3 42 | msgid "Hangul" 43 | msgstr "Хангыль" 44 | 45 | #: src/hangul-addon.conf.in.in:4 46 | msgid "Hangul Wrapper For Fcitx" 47 | msgstr "Обёртка Хангыль для Fcitx" 48 | 49 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 50 | msgid "Hangul engine for Fcitx 5" 51 | msgstr "Движок Хангыль для Fcitx 5" 52 | 53 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 54 | msgid "Hangul for Fcitx 5" 55 | msgstr "Хангыль для Fcitx 5" 56 | 57 | #: src/engine.h:78 58 | msgid "Hanja Mode" 59 | msgstr "Режим Ханча" 60 | 61 | #: src/engine.h:49 62 | msgid "Hanja Mode Toggle Key" 63 | msgstr "Клавиша переключения режима Ханча" 64 | 65 | #: src/engine.h:45 66 | msgid "Keyboard Layout" 67 | msgstr "Раскладка клавиатуры" 68 | 69 | #: src/engine.h:73 70 | msgid "Next Candidate" 71 | msgstr "Следующее слово-кандидат" 72 | 73 | #: src/engine.h:61 74 | msgid "Next Page" 75 | msgstr "Следующая Cтраница" 76 | 77 | #: src/engine.h:67 78 | msgid "Prev Candidate" 79 | msgstr "Предыдущее слово-кандидат" 80 | 81 | #: src/engine.h:55 82 | msgid "Prev Page" 83 | msgstr "Предыдущая страница" 84 | 85 | #: src/engine.h:39 86 | msgid "Romaja" 87 | msgstr "Romaja" 88 | 89 | #: src/engine.h:36 90 | msgid "Sebeolsik 390" 91 | msgstr "Sebeolsik 390" 92 | 93 | #: src/engine.h:39 94 | msgid "Sebeolsik Dubeol Layout" 95 | msgstr "Раскладка Sebeolsik Dubeol" 96 | 97 | #: src/engine.h:37 98 | msgid "Sebeolsik Final" 99 | msgstr "Sebeolsik Final" 100 | 101 | #: src/engine.h:37 102 | msgid "Sebeolsik Noshift" 103 | msgstr "Sebeolsik Noshift" 104 | 105 | #: src/engine.h:38 106 | msgid "Sebeolsik Yetgeul" 107 | msgstr "Sebeolsik Yetgeul" 108 | 109 | #: src/engine.h:119 110 | msgid "Use Hangul" 111 | msgstr "Использовать Хангыль" 112 | 113 | #: src/engine.h:118 114 | msgid "Use Hanja" 115 | msgstr "Использовать Ханча" 116 | 117 | #: src/engine.h:77 118 | msgid "Word Commit" 119 | msgstr "Добавить слово" 120 | -------------------------------------------------------------------------------- /po/tr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # abc Def , 2021 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: fcitx5-hangul\n" 12 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 13 | "POT-Creation-Date: 2021-11-02 20:24+0000\n" 14 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 15 | "Last-Translator: abc Def , 2021\n" 16 | "Language-Team: Turkish (https://www.transifex.com/fcitx/teams/12005/tr/)\n" 17 | "Language: tr\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 22 | 23 | #: src/engine.h:40 24 | msgid "Ahnmatae" 25 | msgstr "Ahnmatae" 26 | 27 | #: src/engine.h:76 28 | msgid "Auto Reorder" 29 | msgstr "Otomatik Tekrar Sıralama" 30 | 31 | #: src/engine.h:35 32 | msgid "Dubeolsik" 33 | msgstr "Dubeolsik" 34 | 35 | #: src/engine.h:36 36 | msgid "Dubeolsik Yetgeul" 37 | msgstr "Dubeolsik Yetgeul" 38 | 39 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in.in:3 40 | msgid "Hangul" 41 | msgstr "Hangul" 42 | 43 | #: src/hangul-addon.conf.in.in:4 44 | msgid "Hangul Wrapper For Fcitx" 45 | msgstr "Fcitx için Hangul Wrapper" 46 | 47 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 48 | msgid "Hangul engine for Fcitx 5" 49 | msgstr "Fcitx 5 için Hangul motoru" 50 | 51 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 52 | msgid "Hangul for Fcitx 5" 53 | msgstr "Fcitx 5 için Hangul" 54 | 55 | #: src/engine.h:78 56 | msgid "Hanja Mode" 57 | msgstr "Hanja Modu" 58 | 59 | #: src/engine.h:49 60 | msgid "Hanja Mode Toggle Key" 61 | msgstr "Haja Modu Anahtar Değişimi" 62 | 63 | #: src/engine.h:45 64 | msgid "Keyboard Layout" 65 | msgstr "Klavye Düzeni " 66 | 67 | #: src/engine.h:73 68 | msgid "Next Candidate" 69 | msgstr "Sonraki Aday" 70 | 71 | #: src/engine.h:61 72 | msgid "Next Page" 73 | msgstr "Sonraki Sayfa" 74 | 75 | #: src/engine.h:67 76 | msgid "Prev Candidate" 77 | msgstr "Önceki Aday" 78 | 79 | #: src/engine.h:55 80 | msgid "Prev Page" 81 | msgstr "Önceki Sayfa" 82 | 83 | #: src/engine.h:39 84 | msgid "Romaja" 85 | msgstr "Romaja" 86 | 87 | #: src/engine.h:36 88 | msgid "Sebeolsik 390" 89 | msgstr "Sebeolsik 390" 90 | 91 | #: src/engine.h:39 92 | msgid "Sebeolsik Dubeol Layout" 93 | msgstr "Sebeolsik Dubeol Layout" 94 | 95 | #: src/engine.h:37 96 | msgid "Sebeolsik Final" 97 | msgstr "Sebeolsik Final" 98 | 99 | #: src/engine.h:37 100 | msgid "Sebeolsik Noshift" 101 | msgstr "Sebeolsik Noshift" 102 | 103 | #: src/engine.h:38 104 | msgid "Sebeolsik Yetgeul" 105 | msgstr "Sebeolsik Yetgeul" 106 | 107 | #: src/engine.h:122 108 | msgid "Use Hangul" 109 | msgstr "Hangul Kullan" 110 | 111 | #: src/engine.h:121 112 | msgid "Use Hanja" 113 | msgstr "Hanja Kullan" 114 | 115 | #: src/engine.h:77 116 | msgid "Word Commit" 117 | msgstr "Kelime İşleme" 118 | -------------------------------------------------------------------------------- /po/vi.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # hoanghuy309 , 2025 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: fcitx5-hangul\n" 11 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 12 | "POT-Creation-Date: 2025-04-22 20:24+0000\n" 13 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 14 | "Last-Translator: hoanghuy309 , 2025\n" 15 | "Language-Team: Vietnamese (https://app.transifex.com/fcitx/teams/12005/vi/)\n" 16 | "Language: vi\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=1; plural=0;\n" 21 | 22 | #: src/engine.h:50 23 | msgid "Ahnmatae" 24 | msgstr "" 25 | 26 | #: src/engine.h:86 27 | msgid "Auto Reorder" 28 | msgstr "" 29 | 30 | #: src/engine.h:45 31 | msgid "Dubeolsik" 32 | msgstr "" 33 | 34 | #: src/engine.h:46 35 | msgid "Dubeolsik Yetgeul" 36 | msgstr "" 37 | 38 | #: src/hangul.conf.in:2 src/hangul-addon.conf.in.in:2 39 | msgid "Hangul" 40 | msgstr "" 41 | 42 | #: src/hangul-addon.conf.in.in:3 43 | msgid "Hangul Wrapper For Fcitx" 44 | msgstr "" 45 | 46 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 47 | msgid "Hangul engine for Fcitx 5" 48 | msgstr "" 49 | 50 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 51 | msgid "Hangul for Fcitx 5" 52 | msgstr "" 53 | 54 | #: src/engine.h:88 55 | msgid "Hanja Mode" 56 | msgstr "" 57 | 58 | #: src/engine.h:59 59 | msgid "Hanja Mode Toggle Key" 60 | msgstr "" 61 | 62 | #: src/engine.h:55 63 | msgid "Keyboard Layout" 64 | msgstr "Bố Cục Bàn Phím" 65 | 66 | #: src/engine.h:83 67 | msgid "Next Candidate" 68 | msgstr "" 69 | 70 | #: src/engine.h:71 71 | msgid "Next Page" 72 | msgstr "" 73 | 74 | #: src/engine.h:77 75 | msgid "Prev Candidate" 76 | msgstr "" 77 | 78 | #: src/engine.h:65 79 | msgid "Prev Page" 80 | msgstr "" 81 | 82 | #: src/engine.h:49 83 | msgid "Romaja" 84 | msgstr "" 85 | 86 | #: src/engine.h:46 87 | msgid "Sebeolsik 390" 88 | msgstr "" 89 | 90 | #: src/engine.h:49 91 | msgid "Sebeolsik Dubeol Layout" 92 | msgstr "" 93 | 94 | #: src/engine.h:47 95 | msgid "Sebeolsik Final" 96 | msgstr "" 97 | 98 | #: src/engine.h:47 99 | msgid "Sebeolsik Noshift" 100 | msgstr "" 101 | 102 | #: src/engine.h:48 103 | msgid "Sebeolsik Yetgeul" 104 | msgstr "" 105 | 106 | #: src/engine.h:127 107 | msgid "Use Hangul" 108 | msgstr "" 109 | 110 | #: src/engine.h:126 111 | msgid "Use Hanja" 112 | msgstr "" 113 | 114 | #: src/engine.h:87 115 | msgid "Word Commit" 116 | msgstr "" 117 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2020 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: fcitx5-hangul\n" 11 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 12 | "POT-Creation-Date: 2020-11-02 16:11-0800\n" 13 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 14 | "Last-Translator: csslayer , 2020\n" 15 | "Language-Team: Chinese (China) (https://www.transifex.com/fcitx/teams/12005/" 16 | "zh_CN/)\n" 17 | "Language: zh_CN\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Plural-Forms: nplurals=1; plural=0;\n" 22 | 23 | #: src/engine.h:40 24 | msgid "Ahnmatae" 25 | msgstr "安马太键盘" 26 | 27 | #: src/engine.h:76 28 | msgid "Auto Reorder" 29 | msgstr "自动排序" 30 | 31 | #: src/engine.h:35 32 | msgid "Dubeolsik" 33 | msgstr "Dubeolsik" 34 | 35 | #: src/engine.h:36 36 | msgid "Dubeolsik Yetgeul" 37 | msgstr "Dubeolsik Yetgeul" 38 | 39 | #: src/hangul.conf.in:3 src/hangul-addon.conf.in:3 40 | msgid "Hangul" 41 | msgstr "韩文" 42 | 43 | #: src/hangul-addon.conf.in:4 44 | msgid "Hangul Wrapper For Fcitx" 45 | msgstr "Fcitx 的韩文封装" 46 | 47 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:8 48 | msgid "Hangul engine for Fcitx 5" 49 | msgstr "Fcitx 5 的谚文引擎" 50 | 51 | #: org.fcitx.fcitx5-hangul.metainfo.xml.in:7 52 | msgid "Hangul for Fcitx 5" 53 | msgstr "Fcitx 5 的谚文支持" 54 | 55 | #: src/engine.h:78 56 | msgid "Hanja Mode" 57 | msgstr "汉字模式" 58 | 59 | #: src/engine.h:49 60 | msgid "Hanja Mode Toggle Key" 61 | msgstr "汉字模式切换键" 62 | 63 | #: src/engine.h:45 64 | msgid "Keyboard Layout" 65 | msgstr "键盘布局" 66 | 67 | #: src/engine.h:73 68 | msgid "Next Candidate" 69 | msgstr "下一个候选词" 70 | 71 | #: src/engine.h:61 72 | msgid "Next Page" 73 | msgstr "下一页" 74 | 75 | #: src/engine.h:67 76 | msgid "Prev Candidate" 77 | msgstr "上一个候选词" 78 | 79 | #: src/engine.h:55 80 | msgid "Prev Page" 81 | msgstr "上一页" 82 | 83 | #: src/engine.h:39 84 | msgid "Romaja" 85 | msgstr "Romaja" 86 | 87 | #: src/engine.h:36 88 | msgid "Sebeolsik 390" 89 | msgstr "Sebeolsik 390" 90 | 91 | #: src/engine.h:39 92 | msgid "Sebeolsik Dubeol Layout" 93 | msgstr "Sebeolsik Dubeol 布局" 94 | 95 | #: src/engine.h:37 96 | msgid "Sebeolsik Final" 97 | msgstr "Sebeolsik Final" 98 | 99 | #: src/engine.h:37 100 | msgid "Sebeolsik Noshift" 101 | msgstr "Sebeolsik Noshift" 102 | 103 | #: src/engine.h:38 104 | msgid "Sebeolsik Yetgeul" 105 | msgstr "三套式古文" 106 | 107 | #: src/engine.h:122 108 | msgid "Use Hangul" 109 | msgstr "使用韩文" 110 | 111 | #: src/engine.h:121 112 | msgid "Use Hanja" 113 | msgstr "使用汉字" 114 | 115 | #: src/engine.h:77 116 | msgid "Word Commit" 117 | msgstr "单词提交" 118 | -------------------------------------------------------------------------------- /po/zh_TW.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the fcitx5-hangul package. 4 | # 5 | # Translators: 6 | # csslayer , 2017 7 | # 黃柏諺 , 2017 8 | # bruh, 2020 9 | # 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: fcitx5-hangul\n" 13 | "Report-Msgid-Bugs-To: fcitx-dev@googlegroups.com\n" 14 | "POT-Creation-Date: 2020-11-29 00:02+0100\n" 15 | "PO-Revision-Date: 2017-12-29 05:05+0000\n" 16 | "Last-Translator: bruh, 2020\n" 17 | "Language-Team: Chinese (Taiwan) (https://www.transifex.com/fcitx/teams/12005/" 18 | "zh_TW/)\n" 19 | "Language: zh_TW\n" 20 | "MIME-Version: 1.0\n" 21 | "Content-Type: text/plain; charset=UTF-8\n" 22 | "Content-Transfer-Encoding: 8bit\n" 23 | "Plural-Forms: nplurals=1; plural=0;\n" 24 | 25 | #: src/engine.h:40 26 | msgid "Ahnmatae" 27 | msgstr "安馬太鍵盤" 28 | 29 | #: src/engine.h:76 30 | msgid "Auto Reorder" 31 | msgstr "自動排序" 32 | 33 | #: src/engine.h:35 34 | msgid "Dubeolsik" 35 | msgstr "Dubeolsik" 36 | 37 | #: src/engine.h:36 38 | msgid "Dubeolsik Yetgeul" 39 | msgstr "Dubeolsik Yetgeul" 40 | 41 | #: src/hangul-addon.conf.in:3 src/hangul.conf.in:3 42 | msgid "Hangul" 43 | msgstr "韓文" 44 | 45 | #: src/hangul-addon.conf.in:4 46 | msgid "Hangul Wrapper For Fcitx" 47 | msgstr "Fcitx 的韓文封裝" 48 | 49 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:8 50 | msgid "Hangul engine for Fcitx 5" 51 | msgstr "Fcitx 5 的韓文引擎" 52 | 53 | #: org.fcitx.Fcitx5.Addon.Hangul.metainfo.xml.in:7 54 | msgid "Hangul for Fcitx 5" 55 | msgstr "Fcitx 5 的韓文支援" 56 | 57 | #: src/engine.h:78 58 | msgid "Hanja Mode" 59 | msgstr "漢字模式" 60 | 61 | #: src/engine.h:49 62 | msgid "Hanja Mode Toggle Key" 63 | msgstr "漢字模式切換鍵" 64 | 65 | #: src/engine.h:45 66 | msgid "Keyboard Layout" 67 | msgstr "鍵盤配置" 68 | 69 | #: src/engine.h:73 70 | msgid "Next Candidate" 71 | msgstr "下個候選字" 72 | 73 | #: src/engine.h:61 74 | msgid "Next Page" 75 | msgstr "下一頁" 76 | 77 | #: src/engine.h:67 78 | msgid "Prev Candidate" 79 | msgstr "前一個候選字" 80 | 81 | #: src/engine.h:55 82 | msgid "Prev Page" 83 | msgstr "前一頁" 84 | 85 | #: src/engine.h:39 86 | msgid "Romaja" 87 | msgstr "羅馬字" 88 | 89 | #: src/engine.h:36 90 | msgid "Sebeolsik 390" 91 | msgstr "Sebeolsik 390" 92 | 93 | #: src/engine.h:39 94 | msgid "Sebeolsik Dubeol Layout" 95 | msgstr "Sebeolsik Dubeol Layout" 96 | 97 | #: src/engine.h:37 98 | msgid "Sebeolsik Final" 99 | msgstr "Sebeolsik Final" 100 | 101 | #: src/engine.h:37 102 | msgid "Sebeolsik Noshift" 103 | msgstr "Sebeolsik Noshift" 104 | 105 | #: src/engine.h:38 106 | msgid "Sebeolsik Yetgeul" 107 | msgstr "Sebeolsik Yetgeul" 108 | 109 | #: src/engine.h:122 110 | msgid "Use Hangul" 111 | msgstr "使用韓文" 112 | 113 | #: src/engine.h:121 114 | msgid "Use Hanja" 115 | msgstr "使用漢字" 116 | 117 | #: src/engine.h:77 118 | msgid "Word Commit" 119 | msgstr "單字提交" 120 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set( fcitx_hangul_sources 2 | engine.cpp 3 | ) 4 | 5 | add_fcitx5_addon(hangul ${fcitx_hangul_sources}) 6 | target_link_libraries(hangul Fcitx5::Core Fcitx5::Config ${HANGUL_TARGET}) 7 | install(TARGETS hangul DESTINATION "${CMAKE_INSTALL_LIBDIR}/fcitx5") 8 | fcitx5_translate_desktop_file(hangul.conf.in hangul.conf) 9 | configure_file(hangul-addon.conf.in.in hangul-addon.conf.in) 10 | fcitx5_translate_desktop_file("${CMAKE_CURRENT_BINARY_DIR}/hangul-addon.conf.in" hangul-addon.conf) 11 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/hangul.conf" DESTINATION "${FCITX_INSTALL_PKGDATADIR}/inputmethod" COMPONENT config) 12 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/hangul-addon.conf" RENAME hangul.conf DESTINATION "${FCITX_INSTALL_PKGDATADIR}/addon" COMPONENT config) 13 | -------------------------------------------------------------------------------- /src/engine.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010~2021 CSSlayer 3 | * 4 | * SPDX-License-Identifier: LGPL-2.1-or-later 5 | * 6 | */ 7 | 8 | #include "engine.h" 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | 39 | static const char *keyboardId[] = {"2", "2y", "39", "3f", "3s", 40 | "3y", "32", "ro", "ahn"}; 41 | 42 | constexpr auto MAX_LENGTH = 40; 43 | 44 | namespace fcitx { 45 | 46 | namespace { 47 | 48 | const KeyList &selectionKeys() { 49 | static const KeyList selectionKeys{ 50 | Key(FcitxKey_1), Key(FcitxKey_2), Key(FcitxKey_3), Key(FcitxKey_4), 51 | Key(FcitxKey_5), Key(FcitxKey_6), Key(FcitxKey_7), Key(FcitxKey_8), 52 | Key(FcitxKey_9), Key(FcitxKey_0)}; 53 | return selectionKeys; 54 | } 55 | 56 | std::string ustringToUTF8(const std::u32string &ustr) { 57 | std::string result; 58 | for (auto c : ustr) { 59 | result += utf8::UCS4ToUTF8(c); 60 | } 61 | return result; 62 | } 63 | 64 | std::u32string ucsToUString(const ucschar *str) { 65 | std::u32string result; 66 | while (*str) { 67 | result.push_back(*str); 68 | str++; 69 | } 70 | return result; 71 | } 72 | 73 | std::string subUTF8String(const std::string &str, int p1, int p2) { 74 | int limit; 75 | int pos; 76 | int n; 77 | 78 | if (str.empty()) { 79 | return ""; 80 | } 81 | 82 | limit = str.size() + 1; 83 | 84 | p1 = std::max(0, p1); 85 | p2 = std::max(0, p2); 86 | 87 | pos = std::min(p1, p2); 88 | n = std::abs(p2 - p1); 89 | 90 | if (pos + n > limit) { 91 | n = limit - pos; 92 | } 93 | 94 | auto begin = utf8::nextNChar(str.begin(), pos); 95 | auto end = utf8::nextNChar(begin, n); 96 | 97 | return std::string(begin, end); 98 | } 99 | 100 | HanjaTable *loadTable() { 101 | const auto &sp = fcitx::StandardPaths::global(); 102 | auto hanjaTxt = 103 | sp.locate(fcitx::StandardPathsType::Data, "libhangul/hanja/hanja.txt"); 104 | HanjaTable *table = nullptr; 105 | if (!hanjaTxt.empty()) { 106 | table = hanja_table_load(hanjaTxt.string().c_str()); 107 | } 108 | return table ? table : hanja_table_load(nullptr); 109 | } 110 | 111 | } // namespace 112 | 113 | class HangulCandidate : public CandidateWord { 114 | public: 115 | HangulCandidate(HangulEngine *engine, int idx, std::string text) 116 | : engine_(engine), idx_(idx) { 117 | setText(Text(std::move(text))); 118 | } 119 | 120 | void select(InputContext *inputContext) const override; 121 | 122 | private: 123 | HangulEngine *engine_; 124 | int idx_; 125 | }; 126 | 127 | class HangulState : public InputContextProperty { 128 | public: 129 | HangulState(HangulEngine *engine, InputContext *ic) 130 | : engine_(engine), ic_(ic) { 131 | configure(); 132 | } 133 | 134 | void configure() { 135 | context_.reset(hangul_ic_new( 136 | keyboardId[static_cast(*engine_->config().keyboard)])); 137 | hangul_ic_connect_callback( 138 | context_.get(), "transition", 139 | reinterpret_cast(&HangulState::onTransitionCallback), this); 140 | } 141 | 142 | static bool onTransitionCallback(HangulInputContext * /*unused*/, ucschar c, 143 | const ucschar * /*unused*/, void *data) { 144 | auto *that = static_cast(data); 145 | return that->onTransition(c); 146 | } 147 | 148 | bool onTransition(ucschar c) { 149 | if (!*engine_->config().autoReorder) { 150 | if (hangul_is_choseong(c)) { 151 | if (hangul_ic_has_jungseong(context_.get()) || 152 | hangul_ic_has_jongseong(context_.get())) { 153 | return false; 154 | } 155 | } 156 | 157 | if (hangul_is_jungseong(c)) { 158 | if (hangul_ic_has_jongseong(context_.get())) { 159 | return false; 160 | } 161 | } 162 | } 163 | 164 | return true; 165 | } 166 | 167 | void updateLookupTable(bool checkSurrounding) { 168 | std::string hanjaKey; 169 | LookupMethod lookupMethod = LookupMethod::LOOKUP_METHOD_PREFIX; 170 | 171 | hanjaList_.reset(); 172 | 173 | const auto *hic_preedit = hangul_ic_get_preedit_string(context_.get()); 174 | std::u32string preedit = preedit_; 175 | preedit.append(ucsToUString(hic_preedit)); 176 | if (!preedit.empty()) { 177 | auto utf8 = ustringToUTF8(preedit); 178 | if (*engine_->config().wordCommit || *engine_->config().hanjaMode) { 179 | hanjaKey = std::move(utf8); 180 | lookupMethod = LookupMethod::LOOKUP_METHOD_PREFIX; 181 | } else { 182 | auto cursorPos = ic_->surroundingText().cursor(); 183 | auto substr = 184 | subUTF8String(ic_->surroundingText().text(), 185 | static_cast(cursorPos) - 64, cursorPos); 186 | 187 | if (!substr.empty()) { 188 | hanjaKey = substr + utf8; 189 | } else { 190 | hanjaKey = std::move(utf8); 191 | } 192 | lookupMethod = LookupMethod::LOOKUP_METHOD_SUFFIX; 193 | } 194 | } else if (checkSurrounding) { 195 | 196 | if (!ic_->capabilityFlags().test(CapabilityFlag::SurroundingText) || 197 | !ic_->surroundingText().isValid()) { 198 | return; 199 | } 200 | const auto &surroundingStr = ic_->surroundingText().text(); 201 | auto cursorPos = ic_->surroundingText().cursor(); 202 | auto anchorPos = ic_->surroundingText().anchor(); 203 | if (cursorPos != anchorPos) { 204 | // If we have selection in surrounding text, we use that. 205 | hanjaKey = subUTF8String(surroundingStr, cursorPos, anchorPos); 206 | lookupMethod = LookupMethod::LOOKUP_METHOD_EXACT; 207 | } else { 208 | hanjaKey = 209 | subUTF8String(surroundingStr, 210 | static_cast(cursorPos) - 64, cursorPos); 211 | lookupMethod = LookupMethod::LOOKUP_METHOD_SUFFIX; 212 | } 213 | } 214 | 215 | if (!hanjaKey.empty()) { 216 | hanjaList_.reset(lookupTable(hanjaKey, lookupMethod)); 217 | lastLookupMethod_ = lookupMethod; 218 | } 219 | } 220 | 221 | HanjaList *lookupTable(const std::string &key, LookupMethod method) { 222 | HanjaList *list = nullptr; 223 | 224 | if (key.empty()) { 225 | return nullptr; 226 | } 227 | 228 | decltype(&hanja_table_match_exact) func = nullptr; 229 | 230 | switch (method) { 231 | case LookupMethod::LOOKUP_METHOD_EXACT: 232 | func = &hanja_table_match_exact; 233 | break; 234 | case LookupMethod::LOOKUP_METHOD_PREFIX: 235 | func = &hanja_table_match_prefix; 236 | break; 237 | case LookupMethod::LOOKUP_METHOD_SUFFIX: 238 | func = &hanja_table_match_suffix; 239 | break; 240 | } 241 | if (!func) { 242 | return nullptr; 243 | } 244 | 245 | if (auto *symbolTable = engine_->symbolTable()) { 246 | list = func(symbolTable, key.data()); 247 | } 248 | 249 | if (!list) { 250 | list = func(engine_->table(), key.data()); 251 | } 252 | 253 | return list; 254 | } 255 | 256 | void keyEvent(KeyEvent &keyEvent) { 257 | if (keyEvent.isRelease()) { 258 | return; 259 | } 260 | 261 | if (keyEvent.key().checkKeyList( 262 | *engine_->config().hanjaModeToggleKey)) { 263 | if (!hanjaList_) { 264 | updateLookupTable(true); 265 | } else { 266 | cleanup(); 267 | } 268 | updateUI(); 269 | keyEvent.filterAndAccept(); 270 | return; 271 | } 272 | 273 | auto sym = keyEvent.key().sym(); 274 | 275 | if (sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R) { 276 | return; 277 | } 278 | 279 | KeyStates s; 280 | for (const auto *keyList : 281 | {&*engine_->config().hanjaModeToggleKey, 282 | &*engine_->config().prevPageKey, &*engine_->config().nextPageKey, 283 | &*engine_->config().prevCandidateKey, 284 | &*engine_->config().nextCandidateKey}) { 285 | for (auto key : *keyList) { 286 | s |= key.states(); 287 | } 288 | } 289 | 290 | struct { 291 | KeyState state; 292 | KeySym left, right; 293 | } modifiers[] = { 294 | {KeyState::Ctrl, FcitxKey_Control_L, FcitxKey_Control_R}, 295 | {KeyState::Alt, FcitxKey_Alt_L, FcitxKey_Alt_R}, 296 | {KeyState::Shift, FcitxKey_Shift_L, FcitxKey_Shift_R}, 297 | {KeyState::Super, FcitxKey_Super_L, FcitxKey_Super_R}, 298 | {KeyState::Hyper, FcitxKey_Hyper_L, FcitxKey_Hyper_R}, 299 | }; 300 | 301 | for (auto &modifier : modifiers) { 302 | if (s & modifier.state) { 303 | if (sym == modifier.left || sym == modifier.right) { 304 | return; 305 | } 306 | } 307 | } 308 | 309 | // Handle candidate selection. 310 | auto candList = ic_->inputPanel().candidateList(); 311 | if (candList && !candList->empty()) { 312 | if (keyEvent.key().checkKeyList(*engine_->config().prevPageKey)) { 313 | candList->toPageable()->prev(); 314 | ic_->updateUserInterface(UserInterfaceComponent::InputPanel); 315 | keyEvent.filterAndAccept(); 316 | return; 317 | } 318 | if (keyEvent.key().checkKeyList(*engine_->config().nextPageKey)) { 319 | candList->toPageable()->next(); 320 | ic_->updateUserInterface(UserInterfaceComponent::InputPanel); 321 | keyEvent.filterAndAccept(); 322 | return; 323 | } 324 | 325 | if (keyEvent.key().checkKeyList( 326 | *engine_->config().prevCandidateKey)) { 327 | candList->toCursorMovable()->prevCandidate(); 328 | ic_->updateUserInterface(UserInterfaceComponent::InputPanel); 329 | keyEvent.filterAndAccept(); 330 | return; 331 | } 332 | if (keyEvent.key().checkKeyList( 333 | *engine_->config().nextCandidateKey)) { 334 | candList->toCursorMovable()->nextCandidate(); 335 | ic_->updateUserInterface(UserInterfaceComponent::InputPanel); 336 | keyEvent.filterAndAccept(); 337 | return; 338 | } 339 | 340 | auto idx = keyEvent.key().keyListIndex(selectionKeys()); 341 | if (idx >= 0) { 342 | if (idx < candList->size()) { 343 | candList->candidate(idx).select(ic_); 344 | } 345 | keyEvent.filterAndAccept(); 346 | return; 347 | } 348 | 349 | if (keyEvent.key().check(FcitxKey_Return)) { 350 | auto idx = candList->cursorIndex(); 351 | idx = std::max(idx, 0); 352 | 353 | if (idx < candList->size()) { 354 | candList->candidate(idx).select(ic_); 355 | keyEvent.filterAndAccept(); 356 | return; 357 | } 358 | } 359 | 360 | if (!*engine_->config().hanjaMode) { 361 | cleanup(); 362 | } 363 | } 364 | 365 | s = KeyStates{KeyState::Ctrl, KeyState::Alt, KeyState::Shift, 366 | KeyState::Super, KeyState::Hyper}; 367 | if (keyEvent.key().states() & s) { 368 | flush(); 369 | updateUI(); 370 | return; 371 | } 372 | 373 | bool keyUsed = false; 374 | if (keyEvent.key().check(FcitxKey_BackSpace)) { 375 | keyUsed = hangul_ic_backspace(context_.get()); 376 | if (!keyUsed) { 377 | unsigned int preedit_len = preedit_.size(); 378 | if (preedit_len > 0) { 379 | preedit_.pop_back(); 380 | keyUsed = true; 381 | } 382 | } 383 | } else { 384 | if (preedit_.size() >= MAX_LENGTH) { 385 | flush(); 386 | } 387 | 388 | // revert capslock 389 | if (keyEvent.rawKey().states().test(KeyState::CapsLock)) { 390 | if (sym >= 'A' && sym <= 'z') { 391 | if (charutils::isupper(sym)) { 392 | sym = static_cast(charutils::tolower(sym)); 393 | } else { 394 | sym = static_cast(charutils::toupper(sym)); 395 | } 396 | } 397 | } 398 | 399 | keyUsed = hangul_ic_process(context_.get(), sym); 400 | bool notFlush = false; 401 | 402 | const ucschar *str = hangul_ic_get_commit_string(context_.get()); 403 | if (*engine_->config().wordCommit || *engine_->config().hanjaMode) { 404 | const ucschar *hic_preedit; 405 | 406 | hic_preedit = hangul_ic_get_preedit_string(context_.get()); 407 | preedit_.append(ucsToUString(str)); 408 | if (hic_preedit == nullptr || hic_preedit[0] == 0) { 409 | if (!preedit_.empty()) { 410 | auto commit = ustringToUTF8(preedit_); 411 | if (!commit.empty()) { 412 | ic_->commitString(commit); 413 | } 414 | } 415 | preedit_.clear(); 416 | } 417 | } else { 418 | if (str != nullptr && str[0] != 0) { 419 | auto commit = ustringToUTF8(ucsToUString(str)); 420 | if (!commit.empty()) { 421 | ic_->commitString(commit); 422 | } 423 | } 424 | } 425 | 426 | if (!keyUsed && !notFlush) { 427 | flush(); 428 | } 429 | } 430 | 431 | if (*engine_->config().hanjaMode) { 432 | updateLookupTable(false); 433 | } else { 434 | cleanup(); 435 | } 436 | 437 | updateUI(); 438 | if (keyUsed) { 439 | keyEvent.filterAndAccept(); 440 | } 441 | } 442 | 443 | void reset() { 444 | preedit_.clear(); 445 | hangul_ic_reset(context_.get()); 446 | hanjaList_.reset(); 447 | updateUI(); 448 | } 449 | 450 | void cleanup() { hanjaList_.reset(); } 451 | 452 | void flush() { 453 | cleanup(); 454 | 455 | const auto *str = hangul_ic_flush(context_.get()); 456 | 457 | preedit_ += ucsToUString(str); 458 | 459 | if (preedit_.empty()) { 460 | return; 461 | } 462 | 463 | auto utf8 = ustringToUTF8(preedit_); 464 | if (!utf8.empty()) { 465 | ic_->commitString(utf8); 466 | } 467 | 468 | preedit_.clear(); 469 | } 470 | 471 | void updateUI() { 472 | const ucschar *hic_preedit = 473 | hangul_ic_get_preedit_string(context_.get()); 474 | 475 | ic_->inputPanel().reset(); 476 | 477 | std::string pre1 = ustringToUTF8(preedit_); 478 | std::string pre2; 479 | if (hic_preedit) { 480 | pre2 = ustringToUTF8(ucsToUString(hic_preedit)); 481 | } 482 | 483 | if (!pre1.empty() || !pre2.empty()) { 484 | Text text; 485 | text.append(pre1); 486 | text.append(pre2, TextFormatFlag::HighLight); 487 | text.setCursor(pre1.size() + pre2.size()); 488 | if (ic_->capabilityFlags().test(CapabilityFlag::Preedit)) { 489 | ic_->inputPanel().setClientPreedit(text); 490 | } else { 491 | ic_->inputPanel().setPreedit(text); 492 | } 493 | } 494 | ic_->updatePreedit(); 495 | 496 | setLookupTable(); 497 | 498 | ic_->updateUserInterface(UserInterfaceComponent::InputPanel); 499 | } 500 | 501 | void setLookupTable() { 502 | if (!hanjaList_) { 503 | return; 504 | } 505 | HanjaList *list = hanjaList_.get(); 506 | if (list) { 507 | auto candidate = std::make_unique(); 508 | candidate->setSelectionKey(selectionKeys()); 509 | candidate->setCursorPositionAfterPaging( 510 | CursorPositionAfterPaging::ResetToFirst); 511 | candidate->setPageSize( 512 | engine_->instance()->globalConfig().defaultPageSize()); 513 | auto n = hanja_list_get_size(list); 514 | for (auto i = 0; i < n; i++) { 515 | const char *value = hanja_list_get_nth_value(list, i); 516 | candidate->append(engine_, i, value); 517 | } 518 | if (n) { 519 | candidate->setGlobalCursorIndex(0); 520 | ic_->inputPanel().setCandidateList(std::move(candidate)); 521 | } 522 | } 523 | } 524 | 525 | void select(int pos) { 526 | const char *key; 527 | const char *value; 528 | const ucschar *hic_preedit; 529 | int key_len; 530 | int preedit_len; 531 | int hic_preedit_len; 532 | 533 | key = hanja_list_get_nth_key(hanjaList_.get(), pos); 534 | value = hanja_list_get_nth_value(hanjaList_.get(), pos); 535 | hic_preedit = hangul_ic_get_preedit_string(context_.get()); 536 | 537 | if (!key || !value || !hic_preedit) { 538 | reset(); 539 | return; 540 | } 541 | 542 | key_len = fcitx::utf8::length(std::string(key)); 543 | preedit_len = preedit_.size(); 544 | hic_preedit_len = ucsToUString(hic_preedit).size(); 545 | 546 | bool surrounding = false; 547 | if (lastLookupMethod_ == LookupMethod::LOOKUP_METHOD_PREFIX) { 548 | if (preedit_len == 0 && hic_preedit_len == 0) { 549 | /* remove surrounding_text */ 550 | if (key_len > 0) { 551 | ic_->deleteSurroundingText(-key_len, key_len); 552 | surrounding = true; 553 | } 554 | } else { 555 | /* remove preedit text */ 556 | if (key_len > 0) { 557 | long n = std::min(key_len, preedit_len); 558 | preedit_.erase(0, n); 559 | key_len -= preedit_len; 560 | } 561 | 562 | /* remove hic preedit text */ 563 | if (key_len > 0) { 564 | hangul_ic_reset(context_.get()); 565 | key_len -= hic_preedit_len; 566 | } 567 | } 568 | } else { 569 | /* remove hic preedit text */ 570 | if (hic_preedit_len > 0) { 571 | hangul_ic_reset(context_.get()); 572 | key_len -= hic_preedit_len; 573 | } 574 | 575 | /* remove preedit text */ 576 | if (key_len > preedit_len) { 577 | preedit_.erase(0, preedit_len); 578 | key_len -= preedit_len; 579 | } else if (key_len > 0) { 580 | preedit_.erase(0, key_len); 581 | key_len = 0; 582 | } 583 | 584 | /* remove surrounding_text */ 585 | if (LookupMethod::LOOKUP_METHOD_EXACT != lastLookupMethod_ && 586 | key_len > 0) { 587 | ic_->deleteSurroundingText(-key_len, key_len); 588 | surrounding = true; 589 | } 590 | } 591 | 592 | ic_->commitString(value); 593 | if (surrounding) { 594 | cleanup(); 595 | } 596 | updateLookupTable(false); 597 | updateUI(); 598 | } 599 | 600 | private: 601 | HangulEngine *engine_; 602 | InputContext *ic_; 603 | UniqueCPtr context_; 604 | UniqueCPtr hanjaList_; 605 | std::u32string preedit_; 606 | LookupMethod lastLookupMethod_; 607 | }; 608 | 609 | HangulEngine::HangulEngine(Instance *instance) 610 | : instance_(instance), 611 | factory_([this](InputContext &ic) { return new HangulState(this, &ic); }), 612 | table_(loadTable()) { 613 | if (!table_) { 614 | throw std::runtime_error("Failed to load hanja table."); 615 | } 616 | 617 | auto file = StandardPaths::global().locate(StandardPathsType::PkgData, 618 | "hangul/symbol.txt"); 619 | if (!file.empty()) { 620 | symbolTable_.reset(hanja_table_load(file.string().c_str())); 621 | } 622 | 623 | reloadConfig(); 624 | action_.connect([this](InputContext *ic) { 625 | config_.hanjaMode.setValue(!*config_.hanjaMode); 626 | updateAction(ic); 627 | }); 628 | instance_->userInterfaceManager().registerAction("hangul", &action_); 629 | 630 | instance_->inputContextManager().registerProperty("hangulState", &factory_); 631 | } 632 | 633 | void HangulEngine::activate(const InputMethodEntry & /*entry*/, 634 | InputContextEvent &event) { 635 | event.inputContext()->statusArea().addAction(StatusGroup::InputMethod, 636 | &action_); 637 | updateAction(event.inputContext()); 638 | } 639 | 640 | void HangulEngine::deactivate(const InputMethodEntry &entry, 641 | InputContextEvent &event) { 642 | if (event.type() == EventType::InputContextSwitchInputMethod) { 643 | auto *state = event.inputContext()->propertyFor(&factory_); 644 | state->flush(); 645 | } 646 | reset(entry, event); 647 | } 648 | 649 | void HangulEngine::keyEvent(const InputMethodEntry & /*entry*/, 650 | KeyEvent &keyEvent) { 651 | if (keyEvent.isRelease()) { 652 | return; 653 | } 654 | auto *state = keyEvent.inputContext()->propertyFor(&factory_); 655 | state->keyEvent(keyEvent); 656 | } 657 | 658 | void HangulEngine::reset(const InputMethodEntry & /*entry*/, 659 | InputContextEvent &event) { 660 | auto *state = event.inputContext()->propertyFor(&factory_); 661 | state->reset(); 662 | } 663 | 664 | void HangulEngine::reloadConfig() { readAsIni(config_, "conf/hangul.conf"); } 665 | 666 | void HangulEngine::setConfig(const fcitx::RawConfig &rawConfig) { 667 | config_.load(rawConfig, true); 668 | instance_->inputContextManager().foreach([this](InputContext *ic) { 669 | state(ic)->configure(); 670 | return true; 671 | }); 672 | safeSaveAsIni(config_, "conf/hangul.conf"); 673 | } 674 | 675 | HangulState *HangulEngine::state(InputContext *ic) { 676 | return ic->propertyFor(&factory_); 677 | } 678 | 679 | void HangulCandidate::select(InputContext *inputContext) const { 680 | auto *state = engine_->state(inputContext); 681 | state->select(idx_); 682 | } 683 | } // namespace fcitx 684 | 685 | FCITX_ADDON_FACTORY_V2(hangul, fcitx::HangulEngineFactory); 686 | -------------------------------------------------------------------------------- /src/engine.h: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010~2021 CSSlayer 3 | * 4 | * SPDX-License-Identifier: LGPL-2.1-or-later 5 | * 6 | */ 7 | #ifndef _FCITX5_HANGUL_ENGINE_H_ 8 | #define _FCITX5_HANGUL_ENGINE_H_ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | namespace fcitx { 32 | 33 | enum class HangulKeyboard { 34 | Dubeolsik = 0, 35 | Dubeolsik_Yetgeul, 36 | Sebeolsik_390, 37 | Sebeolsik_Final, 38 | Sebeolsik_Noshift, 39 | Sebeolsik_Yetgeul, 40 | Sebeolsik_Dubeol_Layout, 41 | Romaja, 42 | Ahnmatae, 43 | }; 44 | 45 | FCITX_CONFIG_ENUM_NAME_WITH_I18N(HangulKeyboard, N_("Dubeolsik"), 46 | N_("Dubeolsik Yetgeul"), N_("Sebeolsik 390"), 47 | N_("Sebeolsik Final"), N_("Sebeolsik Noshift"), 48 | N_("Sebeolsik Yetgeul"), 49 | N_("Sebeolsik Dubeol Layout"), N_("Romaja"), 50 | N_("Ahnmatae")); 51 | 52 | FCITX_CONFIGURATION( 53 | HangulConfig, 54 | OptionWithAnnotation keyboard{ 55 | this, "Keyboard", _("Keyboard Layout"), HangulKeyboard::Dubeolsik}; 56 | KeyListOption hanjaModeToggleKey{ 57 | this, 58 | "HanjaModeToggleKey", 59 | _("Hanja Mode Toggle Key"), 60 | {Key(FcitxKey_Hangul_Hanja), Key(FcitxKey_F9)}, 61 | KeyListConstrain(KeyConstrainFlag::AllowModifierLess)}; 62 | KeyListOption prevPageKey{ 63 | this, 64 | "PrevPage", 65 | _("Prev Page"), 66 | {Key(FcitxKey_Up)}, 67 | KeyListConstrain(KeyConstrainFlag::AllowModifierLess)}; 68 | KeyListOption nextPageKey{ 69 | this, 70 | "NextPage", 71 | _("Next Page"), 72 | {Key(FcitxKey_Down)}, 73 | KeyListConstrain(KeyConstrainFlag::AllowModifierLess)}; 74 | KeyListOption prevCandidateKey{ 75 | this, 76 | "PrevCandidate", 77 | _("Prev Candidate"), 78 | {Key(FcitxKey_Tab, KeyState::Shift)}, 79 | KeyListConstrain(KeyConstrainFlag::AllowModifierLess)}; 80 | KeyListOption nextCandidateKey{ 81 | this, 82 | "NextCandidate", 83 | _("Next Candidate"), 84 | {Key(FcitxKey_Tab)}, 85 | KeyListConstrain(KeyConstrainFlag::AllowModifierLess)}; 86 | Option autoReorder{this, "AutoReorder", _("Auto Reorder"), true}; 87 | Option wordCommit{this, "WordCommit", _("Word Commit"), false}; 88 | Option hanjaMode{this, "HanjaMode", _("Hanja Mode"), false};); 89 | 90 | enum class LookupMethod : uint8_t { 91 | LOOKUP_METHOD_PREFIX, 92 | LOOKUP_METHOD_EXACT, 93 | LOOKUP_METHOD_SUFFIX 94 | }; 95 | 96 | class HangulState; 97 | 98 | class HangulEngine : public InputMethodEngine { 99 | public: 100 | HangulEngine(Instance *instance); 101 | 102 | void activate(const fcitx::InputMethodEntry &, 103 | fcitx::InputContextEvent &) override; 104 | void deactivate(const fcitx::InputMethodEntry &entry, 105 | fcitx::InputContextEvent &event) override; 106 | void keyEvent(const fcitx::InputMethodEntry &entry, 107 | fcitx::KeyEvent &keyEvent) override; 108 | void reset(const fcitx::InputMethodEntry &, 109 | fcitx::InputContextEvent &) override; 110 | void reloadConfig() override; 111 | 112 | const fcitx::Configuration *getConfig() const override { return &config_; } 113 | 114 | void setConfig(const fcitx::RawConfig &rawConfig) override; 115 | 116 | auto &config() { return config_; } 117 | 118 | auto table() { return table_.get(); } 119 | auto symbolTable() { return symbolTable_.get(); } 120 | 121 | HangulState *state(InputContext *ic); 122 | 123 | void updateAction(InputContext *ic) { 124 | action_.setIcon(*config_.hanjaMode ? "fcitx-hanja-active" 125 | : "fcitx-hanja-inactive"); 126 | action_.setLongText(*config_.hanjaMode ? _("Use Hanja") 127 | : _("Use Hangul")); 128 | action_.setShortText(*config_.hanjaMode ? "\xe9\x9f\x93" 129 | : "\xed\x95\x9c"); 130 | action_.update(ic); 131 | safeSaveAsIni(config_, "conf/hangul.conf"); 132 | } 133 | 134 | auto instance() { return instance_; } 135 | 136 | private: 137 | Instance *instance_; 138 | HangulConfig config_; 139 | FactoryFor factory_; 140 | UniqueCPtr table_; 141 | UniqueCPtr symbolTable_; 142 | SimpleAction action_; 143 | }; 144 | 145 | class HangulEngineFactory : public AddonFactory { 146 | public: 147 | AddonInstance *create(AddonManager *manager) override { 148 | registerDomain("fcitx5-hangul", FCITX_INSTALL_LOCALEDIR); 149 | return new HangulEngine(manager->instance()); 150 | } 151 | }; 152 | } // namespace fcitx 153 | 154 | #endif // _FCITX5_HANGUL_ENGINE_H_ 155 | -------------------------------------------------------------------------------- /src/hangul-addon.conf.in.in: -------------------------------------------------------------------------------- 1 | [Addon] 2 | Name=Hangul 3 | Comment=Hangul Wrapper For Fcitx 4 | Category=InputMethod 5 | Version=@PROJECT_VERSION@ 6 | Library=libhangul 7 | Type=SharedLibrary 8 | OnDemand=True 9 | Configurable=True 10 | 11 | [Addon/Dependencies] 12 | 0=core:@REQUIRED_FCITX_VERSION@ 13 | -------------------------------------------------------------------------------- /src/hangul.conf.in: -------------------------------------------------------------------------------- 1 | [InputMethod] 2 | Name=Hangul 3 | Icon=fcitx-hangul 4 | Addon=hangul 5 | Configurable=True 6 | Label=한 7 | LangCode=ko 8 | -------------------------------------------------------------------------------- /test/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | configure_file(testdir.h.in ${CMAKE_CURRENT_BINARY_DIR}/testdir.h @ONLY) 2 | add_subdirectory(addon) 3 | add_subdirectory(inputmethod) 4 | include_directories(${CMAKE_CURRENT_BINARY_DIR}) 5 | add_executable(testhangul testhangul.cpp) 6 | target_link_libraries(testhangul Fcitx5::Core Fcitx5::Module::TestFrontend) 7 | add_dependencies(testhangul copy-addon copy-im) 8 | add_test(NAME testhangul COMMAND testhangul) 9 | -------------------------------------------------------------------------------- /test/addon/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_custom_target(copy-addon DEPENDS hangul-addon.conf.in-fmt) 2 | add_custom_command(TARGET copy-addon COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/src/hangul-addon.conf ${CMAKE_CURRENT_BINARY_DIR}/hangul.conf) 3 | -------------------------------------------------------------------------------- /test/inputmethod/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_custom_target(copy-im DEPENDS hangul.conf.in-fmt) 2 | add_custom_command(TARGET copy-im COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/src/hangul.conf ${CMAKE_CURRENT_BINARY_DIR}/hangul.conf) 3 | -------------------------------------------------------------------------------- /test/testdir.h.in: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2021~2021 CSSlayer 3 | * 4 | * SPDX-License-Identifier: GPL-2.0-or-later 5 | */ 6 | #ifndef _TEST_TESTDIR_H_ 7 | #define _TEST_TESTDIR_H_ 8 | 9 | #define TESTING_SOURCE_DIR "@CMAKE_SOURCE_DIR@" 10 | #define TESTING_BINARY_DIR "@CMAKE_BINARY_DIR@" 11 | 12 | #endif // _TEST_TESTDIR_H_ 13 | -------------------------------------------------------------------------------- /test/testhangul.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2024-2024 CSSlayer 3 | * 4 | * SPDX-License-Identifier: GPL-2.0-or-later 5 | * 6 | */ 7 | #include "testdir.h" 8 | #include "testfrontend_public.h" 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | using namespace fcitx; 22 | 23 | void scheduleEvent(Instance *instance) { 24 | instance->eventDispatcher().schedule([instance]() { 25 | auto *hangul = instance->addonManager().addon("hangul", true); 26 | FCITX_ASSERT(hangul); 27 | auto defaultGroup = instance->inputMethodManager().currentGroup(); 28 | defaultGroup.inputMethodList().clear(); 29 | defaultGroup.inputMethodList().push_back( 30 | InputMethodGroupItem("keyboard-us")); 31 | defaultGroup.inputMethodList().push_back( 32 | InputMethodGroupItem("hangul")); 33 | defaultGroup.setDefaultInputMethod(""); 34 | instance->inputMethodManager().setGroup(defaultGroup); 35 | auto *testfrontend = instance->addonManager().addon("testfrontend"); 36 | auto uuid = 37 | testfrontend->call("testapp"); 38 | auto *ic = instance->inputContextManager().findByUUID(uuid); 39 | FCITX_ASSERT(testfrontend->call( 40 | uuid, Key("Control+space"), false)); 41 | 42 | testfrontend->call("ㅂ"); 43 | testfrontend->call("ㅃ"); 44 | testfrontend->call("ㅂ"); 45 | FCITX_ASSERT(instance->inputMethod(ic) == "hangul"); 46 | 47 | FCITX_ASSERT(testfrontend->call( 48 | uuid, Key("q"), false)); 49 | FCITX_ASSERT(testfrontend->call( 50 | uuid, Key("Q"), false)); 51 | FCITX_ASSERT(testfrontend->call( 52 | uuid, Key(FcitxKey_Q, KeyState::CapsLock), false)); 53 | instance->deactivate(); 54 | }); 55 | 56 | instance->eventDispatcher().schedule([instance]() { instance->exit(); }); 57 | } 58 | 59 | int main() { 60 | setupTestingEnvironmentPath(TESTING_BINARY_DIR, {"bin"}, 61 | {TESTING_BINARY_DIR "/test"}); 62 | char arg0[] = "testhangul"; 63 | char arg1[] = "--disable=all"; 64 | char arg2[] = "--enable=testim,testfrontend,hangul"; 65 | char *argv[] = {arg0, arg1, arg2}; 66 | fcitx::Log::setLogRule("default=5,hangul=5"); 67 | Instance instance(FCITX_ARRAY_SIZE(argv), argv); 68 | instance.addonManager().registerDefaultLoader(nullptr); 69 | scheduleEvent(&instance); 70 | instance.exec(); 71 | 72 | return 0; 73 | } 74 | --------------------------------------------------------------------------------