Multilingual typing: main locale is not guaranteed to be dictionaryGroups[0] (HashSet in getUsedLocales)
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 半日
- 初心者へのやさしさ
- 62/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
調査の方向性
Start in DictionaryFacilitatorImpl.getUsedLocales(), where hashSetOf(mainLocale) is built, and in getNewDictGroupsAndDictsToCleanup(), which creates the groups in that set's iteration order. Then check the dictionaryGroups[0] call sites the issue lists: mainLocale, currentlyPreferredDictionaryGroup, getSuggestionResults(), isActive() and LatinIME.resetSuggestMainDict(). Done when the main locale is always group 0 regardless of Locale.hashCode(), for example with a linkedSetOf change, and a test or debug output confirms the order for en_US with de.
索引モデルが issue の本文から書いたものです。
説明
Describe the bug
With a secondary language (multilingual typing), the main locale of the layout is not guaranteed to be the first dictionary group. DictionaryFacilitatorImpl.getUsedLocales() collects the locales in a HashSet:
val locales = hashSetOf(mainLocale)
locales.addAll(getSecondaryLocales(selectedSubtype.extraValue))
getNewDictGroupsAndDictsToCleanup() creates the groups in the iteration order of that set, and a HashSet doesn't keep insertion order. But a lot of code assumes dictionaryGroups[0] is the main locale:
mainLocale=dictionaryGroups[0].locale, also used byLatinIME.resetSuggestMainDict(), which callsresetDictionaries(this, dictionaryFacilitator.mainLocale, ...). If that is the secondary locale,getUsedLocales()goes into the "called from the spell checker" branch, and as far as I can see the keyboard can end up with only the secondary language.currentlyPreferredDictionaryGroup=maxBy { it.confidence }returns the first group on a tie. At the start all groups have confidence 1, so the tie goes to whichever locale the HashSet put first.getSuggestionResults()queries only group 0 synchronously and waits at most 120 ms for the others.isActive(),isValidSuggestionWord(), the personal-dictionary check inaddToUserHistory()anddumpDictionaryForDebug()also use group 0.
Which pairs are affected depends on Locale.hashCode(). A quick check on a desktop JVM (Java 21) shows the secondary locale first for 7 of 12 common pairs, e.g. main en_US + secondary de, fr or es, and main nl or pl + secondary en_US. On our devices (Android 15/17), de_DE + en_US happened to come out in the right order, so Android's order differs from the JVM, but it is still not defined.
Possible fix
Keep the insertion order (that's what we did):
val locales = linkedSetOf(mainLocale)
To Reproduce
- Set up a layout with a secondary language via Multilingual typing, e.g. English (US) with German.
- Depending on the pair, the secondary locale becomes
dictionaryGroups[0]. With debug mode on, the space bar shows the order of the locales (localesAndConfidences()).
Expected behavior
The layout's main locale is always the first dictionary group.
App version & Flavor
Found in GlassType, my fork, now based on LeanType 4.3.1 (0e673e1). The code is unchanged in current main.
Device Info
- Model: Samsung Galaxy Z Fold 3 (SM-F926B) and Galaxy S23 Ultra (SM-S918B)
- OS version: Android 15 / Android 17
- 主要言語
- Kotlin
- スター
- 1k
- フォーク
- 59
- 平均マージ
- 14時間 9分
- マージ済み PR(30日)
- 56
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
LeanBitLab/LeanType のほかの issue
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
LeanBitLab/LeanType#766 ·
メンテナーはふだん 1 日以内に返信
-
[Bug] Silence timeout doesn't close interface and start transcription; causes silent loss of dictated speech.対応中かも @LeanBitLab が今日担当しました。 オープンbug
LeanBitLab/LeanType#765 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
LeanBitLab/LeanType#764 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 4/5 3〜5日 初心者へのやさしさ 30/100
LeanBitLab/LeanType#757 · コメント 7 件 ·
メンテナーはふだん 1 日以内に返信
-
More suggestions based on version 1.0.1 of the CJK plugin対応中かも @LeanBitLab が 2 日前に担当しました。 オープンenhancement
難易度 4/5 3〜5日 初心者へのやさしさ 38/100
LeanBitLab/LeanType#754 · コメント 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
LeanBitLab/LeanType の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
open-telemetry/opentelemetry-android#2183 ·
メンテナーはふだん 2 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 62/100
Droid-Deck/DroidDeck#2058 ·
メンテナーはふだん 1 日以内に返信
-
bug core p3
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
RunanywhereAI/runanywhere-sdks#1258 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
axelixlabs/axelix#1918 ·
メンテナーはふだん 1 日以内に返信