Merge pull request #207 from chihung93/feature/add_vn

Feature/add_Vietnamese_Telex
This commit is contained in:
Tibor Kaputa 2023-06-27 11:39:32 +02:00 committed by GitHub
commit 056ab4d4f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 2652 additions and 3 deletions

File diff suppressed because it is too large Load Diff

View File

@ -187,6 +187,7 @@ fun Context.getKeyboardLanguages(): ArrayList<RadioItem> {
RadioItem(LANGUAGE_SPANISH, getKeyboardLanguageText(LANGUAGE_SPANISH)),
RadioItem(LANGUAGE_SWEDISH, getKeyboardLanguageText(LANGUAGE_SWEDISH)),
RadioItem(LANGUAGE_TURKISH_Q, getKeyboardLanguageText(LANGUAGE_TURKISH_Q)),
RadioItem(LANGUAGE_VIETNAMESE_TELEX, getKeyboardLanguageText(LANGUAGE_VIETNAMESE_TELEX)),
)
}
@ -209,6 +210,7 @@ fun Context.getKeyboardLanguageText(language: Int): String {
LANGUAGE_SPANISH -> getString(R.string.translation_spanish)
LANGUAGE_SWEDISH -> getString(R.string.translation_swedish)
LANGUAGE_TURKISH_Q -> "${getString(R.string.translation_turkish)} (Q)"
LANGUAGE_VIETNAMESE_TELEX -> "${getString(R.string.translation_vietnamese)} (Telex)"
else -> "${getString(R.string.translation_english)} (QWERTY)"
}
}

View File

@ -43,6 +43,7 @@ const val LANGUAGE_NORWEGIAN = 14
const val LANGUAGE_SWEDISH = 15
const val LANGUAGE_DANISH = 16
const val LANGUAGE_FRENCH_BEPO = 17
const val LANGUAGE_VIETNAMESE_TELEX = 18
// keyboard height multiplier options
const val KEYBOARD_HEIGHT_MULTIPLIER_SMALL = 1
@ -50,3 +51,4 @@ const val KEYBOARD_HEIGHT_MULTIPLIER_MEDIUM = 2
const val KEYBOARD_HEIGHT_MULTIPLIER_LARGE = 3
const val EMOJI_SPEC_FILE_PATH = "media/emoji_spec.txt"
const val LANGUAGE_VN_TELEX = "language/extension.json"

View File

@ -1,8 +1,11 @@
package com.simplemobiletools.keyboard.helpers
import android.content.Context
import org.json.JSONObject
import java.io.InputStream
private var cachedEmojiData: MutableList<String>? = null
val cachedVNTelexData: HashMap<String, String> = HashMap()
/**
* Reads the emoji list at the given [path] and returns an parsed [MutableList]. If the
@ -59,3 +62,25 @@ fun parseRawEmojiSpecsFile(context: Context, path: String): MutableList<String>
cachedEmojiData = emojis
return emojis
}
fun parseRawJsonSpecsFile(context: Context, path: String): HashMap<String, String> {
if (cachedVNTelexData.isNotEmpty()) {
return cachedVNTelexData
}
try {
val inputStream: InputStream = context.assets.open(path)
val jsonString = inputStream.bufferedReader().use { it.readText() }
val jsonData = JSONObject(jsonString)
val rulesObj = jsonData.getJSONObject("rules")
val ruleKeys = rulesObj.keys()
while (ruleKeys.hasNext()) {
val key = ruleKeys.next()
val value = rulesObj.getString(key)
cachedVNTelexData[key] = value
}
} catch (ignored: Exception) {
return HashMap()
}
return cachedVNTelexData
}

View File

@ -178,9 +178,35 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
switchToLetters = true
}
} else {
inputConnection.commitText(codeChar.toString(), 1)
if (originalText == null) {
updateShiftKeyState()
when {
originalText != null && originalText.isNotEmpty() && cachedVNTelexData.isNotEmpty() -> {
val fullText = originalText.toString() + codeChar.toString()
val lastIndexEmpty = if (fullText.contains(" ")) {
fullText.lastIndexOf(" ")
} else 0
if (lastIndexEmpty >= 0) {
val word = fullText.subSequence(lastIndexEmpty, fullText.length).trim().toString()
val wordChars = word.toCharArray()
val predictWord = StringBuilder()
for (char in wordChars.size - 1 downTo 0) {
predictWord.append(wordChars[char])
val shouldChangeText = predictWord.reverse().toString()
if (cachedVNTelexData.containsKey(shouldChangeText)) {
inputConnection.setComposingRegion(fullText.length - shouldChangeText.length, fullText.length)
inputConnection.setComposingText(cachedVNTelexData[shouldChangeText], fullText.length)
inputConnection.setComposingRegion(fullText.length, fullText.length)
return
}
}
inputConnection.commitText(codeChar.toString(), 1)
}
}
else -> {
inputConnection.commitText(codeChar.toString(), 1)
if (originalText == null) {
updateShiftKeyState()
}
}
}
}
}

View File

@ -418,6 +418,11 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
}
setupEmojiPalette(toolbarColor = toolbarColor, backgroundColor = mBackgroundColor, textColor = mTextColor)
if (context.config.keyboardLanguage == LANGUAGE_VIETNAMESE_TELEX) {
setupLanguageTelex()
} else {
cachedVNTelexData.clear()
}
setupStoredClips()
}
@ -1506,6 +1511,13 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
}
}
// For Vietnamese - Telex
private fun setupLanguageTelex() {
ensureBackgroundThread {
parseRawJsonSpecsFile(context, LANGUAGE_VN_TELEX)
}
}
private fun setupEmojiAdapter(emojis: List<String>) {
mEmojiPaletteHolder?.emojis_list?.apply {
val emojiItemWidth = context.resources.getDimensionPixelSize(R.dimen.emoji_item_size)

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple Keyboard</string>
<string name="app_launcher_name">Bàn phím</string>
<string name="redirection_note">Vui lòng bật Bàn phím đơn giản trên màn hình tiếp theo để biến nó thành bàn phím khả dụng. Nhấn \'Quay lại\' sau khi được bật.</string>
<string name="change_keyboard">Thay đổi bàn phím</string>
<!-- Clipboard -->
<string name="manage_clipboard_items">Quản lý các mục trong khay nhớ tạm</string>
<string name="manage_clipboard_empty">Khay nhớ tạm của bạn trống.</string>
<string name="manage_clipboard_label">Sau khi bạn sao chép một số văn bản, văn bản đó sẽ hiển thị ở đây. Bạn cũng có thể ghim các clip để sau này chúng không biến mất.</string>
<string name="clear_clipboard_data">Xóa dữ liệu trong khay nhớ tạm</string>
<string name="clear_clipboard_data_confirmation">Bạn có chắc chắn muốn xóa dữ liệu clipboard không?</string>
<string name="clipboard">Khay nhớ tạm</string>
<string name="clipboard_recent">Gần đây</string>
<string name="clipboard_current">Hiện tại</string>
<string name="clipboard_pinned">Đã ghim</string>
<string name="add_new_item">Thêm mục mới</string>
<string name="manage_clips">Bạn có thể quản lý hoặc thêm clip tại đây để truy cập nhanh.</string>
<string name="clip_text">Clip văn bản</string>
<string name="pin_text">Ghim văn bản</string>
<string name="text_pinned">Văn bản đã được ghim</string>
<string name="export_clipboard_items">Xuất các mục trong khay nhớ tạm</string>
<string name="import_clipboard_items">Nhập các mục trong khay nhớ tạm</string>
<!-- Accessibility -->
<string name="keycode_delete">Xóa</string>
<string name="keycode_mode_change">Thay đổi kiểu bàn phím</string>
<string name="keycode_shift">Shift</string>
<string name="keycode_enter">Nhập</string>
<string name="keycode_space">Phím cách</string>
<!-- Settings -->
<string name="show_clipboard_content">Hiển thị nội dung khay nhớ tạm nếu có</string>
<string name="show_popup">Hiển thị cửa sổ bật lên khi nhấn phím</string>
<string name="vibrate_on_keypress">Rung khi nhấn phím</string>
<string name="keyboard_language">Ngôn ngữ bàn phím</string>
<string name="keyboard_height">Chiều cao bàn phím</string>
<string name="show_key_borders">Hiển thị đường viền phím</string>
<string name="show_numbers_row">Hiển thị số trên một hàng riêng</string>
<string name="start_sentences_capitalized">Bắt đầu câu bằng chữ in hoa</string>
<!-- Emojis -->
<string name="emojis">Biểu tượng cảm xúc</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>