質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ローカライゼーション

ローカライゼーション(L10n)とは、地域に適した内容を付け加えたり、テキストを各国の文書に適時翻訳することによって、ソフトウェアを現地語環境に適合(地域化)させる事を指します。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

2回答

2334閲覧

SwiftUI Localization URLを分岐する方法(if文でiPhone機種を見分ける方法)

Tomzy

総合スコア104

ローカライゼーション

ローカライゼーション(L10n)とは、地域に適した内容を付け加えたり、テキストを各国の文書に適時翻訳することによって、ソフトウェアを現地語環境に適合(地域化)させる事を指します。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/10/30 06:00

編集2020/11/18 03:05

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'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

利用方法

Swift

1let url = LocalizedStringKey("your_url").stringValue() 2WebView01(url01: URL(string: url)!)

下記のような Extensionを作っておきます。

LocalizeStringKey+stringValue.swift

Swift

1import Foundation 2import SwiftUI 3 4extension LocalizedStringKey { 5 var stringKey: String { 6 let description = "(self)" 7 8 let components = description.components(separatedBy: "key: \"") 9 .map { $0.components(separatedBy: "\",") } 10 11 return components[1][0] 12 } 13} 14 15extension String { 16 static func localizedString(for key: String, 17 locale: Locale = .current) -> String { 18 19 let language = locale.languageCode 20 let path = Bundle.main.path(forResource: language, ofType: "lproj")! 21 let bundle = Bundle(path: path)! 22 let localizedString = NSLocalizedString(key, bundle: bundle, comment: "") 23 24 return localizedString 25 } 26} 27 28extension LocalizedStringKey { 29 func stringValue(locale: Locale = .current) -> String { 30 return .localizedString(for: self.stringKey, locale: locale) 31 } 32}

投稿2020/11/18 03:21

errolizer

総合スコア443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

標準的な方法を利用するのが良いかと思います。

公式)
https://developer.apple.com/documentation/swiftui/localizedstringkey

利用例)

swift

1let url = LocalizedStringKey("your_url") 2WebView01(url01: URL(string: url)!)

English

1"your_url" = "http://hoge.com/en/";

Japanese

1"your_url" = "http://hoge.com/ja/";

投稿2020/11/17 23:56

errolizer

総合スコア443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomzy

2020/11/18 01:49

ローカライズする方法を探していたのですが、わからずif文にしていました。ご教示頂きありがとうございました。早速この方法を取り入れるべくテスト中です。エラーがでて対策中です。取り急ぎご報告します。
Tomzy

2020/11/18 03:00

編集画面に記載したように、コードを修正しましたら、 Cannot convert value of type 'LocalizedStringKey' to expected argument type 'String' というエラーがでて行き詰まっています。エラーについて調べましたが、解決策が見つけられないでいます。 更に、ご教示頂ければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問