использовать разные локали в kotlin - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу добавить язык в мое приложение, используя строку, английский и арабский языки. Мое приложение - расписание рейсов для конкретного аэропорта через данные JSON. и мое приложение работает нормально без проблем. Я хочу изменить язык с данных JSON на арабский язык

Строка Res в EN

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="schedule">schedule</string>
    <string name="arrival">arrival</string>
    <string name="departed">departed</string>
    <string name="cancelled">cancelled</string>
</resources>

Строка Res на арабском языке

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="schedule">مجدولة</string>
    <string name="arrival">وصلت</string>
    <string name="departed">غادرت</string>
    <string name="cancelled">الغيت</string>

</resources>

Я хочу использовать эти ресурсы в моем списке для адаптации, потому что я использовал представление списка в моем приложении

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

        val view : View = LayoutInflater.from(context).inflate(R.layout.row_layout,parent,false)

        val code = view.findViewById(R.id.code_id) as AppCompatTextView
        val status = view.findViewById(R.id.status_id) as AppCompatTextView
        val TimeFlight = view.findViewById(R.id.time_id) as AppCompatTextView
        val LogoAriline = view.findViewById(R.id.logo_image) as ImageView

        CallsingID.text = list[position].Callsign
        AirlineID.text = list[position].Airline
        code.text = list[position].code
        status.text= list[position].status
        TimeFlight.text = getDateTime(list[position].TimeFlight)
        Picasso.get().load(Uri.parse("https://www.xxxxxxx.com/static/images/data/operators/"+status.text.toString()+"_logo0.png"))
            .into(LogoAriline)



        return view as View
    }

Я хочу добавить язык внутри status.text= list[position].status

my app

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете попробовать что-то вроде:

code.text = context.getString(
        when (list[position].code) {
            "schedule" -> R.string.schedule
            "arrival" -> R.string.arrival
            "departed" -> R.string.departed
            "cancelled" -> R.string.cancelled
            else -> TODO("This is an error")
        }
    )
0 голосов
/ 10 ноября 2018

Добавьте этот флаг в манифест под тегом приложения.

android:supportsRtl="true"

Язык управления классом утилит

object LocaleManagerMew {

val SELECTED_LANGUAGE = "MEW_CURRENT_USER_LANGUAGE"
var mSharedPreference: SharedPreferences? = null

var mEnglishFlag = "en"
var mArabicFlag = "ar"

fun setLocale(context: Context?): Context {
    return updateResources(context!!, getCurrentLanguage(context)!!)
}

inline fun setNewLocale(context: Context, language: String) {

    persistLanguagePreference(context, language)
    updateResources(context, language)
}

inline fun getCurrentLanguage(context: Context?): String? {

    var mCurrentLanguage: String?

    if (mSharedPreference == null)
        mSharedPreference = PreferenceHelper.defaultPrefs(context!!)

    mCurrentLanguage = mSharedPreference!![SELECTED_LANGUAGE]

    return mCurrentLanguage
}

fun persistLanguagePreference(context: Context, language: String) {
    if (mSharedPreference == null)
        mSharedPreference = PreferenceHelper.defaultPrefs(context)

    mSharedPreference!![SELECTED_LANGUAGE] = language

}

fun updateResources(context: Context, language: String): Context {

    var contextFun = context

    var locale = Locale(language)
    Locale.setDefault(locale)

    var resources = context.resources
    var configuration = Configuration(resources.configuration)

    if (Build.VERSION.SDK_INT >= 17) {
        configuration.setLocale(locale)
        contextFun = context.createConfigurationContext(configuration)
    } else {
        configuration.locale = locale
        resources.updateConfiguration(configuration, resources.getDisplayMetrics())
    }
    return contextFun
}
}

Код класса приложения

 override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        LocaleManagerMew.setLocale(this)
        Log.d(MewConstants.mewLogs, "onConfigurationChanged: " + newConfig.locale.getLanguage())
    }

Базовое действие

abstract class BaseActivity : AppCompatActivity(){

override fun attachBaseContext(base: Context?) {
    super.attachBaseContext(LocaleManagerMew.setLocale(base))
}
}

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

override fun onClick(p0: View?) {
    when (p0?.id) {

        R.id.switchLanguage -> {
            //LocaleManagerMew.setLocale(this@LoginCustomerFragment.activity?.applicationContext)
            var mCurrentLanguage = LocaleManagerMew.getCurrentLanguage(this@LoginCustomerFragment.activity?.applicationContext)
            if (mCurrentLanguage == LocaleManagerMew.mArabicFlag) {
                LocaleManagerMew.setNewLocale(this@LoginCustomerFragment.context!!, LocaleManagerMew.mEnglishFlag)
            } else if (mCurrentLanguage == LocaleManagerMew.mEnglishFlag) {
                LocaleManagerMew.setNewLocale(this@LoginCustomerFragment.context!!, LocaleManagerMew.mArabicFlag)
            }
            activity?.recreate()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...