Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

日本語環境でSwiftUIの BudouXText がBudouXパーサーを使用しない #22

Closed
yuntan opened this issue Jun 10, 2023 · 10 comments
Closed
Assignees

Comments

@yuntan
Copy link

yuntan commented Jun 10, 2023

スクリーンショット 2023-06-10 11 00 49

環境はmacOS 13.4 Ventura, Xcode 15.0 betaです。

以下再現コードになります。

import SwiftUI

import BudouX

struct ContentView: View {
    var body: some View {
        VStack(spacing: 24) {
            BudouXText("ダウンロードありがとうございます!")
                .font(.title)
            
            BudouXText("25がApple Watchにインストールされていることを確認しましょう。")
            
            BudouXText("iPhoneでWatchアプリを開きます。")
            
            BudouXText("25がインストールされていることを確認します。")
            
            BudouXText("このような表示になっている場合は、インストールに時間がかかっています。しばらく待ってみてください。")
        }
        .multilineTextAlignment(.center)
    }
}
@yuntan
Copy link
Author

yuntan commented Jun 10, 2023

macOS 13.4 Ventura, Xcode 14.3でも再現しました。

@yuntan yuntan changed the title 適切な位置で改行されない 単語の途中で改行される Jun 10, 2023
@yuntan
Copy link
Author

yuntan commented Jun 10, 2023

どうやら、 BudouXText(verbatim:, parser:, condition:) まで処理が届いていないようです。
スクリーンショット 2023-06-10 15 27 58

@yuntan
Copy link
Author

yuntan commented Jun 10, 2023

以下のように修正すると単語の途中で改行されないようになりました。

            BudouXText(verbatim: "ダウンロードありがとうございます!") { _ in true }
スクリーンショット 2023-06-10 15 36 17

(本当は「ダウンロード」「ありがとうございます!」と改行して欲しいところなのですが。)

defaultBudouXTextCondition に問題があるようですね。

@yuntan
Copy link
Author

yuntan commented Jun 10, 2023

ロケールが日本語かどうか判断するのであれば

    public let defaultBudouXTextCondition: (Set<String>) -> Bool = { naturalLanguagesSupportedByParser in
        guard let lang = Locale.current.language.languageCode?.identifier else {
            return false
        }
        naturalLanguagesSupportedByParser.contains(lang)
    }

でいいのかなと思うのですが、どうでしょうか。

@yuntan yuntan changed the title 単語の途中で改行される 日本語環境でSwiftUIの BudouXText がBudouXパーサーを使用しない Jun 10, 2023
@griffin-stewie griffin-stewie self-assigned this Jun 13, 2023
@griffin-stewie
Copy link
Owner

@yuntan
Issue の登録ありがとうございました。

報告された内容をこちらで検証してみました。

「日本語環境でSwiftUIの BudouXText がBudouXパーサーを使用しない」という Issue に対する現状の私の結論としては、

動作環境(OS)の設定が日本語環境であっても、アプリケーション側が日本語に対応していない場合は、BudouX.swift としては何もせずに Text を使うのが想定動作でありバグではない

となります。

詳細説明

まず、現状の BudouX.swift が提供する BudouXText の想定仕様として以下のようになっています。

  • オリジナル実装である BudouX がサポートしている言語をサポートしているアプリケーションであれば、BudouX によって改行位置がより言語的に自然になるように前処理を行う
  • アプリケーション側がサポートしている言語が、オリジナル実装である BudouX がサポートしていない言語であった場合は、 BudouX.swift は介入せず、SwiftUI 標準である Text を使う

重要なポイントは「アプリケーションがサポートしている言語かどうか」です。OS の設定や入力として与えられた文字列がどの言語かは関係ありません。

私の認識では、Locale.current はシステムの設定 + アプリがサポートしている言語 を加味した結果の Locale インスタンスが返されるものです。

一般的な日本語環境の設定(ja_JP)のマシン上で、Xcode のテンプレートから作成しただけのアプリケーションを動作させると、Locale.current.language.languageCodeen になっていると思われます。
developmentRegioniOSアプリのローカライズとローカリゼーションのデバッグ - 開発言語の変更、ストーリーボードと文字列のローカライズ、ローカライズされていない文字列の特定とデバッグ - Qiita⁤ を参考に ja に変更した場合は、Locale.current.language.languageCodeja になっていると思われます。
当然ながら、Localizable.strings を追加し、日本語にローカライズした場合にはLocale.current.language.languageCodeja になっているはずです。

このような仕組みになっているため、言語の判定処理に Locale.current という一見すると素直な実装を意図的に使っていません。ライブラリ側に言語判定をするためだけに存在している Localizable.strings を用意して "net.cyan-stivy.budoux-swift.LocalizationFinder.Key" で identifier が取得できるようにしています。

@griffin-stewie
Copy link
Owner

(本当は「ダウンロード」「ありがとうございます!」と改行して欲しいところなのですが。)

@yuntan

こちらに関しては オリジナル実装である BudouX が対応してくれてたようなので、BudouX.swift 側に同梱させている学習モデルも近いうちアップデートしたいと思います。

フィードバックありがとうございました。

@yuntan
Copy link
Author

yuntan commented Jun 13, 2023

詳細にご説明いただきありがとうございます。

重要なポイントは「アプリケーションがサポートしている言語かどうか」です。OS の設定や入力として与えられた文字列がどの言語かは関係ありません。

OSの言語設定:日本語
アプリの対応言語:英語
文字列:日本語
の場合は、 Text にフォールバックするということで理解しました。

また、ProjectのLocalizationにJapaneseを追加し、Localizable.stringsを追加しLocalizationをJapaneseに設定した場合に、BudouXが適用されることを確認しました。

上記については理解できたのですが、 Locale.current を使わない理由については理解できなかったです。 Locale.current がOSの言語設定を加味しているため使っていないということでしょうか?

こちらに関しては オリジナル実装である BudouX が対応してくれてたようなので、BudouX.swift 側に同梱させている学習モデルも近いうちアップデートしたいと思います。

フィードバックありがとうございました。

少しでもお役に立てたなら幸いです。

@griffin-stewie
Copy link
Owner

@yuntan
Locale.current には想定外の挙動が多く Qiita 等に記事がいくつも上がっているのでそちらを参照いただくのが良いかと思います。

例えば、以下の記事にも BudouX.swift が採用している方法が紹介されており現状のベストプラクティスというのが分かっていただけるかと思います。

iOSの言語設定を取得するベストプラクティス(Swift) - Qiita

@yuntan
Copy link
Author

yuntan commented Jun 13, 2023

ありがとうございます。理解しました。

@griffin-stewie
Copy link
Owner

@yuntan
「ありがとう」のハンドリングが改善されたモデル を同梱した v0.8.0 をリリースしました。

# 古いバージョンの動作
❯ budoux-swift -l ja "ダウンロードありがとうございます!" 
ダウンロードありが
とうございます!

# 新しいバージョンの動作
❯ ./budoux-swift -l ja "ダウンロードありがとうございます!"              
ダウンロード
ありがとう
ございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants