SwiftUIでiPhoneアプリを開発しましたが、英語/日本語別にインターネットに飛ばすURLを分岐させる方法に関連してご教示お願いします。
####SwiftUIのLocalization手法が見いだせないため、if文を使ってiPhone機種を見分ける方法で最終的には成功しました。しかし、サイト上にあるiPhonepの機種を見分ける方法が4種類見つかりましたが、3種類はエラーになりました。この4種類の違いとエラーの原因を教えてください。特に、このアプリのURLのLocalizationでは、成功した「iPhone機種分類法01」でよいのでしょうか。
###01成功したコード(iPhone機種分類法01)
let localeId = locale.identifier struct DetailView01: View { var body: some View { Group { //日本語版iPhoneの場合飛ぶURL if localeId == "ja_JP" { WebView01(url01: URL(string: "https://youtu.be/bXEwjGkX-r8")!) //英文(日本語版以外)の場合に飛ぶURL else { WebView01(url01: URL(string: "https://youtu.be/Yhh-OIWI_5w")!) } } }
###02-1エラーの出たiPhone機種分類法02
let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2) struct DetailView01: View { var body: some View { Group { //日本語版iPhoneの場合飛ぶURL if languagePrefix == "jp"{ WebView01(url01: URL(string: "https://youtu.be/bXEwjGkX-r8")!) //英文(日本語版以外)の場合に飛ぶURL else { WebView01(url01: URL(string: "https://youtu.be/Yhh-OIWI_5w")!) } } }
####02-2参考にしたサイト情報
https://stackoverflow.com/questions/24591167/how-to-get-current-language-code-with-swift
####02-3エラー結果
エラーメッセージはでないでビルドできますが、日本語版のシミュレーターおよび実機で英語版のURLが選ばれてしまいます。
###03-1エラーの出たiPhone機種分類法03
let pre = Locale.preferredLanguages[0] struct DetailView01: View { var body: some View { Group { //日本語版iPhoneの場合飛ぶURL if languagePrefix == "jp"{ WebView01(url01: URL(string: "https://youtu.be/bXEwjGkX-r8")!) //英文(日本語版以外)の場合に飛ぶURL else { WebView01(url01: URL(string: "https://youtu.be/Yhh-OIWI_5w")!) } } }
####03-2参考にしたサイト情報
https://stackoverflow.com/questions/24591167/how-to-get-current-language-code-with-swift
####03-3エラー結果
エラーメッセージはでないでビルドできますが、日本語版のシミュレーターおよび実機で英語版のURLが選ばれてしまいます。
###04-1エラーの出たiPhone機種分類法04
let locale = Locale.current struct DetailView01: View { var body: some View { Group { //日本語版iPhoneの場合飛ぶURL if locale == "jp_JP"{ WebView01(url01: URL(string: "https://youtu.be/bXEwjGkX-r8")!) } //英文(日本語版以外)の場合に飛ぶURL else { WebView01(url01: URL(string: "https://youtu.be/Yhh-OIWI_5w")!) } }
####04-2参考にしたサイト情報
https://capibara1969.com/2120/
####04-3エラー
下記のエラーがでてビルドできません。
Referencing operator function '==' on 'StringProtocol' requires that 'Locale' conform to 'StringProtocol'
###05ご参考事項
05-1
環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
Mojave OS10.15.7
Xcode Version 11.7 (11E801a)
Swift5 SwiftUI
05-2
開発したアプリは「読み上げウオッチ」
App Store https://apps.apple.com/jp/app/watch-with-voice-for-keep-fit/id1535293155
です。
よろしくご教示ください。
###06 terotailさんの教えにもとづき、修正したコード
// Tomzy SettingFree Timer // // Created by Tomiji Suzuki on R 2/08/08. // Copyright © Reiwa 2 Tomiji Suzuki. All rights reserved. import SwiftUI import WebKit struct WebView01: UIViewRepresentable { var url01: URL func makeUIView(context: Context) -> WKWebView { return WKWebView(frame: .zero) } func updateUIView(_ uiView: WKWebView, context: Context) { let req01 = URLRequest(url: url01) uiView.load(req01) } } let url = LocalizedStringKey("Douga_url") struct DetailView01: View { var body: some View { Group { WebView01(url01: URL(string: url)!) } .navigationBarTitle(Text("01kaisetsuTitle")) } } struct DetailView01_Previews: PreviewProvider { static var previews: some View { DetailView01() } }
07 Localizable.stringsに記載したコード
"Douga_url" = "https://youtu.be/bXEwjGkX-r8"; //動画の分岐日本版 "Douga_url" = "https://youtu.be/Yhh-OIWI_5w";
08 出たエラー
下図に示されたエラー
エラーのテキスト
Cannot convert value of type 'LocalizedStringKey' to expected argument type 'String'
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。