[решено] Лoкализация UIDatePicker-a


#21

datePicker.locale = Locale(identifier: “ru_RU”) - работает
datePicker.locale = Locale.autoupdatingCurrent - не работает ((
.setLocalizedDateFormatFromTemplate - тоже не помог …
Телефон полностью на русском и рст … вот как так …

Вообще не понимаю, что за ерунда происходит … причем для formatter (при выводе форматированной даты) - Locale.autoupdatingCurrent тоже не работает.


#22

Одного понять не могу, почему не работает вот это:

datePicker.locale = Locale.autoupdatingCurrent

Казалось бы, самое простое решение в одну строчку, но не работает ни для пикера, ни для форматирования даты…


#23

Товарищи, помогите, пожалуйста, как программно задать Local для datePickera в зависимости от языка пользователя? :disappointed_relieved: :disappointed_relieved: :disappointed_relieved:


#24

в проекте использую datePicker, который создан в сториборде
59
ничего не менял в настройках. тестирую на симуляторе. был язык устройства английский, зашел в настройки и поменял на русский и пикер сам поменял названия

в другом месте использую пикер, созданный через код и там тоже автоматом меняется
код создания пикера

let dataPicker = UIDatePicker()       
@objc func createPicker() {
        dataPicker.datePickerMode = .date
        dateOfBirthRegisterTF.inputView = dataPicker
    
            let toolbar = UIToolbar()
            toolbar.sizeToFit()
            let done = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
            toolbar.setItems([done], animated: false)
            dateOfBirthRegisterTF.inputAccessoryView = toolbar
    
    }

#25

пробовала тоже самое и не меняется, всегда английский … как так … меняется только если принудительно указать datePicker.locale = Locale(identifier: “ru_RU”)

блин, хоть батюшку взывай …


#26

а у вас есть Localizable.strings файлы?


#27

я и с и без пробовала … но ведь оно должно работать не через эти файлы, а через current … ведь если принудительно указывать - работает же


#28

Может есть какой-то способно сперва получить эту Локаль принудительно на основании языка телефона или ещё как-то?


#29

Бубен купи. Может поможет. Сможешь отрезок кода скинуть где создаешь датаПикер кинуть?


#30

полистайте на досуге


#31

:joy: :joy: :joy: да похоже надо

@IBOutlet weak var txtDatePicker: UITextField!
let datePicker = UIDatePicker()

во viewDidLoad:

showDatePicker()

Ну и сам пикер

func showDatePicker(){

        datePicker.datePickerMode = .date
//        datePicker.locale = Locale.autoupdatingCurrent
//        datePicker.locale = Locale.current

        let toolbar = UIToolbar();
        toolbar.sizeToFit()
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker));
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
        
        toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
        
        txtDatePicker.inputAccessoryView = toolbar
        txtDatePicker.inputView = datePicker
        
    }
    
    @objc func donedatePicker(){
        
        let formatter = DateFormatter()
        formatter.dateFormat = "dd/MMMM/yyyy"
        
        txtDatePicker.text = formatter.string(from: datePicker.date)
        self.view.endEditing(true)
    }
    
    @objc func cancelDatePicker(){
        self.view.endEditing(true)
    }

#32

Ещё раз спрошу: в приложении (в xCode) создана нужная (русская) локализация? Если нет, то всё отображается в дефолтной - английской на ВСЕХ девайсах независимо от локали на устройстве


#33

выше писала, что пробовала по разному


#34

дейтсвительно… может просто пикер пересоздать через сториборд и проверить? )))


#35

может что то неправильно сделала с локализацией? у меня все работает


#36

у меня все даты проходят через расширение для Formatter и таких методов много, под разные форматы дат

static let mediumDate: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .none
        formatter.locale = Locale.current
        
        return formatter
    }()

Locale.current это тоже расширение

extension Locale {
    static var current: Locale { return Locale.init(identifier: Language.language.rawValue) }
}

вот и сам Language

enum Language: String, CaseIterable {
    
    case english = "en"
    case german = "de"
    case spanish = "es"
    case french = "fr"
    case russian = "ru"
    case japanese = "ja"
    case dutch = "nl"
    case portuguese = "pt"
    case norway = "nb"

    // other methods
    }

По сути вам стоит использовать расширение для Formatter, только указывать там локаль от девайса

P.S. это возможно будет будущая статья, как использовать разные переводы и хранить их на сервере, используя только дефолтную локализацию, что бы была возможность редактировать/исправлять их без нужды обновлять само приложение.


#37

у меня без всяких расширений работает всё нормально - даже без указания дефолтной локали (она и так стоит по дефолту). Пикер из сториборда создан.

func myDateFormatter(date: Date)->(String) {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .none
        let dateToString = formatter.string(from: date)
        return dateToString
    }

Скрин из симулятора.
14


#38

В моем случае я храню выбранный язык в UserDefaults, т.к. у нас в приложении язык меняется внутри самого приложения и устанавливается соответственно только для приложения. Т.е. у нас приложение не зависит от языка девайса.


#39

Я так понимаю именно такой способ правильный. Потом так же сделаю, а вот до этого делал просто через локализацию )))


#40

для iOS это делается легче, т.к. можно подменить Localization.strings из своего бандла
в Android ресурсы подменять/редактировать программно нельзя, поэтому в Android’e это делается с помощью локальной БД.

можно конечно в обоих случаях хранить перевод в UserDefaults/SharedPreferences соответственно, но это лишний геморой для поиска перевода.

P.S. единственная сложность с переводом - это избавиться от перезагрузки приложения после смены языка. Это все решается, но требует значительного объема кода. Для примера смены языка без перезагрузки можно посмотреть приложение Jira.
О сторонних сервисах для real-time переводов я молчу.