3

I have several TextFields in my View and I would like change the language of the keyboard depending on in which TextField the user tapped. I know I can change the type like .numberPad, but how for languages?

Jonas Deichelmann
  • 3,513
  • 1
  • 30
  • 45
Erik
  • 449
  • 5
  • 13
  • [This answer](https://stackoverflow.com/q/28318076/725628) suggests it's not possible. It's a bit of an older answer, but I don't think it has changed. Did you do a good web search for this before asking the question? If you did and couldn't find a positive answer it probably just means it's not possible. – EmilioPelaez Jan 31 '21 at 14:47
  • Build a custom keyboard https://developer.apple.com/documentation/uikit/keyboards_and_input/creating_a_custom_keyboard – mahan Jan 31 '21 at 15:29

1 Answers1

1

If the user has added the language to his keyboards you can make a custom textfield and do the following:

create a custom textfield and textfield view

import Foundation
import UIKit
import SwiftUI

class SpecificLanguageTextField: UITextField {
    
    var language: String? {
        didSet {
            if self.isFirstResponder{
                self.resignFirstResponder();
                self.becomeFirstResponder();
            }
        }
    }
    
    override var textInputMode: UITextInputMode? {
        if let language = self.language {
            for inputMode in UITextInputMode.activeInputModes {
                if let inputModeLanguage = inputMode.primaryLanguage, inputModeLanguage == language {
                    return inputMode
                }
            }
        }
        return super.textInputMode
    }
    
}

struct SpecificLanguageTextFieldView: UIViewRepresentable {

    let placeHolder: String
    var language: String = "en-US"
    @Binding var text: String

    func makeUIView(context: Context) -> UITextField{
        let textField = SpecificLanguageTextField(frame: .zero)
        textField.placeholder = self.placeHolder
        textField.text = self.text
        textField.language = self.language
        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
    }

}

And then use it like this:

import SwiftUI

struct SpecificLanguageView: View {
    @State var text: String = ""
    var body: some View {
        SpecificLanguageTextFieldView(placeHolder: "test", language: "en-GB", text: $text)
    }
}

struct SpecificLanguageView_Previews: PreviewProvider {
    static var previews: some View {
        SpecificLanguageView()
    }
}
ARR
  • 2,074
  • 1
  • 19
  • 28