From d072885e6e36885d530717f0c41faed4f64d5a94 Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Mon, 29 Aug 2016 00:04:26 -0500 Subject: [PATCH 1/9] Feature: Add ListPreference for language switcher to settings activity This commit adds the Language entries & language values arrays so that the list preference can reference them in the settings activity. It also adds said ListPreference XML element to be used as a language switcher. --- Habitica/res/values/values.xml | 61 +++++++++++++++++++++++ Habitica/res/xml/preferences_fragment.xml | 8 +++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 6 +-- 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index ad1ca667d..d68f5ff87 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -33,4 +33,65 @@ @string/avatar_size_slim @string/avatar_size_broad + + + English + Български + Čeština + Dansk + Deutsch + Pirate English + British English + Español + Español (América Latina) + Français + עברית + Magyar + Bahasa Indonesia + Italiano + 日本語 + Nederlands + Polski + Português + Português Brasileiro + Română + Русский + Slovenský + Srpski + Svenska + Українська + 中文(简体) + 中文(正體) + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + + diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 46d5b2e1b..f081d3b80 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -54,10 +54,18 @@ android:key="choose_class" android:order="2"/> + + + Date: Mon, 29 Aug 2016 23:54:15 -0500 Subject: [PATCH 2/9] Feature: Remove unnecessary languages & add values to the resource files This commit removes languages whose translations are not available in Android from the ListPreference element. It also adds a couple of string values belonging to the ListPreference element that allow for easy translation. Finally, it adds some logic to respond to the SharedPreference change listener. --- Habitica/res/values/strings.xml | 2 ++ Habitica/res/values/values.xml | 18 ---------- Habitica/res/xml/preferences_fragment.xml | 6 ++-- .../preferences/AccountDetailsFragment.java | 6 ++-- .../preferences/PreferencesFragment.java | 34 +++++++++++++------ 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 0aa13106f..54d846158 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -15,6 +15,8 @@ Your User ID API Token Your API Token + Language + Change Habitica\'s language Contact me An error happened… Account diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index d68f5ff87..d25a6ff88 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -37,13 +37,9 @@ English Български - Čeština - Dansk Deutsch - Pirate English British English Español - Español (América Latina) Français עברית Magyar @@ -54,12 +50,7 @@ Polski Português Português Brasileiro - Română Русский - Slovenský - Srpski - Svenska - Українська 中文(简体) 中文(正體) @@ -67,13 +58,9 @@ 0 1 - 2 - 3 4 - 5 6 7 - 8 9 10 11 @@ -84,12 +71,7 @@ 16 17 18 - 19 20 - 21 - 22 - 23 - 24 25 26 diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index f081d3b80..b6ed3580b 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -54,11 +54,11 @@ android:key="choose_class" android:order="2"/> - getAccountDetailsPreferences() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 72bfc2cf7..47b6a870a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -1,5 +1,17 @@ package com.habitrpg.android.habitica.ui.fragments.preferences; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.util.Log; + import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.NotificationPublisher; @@ -14,18 +26,8 @@ import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; -import android.util.Log; - import java.util.Calendar; +import java.util.Locale; import javax.inject.Inject; @@ -197,6 +199,16 @@ public class PreferencesFragment extends BasePreferencesFragment implements } else { pushNotificationManager.removePushDeviceUsingStoredToken(); } + } else if (key.equals("language")) { + Log.v("test", sharedPreferences.getString(key,"0")); + Locale locale = new Locale("es"); + Locale.setDefault(locale); + Configuration configuration = new Configuration(); + configuration.locale = locale; + getActivity().getResources().updateConfiguration(configuration, + getActivity().getResources().getDisplayMetrics()); + + } } From 548fa9af6b46260a42d8f559a5ce92796b88c390 Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Thu, 1 Sep 2016 23:05:49 -0500 Subject: [PATCH 3/9] Feature: Complete logic for the SharedPreferences change listener This commit completes the logic of the onSharedPreferencesChanged listener. It pushes the chosen language to the Habitica web app so the web app can have the same language as the Android app. --- Habitica/res/values-in/strings.sidebar.xml | 18 + Habitica/res/values-in/strings.tutorial.xml | 14 + Habitica/res/values-in/strings.xml | 322 +++++++++++++++++ Habitica/res/values-iw/strings.sidebar.xml | 19 + Habitica/res/values-iw/strings.tutorial.xml | 14 + Habitica/res/values-iw/strings.xml | 328 ++++++++++++++++++ Habitica/res/values/values.xml | 36 +- .../preferences/PreferencesFragment.java | 91 ++++- 8 files changed, 822 insertions(+), 20 deletions(-) create mode 100644 Habitica/res/values-in/strings.sidebar.xml create mode 100644 Habitica/res/values-in/strings.tutorial.xml create mode 100644 Habitica/res/values-in/strings.xml create mode 100644 Habitica/res/values-iw/strings.sidebar.xml create mode 100644 Habitica/res/values-iw/strings.tutorial.xml create mode 100644 Habitica/res/values-iw/strings.xml diff --git a/Habitica/res/values-in/strings.sidebar.xml b/Habitica/res/values-in/strings.sidebar.xml new file mode 100644 index 000000000..f6a378ec7 --- /dev/null +++ b/Habitica/res/values-in/strings.sidebar.xml @@ -0,0 +1,18 @@ + + + Tugas + Keahlian + Sosial + Kedai + Teman + Beli Permata + Kelompok + Tantangan + Inventori + Avatar + Perlengkapan + Istal + Berita + Pengaturan + Tentang Kami + diff --git a/Habitica/res/values-in/strings.tutorial.xml b/Habitica/res/values-in/strings.tutorial.xml new file mode 100644 index 000000000..0b28c2cb5 --- /dev/null +++ b/Habitica/res/values-in/strings.tutorial.xml @@ -0,0 +1,14 @@ + + + Lakukan Kebiasaan Baik untuk mendapatkan emas dan pengalaman! Kebiasaan Buruk akan menyakiti avatarmu jika kamu mengetuknya, jadi hindari melakukannya di dunia nyata! + Kalahkan tugas harianmu yang berulang untuk mendapatkan emas dan pengalaman. Bahaya! Keseharian akan menyakiti avatarmu jika kamu tidak menyelesaikannya tepat waktu. + Lakukan Tugasmu di dunia nyata, lalu ceklis daftar untuk EMAS dan PENGALAMAN sehingga kamu bisa mendapatkan Hadiah dan membuka fitur baru! + Ini adalah Hadiahmu! Dapatkan emas dengan menyelesaikan Tugas dunia-nyata, Keseharian, dan Daftar Tugas. Kemudian habiskan untuk Hadiah dalam game atau Hadiah dunia nyata kustom! + Perlengkapan yang kamu beli akan muncul di sini. Perlengkapan Bertarung milikmu akan mempengaruhi status, dan Kostum (jika dicentang) hanya mempengaruhi apa yang avatarmu kenakan. + Dapatkan item dengan menyelesaikan tugas dan meningkatkan level. Ketuk pada item untuk menggunakannya! + Seiring kamu menyelesaikan tugas dunia-nyata, kamu sekarang memiliki kesempatan acak untuk menemukan telur dan ramuan. Campurkan mereka untuk menetaskan peliharaan + Keahlian adalah kemampuan spesial yang memiliki efek yang kuat! Ketuk pada suatu keahlian untuk menggunakannya. Keahlian akan mengurangi Mana (baris biru), di mana kamu bisa mendapatkannya dengan mengecek aplikasi setiap hari dan dengan menyelesaikan tugas dunia-nyatamu. Periksa FAQ pada menu untuk info lebih lanjut! + Ini adalah bagian dimana kamu dan teman-temanmu dapat menjaga masing-masing agar tetap bertanggung jawab sekaligus melawan monster-monster dengan tugasmu! + Selamat datang di Kedai Minuman, ruang berbincang publik untuk semua umur! Disini kamu dapat berbincang mengenai produktivitas dan menanyakan pertanyaan. Selamat bersenang-senang! + Pilih untuk menjadi Prajurit, Penyihir, Penyembuh, atau Perampok! Setiap kelas memiliki perlengkapan dan kemampuan yang unik. Ketuk (?) untuk mengetahui lebih lanjut! + diff --git a/Habitica/res/values-in/strings.xml b/Habitica/res/values-in/strings.xml new file mode 100644 index 000000000..00852c7b7 --- /dev/null +++ b/Habitica/res/values-in/strings.xml @@ -0,0 +1,322 @@ + + + Habitica + Muat Ulang + Pengalaman + Kesehatan + Mana + Pengaturan tidak dapat dimuat dari barkode + + Pengaturan + Server kustom anda + ID Pengguna + ID Pengguna Anda + Token API + Token API Anda + Kontak saya + Terjadi kesalahan... + Akun + Peringatan Harian + Aktifkan Peringatan + Atur Waktu Peringatan + + Nilai + Tugas baru + Hadiah baru + Keseharian baru + Kebiasaan baru + Edit + Hapus + Batal + Masuk + Daftar + Username + Email atau Username + Kata Sandi + Alamat Email + Konfirmasi kata sandi + Keluar + Keluar dari akun anda + Detail Akun + Selamat Datang + Pulihkan + Tolong hubungkan aplikasi sebelum menggunakan widget + Tentang Kami + Pustaka + Sejarah Versi + Habitica tersedia sebagai perangkat lunak open source pada Github + Nilai Aplikasi kami + Kirimkan kami Feedback! + Laporkan Gangguan + Kode + + Koneksi Gagal + Anda tidak terhubung ke internet. + Terdapat masalah pada server. Cobalah beberapa saat lagi. + Autentikasi Gagal + Username Anda dan/atau Kata Sandi salah. + Validasi Gagal + Anda harus mengisi semua kolom. + Simpan + Catatan + Teks + Tingkat Kesulitan + Label + Sangat Mudah + Mudah + Sedang + Susah + Tanggal Mulai + Positif (+) + Negatif (-) + Ceklis + Aksi + Atribut + Fisik + Mental + Sosial + Lain-lain + Frekuensi + Pada Hari Tertentu dalam Seminggu + Setiap X Hari + Senin + Selasa + Rabu + Kamis + Jumat + Sabtu + Minggu + Kamu mendapatkan level! + Dengan menyelesaikan tujuan dunia-nyatamu, kamu meningkat ke Level %1$d! + Kamu telah disembuhkan! + Hore! + Jangan bersedih! + Kamu kehilangan Level, Emasmu, dan sepotong Perlengkapan, tetapi kamu dapat mendapatkannya kembali dengan kerja keras! Semoga berhasil--kamu pasti bisa. + Kamu kehabisan Nyawa! + Filter + Gambar Profil + %d MP + Kamu menggunakan %1$s dengan %2$d mana. + ceklis item baru + Tambahkan + Ingatlah untuk mencentang Keseharianmu! + Gunakan Kemampuan + Akan Datang + Apakah kamu yakin kamu ingin melaporkan pesan ini sebagai pelanggaran? + Laporkan Pesan + Buka pada lvl 11 + Kamu tidak memiliki teman. Untuk mencari teman, tolong kunjungi situs. + Lupa Kata Sandi + Lupa Kata Sandi? Tolong gunakan Situs mobile + Aktifkan kembali Keseharianmu + Nonaktifkan Keseharianmu + Beli + Hilangkan + Teman + Obrolan + Anggota + Kebiasaan + Keseharian + Tugas + Hadiah + Apakah kamu yakin? + Apakah kamu benar-benar ingin menghapus? + Ya + Tidak + Misi + Tubuh + Rambut + Baju + Kulit + Telinga Hewan + Dasar + Warna + Janggut + Kumis + Bunga + Poni + Tidak ada yang digunakan + Ukuran + Kurus + Bidang + Latar Belakang + Beli Kustomisasi + Buka set seharga %d permata + Beli + Beli set %s + Tenggat Waktu + Terima + Tolak + Mulai Misi + Batalkan Undangan + Batalkan Misi + Tinggalkan Misi + Tunda + Diterima + Ditolak + Partisipan + Versi %s (%d) + Bantuan & FAQ + Aku mengerti! + Peringatkan aku lagi + Selamat datang di Habitica + Bergabunglah dengan lebih dari 1.100.000 orang bersenang-senang dalam menyelesaikan tugas. Buatlah avatar dan catat tugas dunia-nyatamu. + Kemajuan dalam Permainan = Kemajuan dalam Hidup + Buka fitur dalam game dengan mencentang tugas harianmu. Dapatkan baju, peliharaan, dan banyak lagi untuk hadiahmu menyelesaikan tujuan! + Bersosialisasi sambil Mengalahkan Monster + Tetaplah berusaha meraih tujuan dengan bantuan teman-teman. Dukung satu sama lain dalam hidup dan bertarunglah sekaligus meningkatkan kehidupan bersama-sama! + Mulai + Sebelumnya + Berikutnya + Lewati + Selamat datang di Habitica, di mana meningkatkan diri dalam permainan akan meningkatkan kehidupan nyata! Seiring kamu menyelesaikan tujuan dunia-nyata, kamu akan membuka perlengkapan, peliharaan, misi, dan banyak lagi. + Selamat Datang + Pertama, kamu butuh avatar di dalam game untuk menggambarkan dirimu! Hal-hal yang kamu lakukan di dunia nyata akan mempengaruhi kesehatan, level pengalaman, dan emas avatarmu. + Keren! Sekarang mari mengatur tugas-tugasmu jadi kamu dapat mulai mendapatkan pengalaman dan emas. + +Untuk memulai, bagian mana dari hidupmu yang ingin kamu tingkatkan? + Kerja + Latihan Fisik + Kesehatan + Kebaikan + Sekolah + Tim + Pekerjaan Rumah Tangga + Kreativitas + Proses Email + Tugas paling penting + Proyek Kerja + 10 menit cardio + Pelemasan + Atur jadwan latihan + Makan makanan bergizi / cepat saji + Gunakan Benang Gigi + Periksa Jadwal + Belajar/Bermalas-malasan + Mengerjakan PR + Selesaikan tugas + Periksa tim + Perbaharui tim mengenai status + Selesaikan proyek tim + 10 menit bersih-bersih + Cuci Piring + Rapikan lemari + Belajar menguasai kemampuan + Mengerjakan proyek kreatif + Menyelesaikan proyek kreatif + Ingin membantu kami menjaga Habitica tetap berjalan? Kamu dapat mendukung pengembang dengan membeli permata!\n\nPermata membuatmu dapat membeli aksesoris menarik untuk akunmu, termasuk: \n\n - Kostum keren untuk avatarmu\n - Latar belakang keren\n - Misi menarik yang memberimu hadiah telur peliharaan unik\n - Kemampuan untuk mengganti kelas sebelum level 100\n\nTerima kasih banyak untuk bantuan kepada Habitca untuk menjadi yang terbaik. Dukunganmu sangat berarti bagi kami! + Perkumpulan Saya + Perkumpulan Publik + Perkumpulan + Tinggalkan + Gabung + Ketua + Permata + Salin sebagai Tugas + Kirim PM + Tandai + Hapus + Nama + Deskripsi + Beri Label + Privasi + Tulis Pesan + Kirim + Tenggat: %s + %d kali berturut-turut + Tugas memiliki Tenggat Waktu + Perlengkapan Bertarung + Kostum + Kepala + Aksesoris Kepala + Aksesori Mata + Baju Perang + Punggung + Tubuh + Perisai + Senjata + Gunakan Kostum + Digunakan + Apakah kamu yakin kamu ingin membatalkan misi ini? Semua undangan yang disetujui akan hilang. Pemilik misi akan mendapatkan gulungan misi kembali. + Undangan Misi + Apakah kamu yakin kamu ingin memulai misi? Setelah aktif, tidak ada anggota kelompok lain yang dapat bergabung. + Kamu telah diundang untuk berpartisipasi dalam misi! + 1 hari yang lalu + %d hari yang lalu + 1 menit yang lalu + %d menit yang lalu + %d jam yang lalu + 1 jam yang lalu + Hari Ini + Item + Telur + Ramuan Penetas + Makanan + Misi + Peliharaan + Tunggangan + Kamu menemukan perlengkapan langka di dalam Peti Harta Karun: %s! Keren! + Kamu mengacak-acak Peti Harta Karun dan menemukan %2$s %1$s. Kenapa berada di dalam sini, ya? + Kamu bergulat dengan Peti Harta Karun dan mendapatkan Pengalaman. Rasakan itu! + Buka Peti Harta Karun untuk mendapatkan perlengkapan spesial, Pengalaman, atau makanan secara acak! Perlengkapan yang tersisa: %d + Kamu menemukan perlengkapan terakhir di dalam Peti Harta Karun. + Peti Harta Karun akan memiliki perlengkapan baru pada minggu pertama setiap bulan. Sementara itu, tetaplah klik untuk mendapatkan Pengalaman dan Makanan! + Jual (%s Emas) + Tetaskan dengan ramuan + Beri makan peliharaan + Tetaskan dengan telur + Undang teman + Beri makan %2$s %1$s dengan: + Gunakan + Beri makan + Tetaskan dengan %s + Kamu menetaskan seekor %2$s %1$s! + Tutup + Bagikan + Kamu memberi makan %2$s %1$s ! + %s telah dibeli + Peliharaan Dasar + Peliharaan Ramuan Ajaib + Peliharaan Misi + Peliharaan Langka + Tunggangan Dasar + Tunggangan Ramuan Ajaib + Tunggangan Misi + Tunggangan Langka + Misi Dunia + Beristirahat di dalam Penginapan untuk mencegah Keseharian yang belum selesai menyakitimu semalaman! (Catatan: tidak dapat mencegahmu mendapatkan serangan Bos Monster.) + Kamu tidak memiliki %s + LVL %s + LVL %1$s - %2$s + Prajurit + Perampok + Penyihir + Penyembuh + Prajurit mendapatkan skor lebih dan \'serangan kritis\' lebih baik, yang akan secara acak memberikan bonus Emas, Pengalaman, dan kesempatan menemukan item saat menyelesaikan tugas. Mereka juga memberikan serangan berat kepada bos monster. Mainkan Perampok jika kamu termotivasi dengan hadiah bergaya jackpot yang sulit diprediksi, atau ingin memberikan serangan besar kepada bos misi! + Penyihir belajar dengan cepat, mendapatkan Pengalaman dan Level lebih cepat daripada kelas lainnya. Mereka juga mendapatkan Mana yang besar dengan menggunakan kemampuan spesial. Mainkan penyihir jika kamu menyukai aspek taktis dari permainan Kebiasaan, atau jika kamu begitu termotivasi dengan meningkatkan level dan membuka fitur baru! + Perampok senang mengumpulkan kekayaan, mendapatkan banyak Emas daripada yang lainnya, dan mahir menemukan item acak. Kemampuan Bersembunyi mereka yang terkenal membuat mereka mampu menghindari konsekuensi dari Keseharian yang terlewat. Mainkan Perampok jika kamu termotivasi dengan Hadiah dan Pencapaian, juga mendapatkan banyak barang jarahan dan lencana! + Penyembuh tahan terhadap serangan, dan dapat membagi perlindungannya pada sesama. Keseharian yang terlewat dan kebiasaan buruk tidak terlalu banyak mengganggu mereka, dan mereka memiliki cara untuk mengembalikan nyawa dari kesalahan mereka. Mainkan seorang Penyembuh jika kamu senang membantu teman dalam kelompok, atau ide mencurangi kematian dengan kerja keras membuatmu terinspirasi! + Pilih Profesi + Matikan Fitur + Tidak ingin diganggu dengan profesi? Ingin memilih nanti saja? Matikan fitur - kamu akan menjadi seorang Prajurit tanpa kemampuan spesial. Kamu dapat membaca mengenai sistem profesi nanti di wiki dan mengaktifkan fitur profesi kapan saja. + Apakah kamu yakin ingin menjadi seorang %s? + Pilih Kelas + Kembali + Apakah kamu yakin kamu ingin mematikan fitur? + Ganti profesi + Aktifkan Sistem Profesi + Ganti Profesi + Melalui Email + Undang Pengguna yang telah ada + Kirim + Undang Teman + Jika kamu memiliki teman yang telah menggunakan Habitica, undang melalui ID Pengguna di sini. + Jika seorang teman bergabung dengan Habitica melalui emailmu, mereka otomatis akan diundang ke dalam kelompokmu! + Tambahkan Undangan + ID Pengguna + Email + Undang sebagai Teman + Bagikan dengan + Saya naik level %s di Habitica dengan meningkatkan kebiasaan kehidupan-nyata saya! + Saya menetaskan peliharaan seekor %2$s %1$s di Habitica dengan menyelesaikan tugas kehidupan-nyata saya! + Saya baru mendapatkan tunggangan seekor %2$s %1$s di Habitica dengan menyelesaikan tugas kehidupan-nyata saya! + diff --git a/Habitica/res/values-iw/strings.sidebar.xml b/Habitica/res/values-iw/strings.sidebar.xml new file mode 100644 index 000000000..67a835b31 --- /dev/null +++ b/Habitica/res/values-iw/strings.sidebar.xml @@ -0,0 +1,19 @@ + + + משימות + מיומניויות + חברתי + דואר נכנס + פונדק + חבורה + קנה אבני חן + גילדות + אתגרים + מלאי ציוד + דמות + ציוד + אורווה + חדשות + הגדרות + אודות + diff --git a/Habitica/res/values-iw/strings.tutorial.xml b/Habitica/res/values-iw/strings.tutorial.xml new file mode 100644 index 000000000..129a2757d --- /dev/null +++ b/Habitica/res/values-iw/strings.tutorial.xml @@ -0,0 +1,14 @@ + + + השלימו הרגלים חיוביים כדי לזכות בזהב וניסיון! הרגלים רעים יפגעו בדמות שלכם אם תלחצו עליהם, אז המנעו מהם בחיים האמיתיים! + הביסו את המטלות היומיות שלכם כדי לזכות בזהב וניסיון. זהירות! מטלות יומיות יפגעו בדמות שלכם אם אתם לא משלימים אותן בזמן. + השלימו את המטרות שלכם בחיים האמיתיים, ולאחר מכן סמנו שהושלמו כדי לקבל זהב וניסיון - כך שתוכלו להרוויח פרסים ולאפשר יכולות נוספות במשחק! + אלו הם הפרסים שלכם! הרוויחו זהב על-ידי השלמת הרגלים, מטלות יומיות ומטרות בעולם האמיתי. ואז בזבזו אותו על פרסים במשחק או פרסים שהתאמתם לעצמכם אישית בעולם האמיתי! + כאשר אתם קונים ציוד הוא מופיע כאן. ציוד הקרב שלכם משפיע על תכונות, והתחפושת שלכם (אם מאופשרת) משפיעה על הלבוש של הדמות שלכם. + הרוויחו חפצים על-ידי השלמת משימות ועלייה בדרגות. לחצו על חפץ כדי להשתמש בו! + בזמן שאתם משלימים משימות בעולם האמיתי, יש לכם סיכוי למצוא ביצים ושיקויים. שלבו אותם כדי להבקיע חיות מחמד + מיומנויות הן יכולות מיוחדות בעלות השפעה עוצמתית! לחצו על מיומנות כדי להשתמש בה. היא תעלה לכם מאנה (המד הכחול), שתרוויחו על ידי סימון משימות מידי יום ועל ידי השלמת משימות בחיים האמיתיים. בידקו את השאלות הנפוצות בתפריט למידע נוסף! + זה המקום בו אתם וחבריכם יכולים לישמור על עצמכם מחוייבים למטרות ולהלחם במפלצות עם המשימות שלכם! + ברוכים הבאים לפונדק, צ׳אט פומבי לכל הגילאים! כאן תוכלו לדבר על פרודוקטיביות ולשאול שאלות. תהנו! + ביחרו להיות לוחמים, מכשפים, מרפאים או נוכלים! לכל מקצוע ציוד ומיומנויות משלו. לחצו על ה (?) כדי ללמוד עוד! + diff --git a/Habitica/res/values-iw/strings.xml b/Habitica/res/values-iw/strings.xml new file mode 100644 index 000000000..69da3c49b --- /dev/null +++ b/Habitica/res/values-iw/strings.xml @@ -0,0 +1,328 @@ + + + האביטיקה + ריענון + ניסיון + בריאות + מאנה + העדפות לא הצליחו להטען מהבר-קוד + + הגדרות + שרת מותאם אישית אליכם + מזהה משתמש + מזהה המשתמש שלכם + מפתח API + מפתח ה API שלכם + צרו איתי קשר + ארעה תקלה... + חשבון + תזכורת יומית + הפעל תזכורת + קבע מועד תזכורת + + ערך + מטרה חדשה + פרס חדש + מטלה יומית חדשה + הרגל חדש + עריכה + מחיקה + ביטול + התחברות + הרשמו + שם משתמש + כתובת מייל או שם משתמש + סיסמה + כתובת דואר אלקטרוני + אמתו סיסמה + התנתקות + התנתקו מהחשבון שלכם + פרטי חשבון + ברוכים הבאים + קומו לתחייה + אנא התחברו דרך האפליקציה לפני שאתם משתמשים בוויג׳ט + אודות + ספריות + היסטוריית גרסאות + האביטיקה זמינה כתוכנה במקור פתוח בגיטהאב + דרגו את האפליקציה שלנו + שלחו לנו משוב! + דווחו על תקלה + קוד מקור + + תקלת התחברות + אינכם מחוברים לאינטרנט + נראה שיש בעיה עם השרת. אנא נסו מאוחר יותר. + תקלת אימות + שם המשתמש שלכם או הסיסמה שגויים. + שגיאת אימות + עליכם למלא את כל השדות. + שמור + הערות + טקסט + רמת קושי + תגיות + טריוויאלי + קל + בינוני + קשה + תאריך התחלה + חיובי ( + ) + שלילי ( - ) + רשימה + תזכורות + פעולות + תכונות + פיזי + שכלי + חברתי + אחר + תדירות + בימים מסויימים בשבוע + כל X ימים + שני + שלישי + רביעי + חמישי + שישי + שבת + ראשון + עליתם דרגה! + על-ידי הגשמת היעדים שלכם מהעולם האמיתי, הגעתם לדרגה %1$d! + נרפאתם לחלוטין! + ישש! + אל ייאוש! + הפסדתם דרגה, זהב, וחפץ, אך אתם יכולים להשיג אותם שוב עם עבודה קשה! בהצלחה--אתם תצליחו. + נגמרה לכם הבריאות! + מלאו בריאות ונסו מחדש + מסנן + תמונת פרופיל + %d מאנה + השתמשתם ב %1$s בעבור %2$d מאנה. + שורה חדשה לרשימה + הוסף + זיכרו לסמן את המטלות היומיות! + שימוש ביכולת + יגיע בקרוב + האם אתם בטוחים שאתם מעוניינים לדווח על ההודעה הזו? + סמן הודעה + משתחרר בדרגה 11 + אתם לא בחבורה. כדי להצטרף לחבורה, בקרו באתר. + שכחתי סיסמה + שחכתם סיסמה? אנא השתמשו בגרסת האתר לניידים. + הפעילו מחדש את המטלות היומיות שלכם + עצרו את המטלות היומיות שלכם + קנייה + בטל + חבורה + צ׳אט + חברים + הרגלים + מטלות יומיות + מטרות + פרסים + האם אתם בטוחים? + האם אתם באמת רוצים למחוק? + כן + לא + הרפתקאה + גוף + שיער + חולצה + עור + אוזני חיות + בסיס + צבע + זקן + שפם + פרח + טלטלים + לא קבוע + גודל + רזה + רחב + רקע + ריכשו התאמה אישית + שחררו סט בעבור %d אבני חן + קנייה + קנו סט %s + תאריך יעד + קבלו + דחו + התחילו הרפתקאה + בטלו הזמנה + הפסיקו את ההרפתקאה + עיזבו הרפתקאה + ממתין + התקבל + נדחה + משתתפים + גרסה %s (%d) + עזרה ושאלות נפוצות + הבנתי! + הזכר לי שוב + ברוכים הבאים להאביטיקה + הצטרפו ללמעלה מ 1,100,000 אנשים שנהנים בזמן שהם גורמים לדברים לקרות. צרו דמות ועיקבו אחר משימותיכם מהעולם האמיתי. + התקדמות במשחק = התקדמות בחיים + אפשרו יכולות של המשחק על ידי סימון שהשלמתם משימות בעולם האמיתי. הרוויחו שיריון, חיות מחמד, ועוד - כדי לתגמל את עצמכם על עמידה ביעדים! + היו חברותיים והילחמו במפלצות + שימרו על קצב התקדמות עם עזרה מחבריכם. תימכו אחד בשני בחיים ובקרב ככל שאתם משתפרים ביחד! + התחילו + קודם + הבא + דלגו + ברוכים הבאים להאביטיקה, המקום בו התקדמות במשחק תשפר אתכם בחיים האמיתיים! ככל שאתם משיגים יעדים בעולם האמיתי, תשחררו ציוד, חיות מחמד, הרפתקאות, ועוד. + ברוכים הבאים + ראשית, אתם צריכים דמות במשחק כדי לייצג אתכם! הדברים שאתם עושים בחיים האמיתיים ישפיעו על בריאות הדמות שלכם, הניסיון והזהב שלה. + נהדר! עכשיו בואו נקבע את המשימות שלכם כדי שתתחילו להרוויח ניסיון וזהב. + +כדי להתחיל, איזה חלקים בחייכם תרצו לשפר? + עבודה + התעמלות + בריאות + אורח חיים + בית-ספר + קבוצות + מטלות + יצירתיות + לטפל במיילים + המשימה החשובה ביותר + פרוייקט לעבודה + 10 דקות אירובי + מתיחות + לקבוע תוכנית אימונים + אכול בריא / ג׳אנק פוד + חוט-דנטלי + קבע בדיקה + לימודים/דחיינות + עשה שיעורי בית + סיים משימה לשיעור + בדוק מה המצב עם הצוות + עדכן את הצוות על המצב + השלם פרוייקט צוותי + 10 דקות ניקיונות + שטוף כלים + סדר את הארון + לימדו אשף של המלאכה + עבוד על פרוייקט יצירתי + סיים פרוייקט יצירתי + רוצים לסייע לנו לשמור על האביטיקה באוויר? אתם יכולים לתמוך במפתחים על ידי רכישה של אבני חן!\n\nאבני חן מאפשרות לכם לרכוש תוספות מהנות לחשבון שלכם, כולל: \n\n - תחפושות מגניבות לדמות שלכם\n - רקעים מדהימים\n - הרפתקאות כיפיות שיתגמלו אתכם עם ביצי חיות מחמד\n - היכולת לשנות את מקצוע הדמות שלכם לפני דרגה 100\n\nתודה רבה על העזרה שלכם להפוך את האביטיקה להכי טובה שהיא יכולה להיות. התמיכה שלכם היא מאוד משמעותית מבחינתנו! + הגילדות שלי + גילדות פומביות + גילדה + עיזבו + הצטרפו + מנהיג + אבני חן + העתקה כמשימה + שילחו הודעה פרטית + דיווח + מחיקה + שם + תיאור + הוסיפו תגית + פרטיות + כיתבו הודעה + שליחה + חל: %s + רצף נוכחי: %d + למשימה יש תאריך יעד + ציוד קרב + תחפושת + ראש + אביזר ראש + משקפיים + שריון + חזרה + גוף + מגן + נשק + ליבשו תחפושת + מצוייד + האם אתם בטוחים שאתם מעוניינים להפסיק את ההרפתקאה הזו? כל אישורי ההזמנות יאבדו. הבעלים של ההרפתקאה ימשיכו להחזיק במגילת ההרפתקאה. + הזמנה להרפתקאה + האם אתם בטוחים שאתם מעוניינים להתחיל בהרפתקאה? ברגע שהיא מתחילה, חברי חבורה נוספים לא יכולים להצטרף אליה. + הוזמנתם להשתתף בהרפתקאה! + לפני יום + לפני %d ימים + לפני דקה + לפני %d דקות + לפני %d שעות + לפני שעה + היום + חפצים + ביצים + שיקויי הבקעה + אוכל + הרפתקאות + חיות מחמד + חיות רכיבה + מצאתם חתיכת ציוד נדיר בארמואר: %s! מגניב! + אתם נוברים בארמואר ומוצאים %1$s %2$s. מה זה עושה פה? + אתם נאבקים בארמואר וצוברים ניסיון. קבלו! + פתחו את הארמואר כדי לקבל ציוד מיוחד אקראי, ניסיון, או אוכל! חתיכות ציוד שנותרו: %d + מצאתם את חתיכת הציוד הנדיר האחרונה בארמואר הקסום. + הארמואר יכיל ציוד חדש בשבוע הראשון של כל חודש. עד אז, המשיכו ללחוץ כדי לקבל ניסיון ואוכל! + מיכרו (%s זהב) + הבקיעו עם שיקוי + האכילו חיית מחמד + הבקיעו עם ביצה + הזמינו חבורה + האכלתם %1$s %2$s עם: + השתמשו + האכילו + הבקיעו חיית מחמד עם %s + הבקעתם %1$s %2$s! + סיגרו + שתפו + האכלתם את ה %1$s %2$s שלכם! + %s נקנה + חיות מחמד רגילות + חיות מחמד משיקויים קסומים + חיות מחמד מהרפתקאות + חיות מחמד נדירות + חיות רכיבה רגילות + חיות רכיבה משיקויים קסומים + חיות רכיבה מהרפתקאות + חיות רכיבה נדירות + הרפתקאה עולמית + נוחו באכסנייה כדי למנוע ממטלות יומיות לא מושלמות לפגוע בכם במהלך הלילה! (שימו לב: לא מונע מכם להפגע מאוייבים.) + אין לכם כל %s + דרגה %s + דרגה %1$s - %2$s + לוחם + נוכל + מכשף + מרפא + לוחמים גורמים ליותר ״פגיעות קריטיות״, שבאקראיות נותנות בונוס זהב, ניסיון, וסיכוי ל״נפילה״ בהשלמה של משימה. הם גם גורמים לנזק כבד לאוייבים. שחקו לוחמים אם אתם מקבלים מוטיבציה מזכיות אקראיות בסגנון של מכונת מזל, או אם אתם רוצים לגרום לכאב בהרפתקאות אוייבים! + מכשפים לומדים במהירות, וזוכים בניסיון ודרגות מהר יותר ממקצועות אחרים. הם גם מקבלים מנות גדולות של מאנה שמשמשות ליכולות מיוחדות. שחקו כמכשפים אם אתם נהנים מהצדדים הטקטיים של האביט, או אם עליה בדרגות והיבטים מתקדמים של המשחק הם גורמים שמדרבנים אתכם. + נוכלים אוהבים לצבור עושר, זוכים ביותר זהב מכל בעל-מקצוע אחר, ומוכוונים למציאת חפצים אקראיים. יכולת ההתגנבות המפורסמת שלהם מאפשרת להם להתחמק מההשלכות של מטלות יומיות מפוספסות. שחקו בדמות של נוכל אם מדרבן אתכם לקבל פרסים, הישגים, שלל ועיטורים! + מרפאים הם עמידים בפני פגיעות, וחולקים את היכולת הזו עם אחרים. מטלות יומיות מפוספסות והרגלים רעים לא מבלבלים אותם כל כך, ויש להם יכולת להתאושש מכשלונות. שחקו במקצוע המרפא אם אתם נהנים לסייע לעמיתיכם לחבורה, או אם הרעיון של התחמקות ממוות דרך עבודה קשה מעורר בכם השראה! + בחרו מקצוע + וותרו + לא מעניינים אתכם מקצועות? רוצים לבחור מאוחר יותר? וותרו - תהיו לוחמים ללא תכונות מיוחדות. תוכלו לקראו על מערכת המקצועות מאוחר יותר בוויקי ולאפשר מקצועות בכל שעה. + האם אתם בטוחים שברצונכם להיות %s? + בחרו מקצוע + חזרה + האם אתם בטוחים שאתם מעוניינים לוותר? + שנו את המקצוע שלכם + החליפו מקצוע וקבלו בחזרה את נקודות התכונה תמורת 3 אבני חן. תוכלו להקצות את נקודות התכונה מחדש דרך האתר. + אפשרו את מערכת המקצועות + שנו מקצוע + באמצעות מייל + הזמינו משתמשים קיימים + שילחו + הזמינו חברים + אם יש לכם חברים שכבר משתמשים בהאביטיקה, הזמינו אותם באמצעות מזהה המשתמש כאן. + אם חברים מצטרפים להאביטיקה באמצעות מייל שלכם, הם אוטומטית יוזמנו לחבורה שלכם! + הוסיפו מוזמנים + מזהה משתמש + מייל + הזמינו לחבורה + שתפו באמצעות + הגעתי לדרגה %s בהאביטיקה על ידי שיפור הרגלים שלי מהעולם האמיתי! + הרגע הבקעתי ביצת חיית מחמד של %1$s %2$s בהאביטיקה על ידי השלמת משימות בחיים האמיתיים! + הרגע הרווחתי חיית רכיבה של %1$s %2$s בהאביטיקה על ידי השלמת משימות בחיים האמיתיים! + פתיחה בפליי סטור + האם אתם בטוחים שאתם מעוניינים להחליף מקצוע? זה יעלה לכם 3 אבני חן. + הודעה מאת %1$s + diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index d25a6ff88..39f341c24 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -56,24 +56,24 @@ - 0 - 1 - 4 - 6 - 7 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 20 - 25 - 26 + en + bg + de + en-rGB + es + fr + iw + hr-rHR + in + it + ja + nl + pl + pt-rPT + pt-rBR + ru + zh + zh-rTW diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 47b6a870a..d67f5c615 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -16,6 +16,7 @@ import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.prefs.TimePreference; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; @@ -27,7 +28,9 @@ import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; import java.util.Calendar; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import javax.inject.Inject; @@ -41,6 +44,7 @@ public class PreferencesFragment extends BasePreferencesFragment implements private PreferenceScreen pushNotificationsPreference; private Preference classSelectionPreference; private HabitRPGUser user; + public MainActivity activity; private PushNotificationManager pushNotificationManager; private TransactionListener userTransactionListener = new TransactionListener() { @@ -200,14 +204,97 @@ public class PreferencesFragment extends BasePreferencesFragment implements pushNotificationManager.removePushDeviceUsingStoredToken(); } } else if (key.equals("language")) { - Log.v("test", sharedPreferences.getString(key,"0")); - Locale locale = new Locale("es"); + Locale locale = null; + String languageCode = null; + Log.v("test",sharedPreferences.getString(key,"0")); + switch (sharedPreferences.getString(key,"en")){ + case "en": + locale = new Locale("en"); + languageCode = "en"; + break; + case "bg": + locale = new Locale("bg"); + languageCode = "bg"; + break; + case "de": + locale = new Locale("de"); + languageCode = "de"; + break; + case "en-rGB": + locale = new Locale("en", "GB"); + languageCode = "en_GB"; + break; + case "es": + locale = new Locale("es"); + languageCode = "es"; + break; + case "fr": + locale = new Locale("fr"); + languageCode = "fr"; + break; + case "iw": + locale = new Locale("iw"); + languageCode = "he"; + break; + case "hr-rHR": + locale = new Locale("hr", "HR"); + languageCode = "hu"; + break; + case "in": + locale = new Locale("in"); + languageCode = "id"; + break; + case "it": + locale = new Locale("it"); + languageCode = "it"; + break; + case "ja": + locale = new Locale("ja"); + languageCode = "ja"; + break; + case "nl": + locale = new Locale("nl"); + languageCode = "nl"; + break; + case "pl": + locale = new Locale("pl"); + languageCode = "pl"; + break; + case "pt-rPT": + locale = new Locale("pt","PT"); + languageCode = "pt"; + break; + case "pt-rBR": + locale = new Locale("pt","BR"); + languageCode = "pt_BR"; + break; + case "ru": + locale = new Locale("ru"); + languageCode = "ru"; + break; + case "zh": + locale = new Locale("zh"); + languageCode = "zh"; + break; + case "zh-rTW": + locale = new Locale("zh","TW"); + languageCode = "zh_TW"; + break; + } + Locale.setDefault(locale); Configuration configuration = new Configuration(); configuration.locale = locale; getActivity().getResources().updateConfiguration(configuration, getActivity().getResources().getDisplayMetrics()); + Map updateData = new HashMap<>(); + updateData.put("preferences.language", languageCode); + apiHelper.apiService.updateUser(updateData) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new MergeUserCallback(activity, user), throwable -> { + }); + } } From 22ccb1bcf798fb7c2b3f230cfb755c2a19772aae Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Sun, 4 Sep 2016 22:50:04 -0500 Subject: [PATCH 4/9] Feature: Add logic to SetupActivity to set language at registration This commit adds logic to the SetupActivity for a new user. The purpose of this logic is for the device language to be sent to the web app automatically during registration. --- Habitica/res/values/values.xml | 4 +- .../habitrpg/android/habitica/APIHelper.java | 19 +-- .../habitica/helpers/LanguageHelper.java | 120 ++++++++++++++++++ .../habitica/ui/activities/LoginActivity.java | 40 +++--- .../habitica/ui/activities/SetupActivity.java | 22 ++-- .../preferences/PreferencesFragment.java | 94 ++------------ .../habitrpgwrapper/lib/api/ApiService.java | 6 +- 7 files changed, 176 insertions(+), 129 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index 39f341c24..031e924dd 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -63,13 +63,13 @@ es fr iw - hr-rHR + hr in it ja nl pl - pt-rPT + pt pt-rBR ru zh diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index ec1c5b9e5..e188d0763 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -1,13 +1,15 @@ package com.habitrpg.android.habitica; +import android.app.Activity; +import android.support.v7.app.AlertDialog; + +import com.amplitude.api.Amplitude; +import com.crashlytics.android.Crashlytics; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; - -import com.amplitude.api.Amplitude; -import com.crashlytics.android.Crashlytics; import com.habitrpg.android.habitica.database.CheckListItemExcludeStrategy; import com.magicmicky.habitrpgwrapper.lib.api.ApiService; import com.magicmicky.habitrpgwrapper.lib.api.Server; @@ -17,8 +19,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.Customization; import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; import com.magicmicky.habitrpgwrapper.lib.models.Purchases; import com.magicmicky.habitrpgwrapper.lib.models.Skill; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; @@ -67,14 +67,9 @@ import com.raizlabs.android.dbflow.structure.ModelAdapter; import org.json.JSONException; import org.json.JSONObject; -import android.app.Activity; -import android.os.Build; -import android.support.v7.app.AlertDialog; - import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.net.ConnectException; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -82,11 +77,9 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import javax.net.ssl.SSLException; -import javax.net.ssl.SSLHandshakeException; import okhttp3.Interceptor; import okhttp3.MediaType; @@ -95,8 +88,6 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.logging.HttpLoggingInterceptor; -import okio.Buffer; -import retrofit2.Call; import retrofit2.Converter; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.HttpException; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java new file mode 100644 index 000000000..890b75679 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java @@ -0,0 +1,120 @@ +package com.habitrpg.android.habitica.helpers; + +import java.util.Locale; + +/** + * Created by DanielKaparunakis on 9/2/16. + */ +public class LanguageHelper { + + private Locale locale = null; + private String languageCode = null; + private boolean languageAvailable = false; + + public LanguageHelper (String languagePreference) { + switch (languagePreference){ + case "en": + locale = new Locale("en"); + languageCode = "en"; + languageAvailable = true; + break; + case "bg": + locale = new Locale("bg"); + languageCode = "bg"; + languageAvailable = true; + break; + case "de": + locale = new Locale("de"); + languageCode = "de"; + languageAvailable = true; + break; + case "en-rGB": + locale = new Locale("en", "GB"); + languageCode = "en_GB"; + languageAvailable = true; + break; + case "es": + locale = new Locale("es"); + languageCode = "es"; + languageAvailable = true; + break; + case "fr": + locale = new Locale("fr"); + languageCode = "fr"; + languageAvailable = true; + break; + case "iw": + locale = new Locale("iw"); + languageCode = "he"; + languageAvailable = true; + break; + case "hr": + locale = new Locale("hr", "HR"); + languageCode = "hu"; + languageAvailable = true; + break; + case "in": + locale = new Locale("in"); + languageCode = "id"; + languageAvailable = true; + break; + case "it": + locale = new Locale("it"); + languageCode = "it"; + languageAvailable = true; + break; + case "ja": + locale = new Locale("ja"); + languageCode = "ja"; + languageAvailable = true; + break; + case "nl": + locale = new Locale("nl"); + languageCode = "nl"; + languageAvailable = true; + break; + case "pl": + locale = new Locale("pl"); + languageCode = "pl"; + languageAvailable = true; + break; + case "pt": + locale = new Locale("pt","PT"); + languageCode = "pt"; + languageAvailable = true; + break; + case "pt-rBR": + locale = new Locale("pt","BR"); + languageCode = "pt_BR"; + languageAvailable = true; + break; + case "ru": + locale = new Locale("ru"); + languageCode = "ru"; + languageAvailable = true; + break; + case "zh": + locale = new Locale("zh"); + languageCode = "zh"; + languageAvailable = true; + break; + case "zh-rTW": + locale = new Locale("zh","TW"); + languageCode = "zh_TW"; + languageAvailable = true; + break; + } + } + + public boolean isLanguageAvailable() { + return languageAvailable; + } + + public String getLanguageCode() { + return languageCode; + } + + public Locale getLocale() { + return locale; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index a36181a04..3b252d1d0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -1,25 +1,5 @@ package com.habitrpg.android.habitica.ui.activities; -import com.amplitude.api.Amplitude; -import com.facebook.AccessToken; -import com.facebook.CallbackManager; -import com.facebook.FacebookCallback; -import com.facebook.FacebookException; -import com.facebook.login.LoginResult; -import com.facebook.login.widget.LoginButton; -import com.habitrpg.android.habitica.APIHelper; -import com.habitrpg.android.habitica.BuildConfig; -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; -import com.habitrpg.android.habitica.components.AppComponent; -import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator; -import com.habitrpg.android.habitica.prefs.scanner.IntentResult; -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; - -import org.json.JSONException; -import org.json.JSONObject; - import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; @@ -40,6 +20,26 @@ import android.widget.ProgressBar; import android.widget.TableRow; import android.widget.TextView; +import com.amplitude.api.Amplitude; +import com.facebook.AccessToken; +import com.facebook.CallbackManager; +import com.facebook.FacebookCallback; +import com.facebook.FacebookException; +import com.facebook.login.LoginResult; +import com.facebook.login.widget.LoginButton; +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.BuildConfig; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator; +import com.habitrpg.android.habitica.prefs.scanner.IntentResult; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; + +import org.json.JSONException; +import org.json.JSONObject; + import javax.inject.Inject; import butterknife.BindView; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 20f0dbffc..649aacefd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -1,5 +1,13 @@ package com.habitrpg.android.habitica.ui.activities; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.Button; + import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HostConfig; @@ -20,15 +28,8 @@ import org.greenrobot.eventbus.Subscribe; import org.json.JSONException; import org.json.JSONObject; -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.widget.Button; - import java.util.List; +import java.util.Locale; import javax.inject.Inject; @@ -149,6 +150,11 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, @Override public void onClick(View v) { if (v == this.nextButton) { + String currentDeviceLanguage = Locale.getDefault().getLanguage(); + apiHelper.apiService.registrationLanguage(currentDeviceLanguage) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new MergeUserCallback(this, user), throwable -> { + }); if (this.pager.getCurrentItem() == 1) { List newTasks = this.taskSetupFragment.createSampleTasks(); this.completedSetup = true; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index d67f5c615..e60ad8a10 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -6,17 +6,18 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.os.Build; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import android.util.Log; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; +import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.prefs.TimePreference; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; @@ -204,98 +205,25 @@ public class PreferencesFragment extends BasePreferencesFragment implements pushNotificationManager.removePushDeviceUsingStoredToken(); } } else if (key.equals("language")) { - Locale locale = null; - String languageCode = null; - Log.v("test",sharedPreferences.getString(key,"0")); - switch (sharedPreferences.getString(key,"en")){ - case "en": - locale = new Locale("en"); - languageCode = "en"; - break; - case "bg": - locale = new Locale("bg"); - languageCode = "bg"; - break; - case "de": - locale = new Locale("de"); - languageCode = "de"; - break; - case "en-rGB": - locale = new Locale("en", "GB"); - languageCode = "en_GB"; - break; - case "es": - locale = new Locale("es"); - languageCode = "es"; - break; - case "fr": - locale = new Locale("fr"); - languageCode = "fr"; - break; - case "iw": - locale = new Locale("iw"); - languageCode = "he"; - break; - case "hr-rHR": - locale = new Locale("hr", "HR"); - languageCode = "hu"; - break; - case "in": - locale = new Locale("in"); - languageCode = "id"; - break; - case "it": - locale = new Locale("it"); - languageCode = "it"; - break; - case "ja": - locale = new Locale("ja"); - languageCode = "ja"; - break; - case "nl": - locale = new Locale("nl"); - languageCode = "nl"; - break; - case "pl": - locale = new Locale("pl"); - languageCode = "pl"; - break; - case "pt-rPT": - locale = new Locale("pt","PT"); - languageCode = "pt"; - break; - case "pt-rBR": - locale = new Locale("pt","BR"); - languageCode = "pt_BR"; - break; - case "ru": - locale = new Locale("ru"); - languageCode = "ru"; - break; - case "zh": - locale = new Locale("zh"); - languageCode = "zh"; - break; - case "zh-rTW": - locale = new Locale("zh","TW"); - languageCode = "zh_TW"; - break; + LanguageHelper languageHelper = new LanguageHelper(sharedPreferences.getString(key,"en")); + Locale.setDefault(languageHelper.getLocale()); + Configuration configuration = new Configuration(); + + if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN){ + configuration.locale = languageHelper.getLocale(); + } else { + configuration.setLocale(languageHelper.getLocale()); } - Locale.setDefault(locale); - Configuration configuration = new Configuration(); - configuration.locale = locale; getActivity().getResources().updateConfiguration(configuration, getActivity().getResources().getDisplayMetrics()); Map updateData = new HashMap<>(); - updateData.put("preferences.language", languageCode); + updateData.put("preferences.language", languageHelper.getLanguageCode()); apiHelper.apiService.updateUser(updateData) .compose(apiHelper.configureApiCallObserver()) .subscribe(new MergeUserCallback(activity, user), throwable -> { }); - - } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 7bc6c5031..0bcf7e42b 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -28,10 +28,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.GET; +import retrofit2.http.Header; import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; @@ -57,6 +57,9 @@ public interface ApiService { @PUT("user/") Observable updateUser(@Body Map updateDictionary); + @PUT("user/") + Observable registrationLanguage(@Header("Accept-Language") String registrationLanguage); + @GET("user/inventory/buy") Observable> getInventoryBuyableGear(); @@ -128,7 +131,6 @@ public interface ApiService { @DELETE("tags/{id}") Observable deleteTag(@Path("id") String id); - @POST("user/auth/local/register") Observable registerUser(@Body UserAuth auth); From d2d8cb597fcee8e36ff7464352b5eff6c3a975bb Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Mon, 5 Sep 2016 23:24:06 -0500 Subject: [PATCH 5/9] Refactor: Modify LanguageHelper class to simplify switch block This commit simplifies the LanguageHelper class switch block. The original switch had 18 or so initial cases, most of which could be reduced to two general cases. The two general cases have been impletemented as the default. --- Habitica/res/values/values.xml | 6 +- .../habitica/helpers/LanguageHelper.java | 82 +++---------------- .../habitica/ui/activities/SetupActivity.java | 12 ++- .../preferences/PreferencesFragment.java | 10 +++ 4 files changed, 33 insertions(+), 77 deletions(-) diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index 031e924dd..d2354bad0 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -59,7 +59,7 @@ en bg de - en-rGB + en_GB es fr iw @@ -70,10 +70,10 @@ nl pl pt - pt-rBR + pt_BR ru zh - zh-rTW + zh_TW diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java index 890b75679..722e8733f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java @@ -11,38 +11,10 @@ public class LanguageHelper { private String languageCode = null; private boolean languageAvailable = false; - public LanguageHelper (String languagePreference) { - switch (languagePreference){ - case "en": - locale = new Locale("en"); - languageCode = "en"; - languageAvailable = true; - break; - case "bg": - locale = new Locale("bg"); - languageCode = "bg"; - languageAvailable = true; - break; - case "de": - locale = new Locale("de"); - languageCode = "de"; - languageAvailable = true; - break; - case "en-rGB": - locale = new Locale("en", "GB"); - languageCode = "en_GB"; - languageAvailable = true; - break; - case "es": - locale = new Locale("es"); - languageCode = "es"; - languageAvailable = true; - break; - case "fr": - locale = new Locale("fr"); - languageCode = "fr"; - languageAvailable = true; - break; + + public LanguageHelper (String languageSharedPref) { + + switch (languageSharedPref){ case "iw": locale = new Locale("iw"); languageCode = "he"; @@ -58,49 +30,19 @@ public class LanguageHelper { languageCode = "id"; languageAvailable = true; break; - case "it": - locale = new Locale("it"); - languageCode = "it"; - languageAvailable = true; - break; - case "ja": - locale = new Locale("ja"); - languageCode = "ja"; - languageAvailable = true; - break; - case "nl": - locale = new Locale("nl"); - languageCode = "nl"; - languageAvailable = true; - break; - case "pl": - locale = new Locale("pl"); - languageCode = "pl"; - languageAvailable = true; - break; case "pt": locale = new Locale("pt","PT"); languageCode = "pt"; languageAvailable = true; break; - case "pt-rBR": - locale = new Locale("pt","BR"); - languageCode = "pt_BR"; - languageAvailable = true; - break; - case "ru": - locale = new Locale("ru"); - languageCode = "ru"; - languageAvailable = true; - break; - case "zh": - locale = new Locale("zh"); - languageCode = "zh"; - languageAvailable = true; - break; - case "zh-rTW": - locale = new Locale("zh","TW"); - languageCode = "zh_TW"; + default: + if (languageSharedPref.contains("_")) { + String[] languageCodeParts = languageSharedPref.split("_"); + locale = new Locale(languageCodeParts[0],languageCodeParts[1]); + } else { + locale = new Locale(languageSharedPref); + } + languageCode = languageSharedPref; languageAvailable = true; break; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 649aacefd..2bee55590 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -16,6 +16,7 @@ import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; +import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment; import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -151,10 +152,13 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, public void onClick(View v) { if (v == this.nextButton) { String currentDeviceLanguage = Locale.getDefault().getLanguage(); - apiHelper.apiService.registrationLanguage(currentDeviceLanguage) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(new MergeUserCallback(this, user), throwable -> { - }); + LanguageHelper languageHelper = new LanguageHelper(currentDeviceLanguage); + if (languageHelper.isLanguageAvailable()){ + apiHelper.apiService.registrationLanguage(currentDeviceLanguage) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new MergeUserCallback(this, user), throwable -> { + }); + } if (this.pager.getCurrentItem() == 1) { List newTasks = this.taskSetupFragment.createSampleTasks(); this.completedSetup = true; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index e60ad8a10..21596e51f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -224,6 +224,16 @@ public class PreferencesFragment extends BasePreferencesFragment implements .compose(apiHelper.configureApiCallObserver()) .subscribe(new MergeUserCallback(activity, user), throwable -> { }); + + if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){ + Intent intent = new Intent(getActivity(), MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } else { + Intent intent = new Intent(getActivity(), MainActivity.class); + this.startActivity(intent); + getActivity().finishAffinity(); + } } } From 4b63b63b0d47153514e558fe8e5a75a7d990b3cb Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Tue, 6 Sep 2016 00:10:51 -0500 Subject: [PATCH 6/9] Refactor: Fix logic for language discovery at registration This commit fixes the logic of language discovery at registration. As opposed to using the LanguageHelper class, the new logic looks at the resources themselves to determine whether the app can support the language of the phone. --- .../habitica/helpers/LanguageHelper.java | 11 ----------- .../habitica/ui/activities/SetupActivity.java | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java index 722e8733f..b43068061 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.java @@ -9,8 +9,6 @@ public class LanguageHelper { private Locale locale = null; private String languageCode = null; - private boolean languageAvailable = false; - public LanguageHelper (String languageSharedPref) { @@ -18,22 +16,18 @@ public class LanguageHelper { case "iw": locale = new Locale("iw"); languageCode = "he"; - languageAvailable = true; break; case "hr": locale = new Locale("hr", "HR"); languageCode = "hu"; - languageAvailable = true; break; case "in": locale = new Locale("in"); languageCode = "id"; - languageAvailable = true; break; case "pt": locale = new Locale("pt","PT"); languageCode = "pt"; - languageAvailable = true; break; default: if (languageSharedPref.contains("_")) { @@ -43,15 +37,10 @@ public class LanguageHelper { locale = new Locale(languageSharedPref); } languageCode = languageSharedPref; - languageAvailable = true; break; } } - public boolean isLanguageAvailable() { - return languageAvailable; - } - public String getLanguageCode() { return languageCode; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 2bee55590..91c8cccaf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; -import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment; import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -79,6 +78,16 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, } catch (JSONException exception) { } Amplitude.getInstance().logEvent("setup", eventProperties); + + String currentDeviceLanguage = Locale.getDefault().getLanguage(); + for (String language : getResources().getStringArray(R.array.LanguageValues)) { + if (language.equals(currentDeviceLanguage)) { + apiHelper.apiService.registrationLanguage(currentDeviceLanguage) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new MergeUserCallback(this, user), throwable -> { + }); + } + } } @Override @@ -151,14 +160,6 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, @Override public void onClick(View v) { if (v == this.nextButton) { - String currentDeviceLanguage = Locale.getDefault().getLanguage(); - LanguageHelper languageHelper = new LanguageHelper(currentDeviceLanguage); - if (languageHelper.isLanguageAvailable()){ - apiHelper.apiService.registrationLanguage(currentDeviceLanguage) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(new MergeUserCallback(this, user), throwable -> { - }); - } if (this.pager.getCurrentItem() == 1) { List newTasks = this.taskSetupFragment.createSampleTasks(); this.completedSetup = true; From 2efb6ee0bb2609791881b6f79a128575caa1f55a Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Fri, 16 Sep 2016 12:45:08 -0500 Subject: [PATCH 7/9] Feature: Add content reload to language switcher setting's calls This commit adds a content API reload call to the list of calls that happen when the language is changed. This call is necessary so certain parts of the app, like the stable, have the correct language when the language is switched. --- .../ui/fragments/preferences/PreferencesFragment.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 21596e51f..9cb550120 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -224,6 +224,11 @@ public class PreferencesFragment extends BasePreferencesFragment implements .compose(apiHelper.configureApiCallObserver()) .subscribe(new MergeUserCallback(activity, user), throwable -> { }); + apiHelper.apiService.getContent(languageHelper.getLanguageCode()) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(contentResult -> { + }, throwable -> { + }); if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){ Intent intent = new Intent(getActivity(), MainActivity.class); From 96c61ed7cbda2813da1bcc7439d9561f0958bcbd Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Fri, 16 Sep 2016 14:28:16 -0500 Subject: [PATCH 8/9] Fix: Fix persistence for language settings after process dies. This commit corrects an issue where the language was not persisting if the app was killed or closed. Ref: http://stackoverflow.com/questions/22402491/ android-change-and-set-default-locale-within-the-app Issue: #574, Pull Request: #613 --- .../habitica/ui/activities/MainActivity.java | 86 +++++++++++-------- .../preferences/PreferencesFragment.java | 10 ++- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index 51cb77f7f..bfe237483 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -1,5 +1,42 @@ package com.habitrpg.android.habitica.ui.activities; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.database.sqlite.SQLiteDoneException; +import android.databinding.DataBindingUtil; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.support.design.widget.TabLayout; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.FileProvider; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; @@ -33,6 +70,7 @@ import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; import com.habitrpg.android.habitica.events.commands.SellItemCommand; import com.habitrpg.android.habitica.events.commands.UnlockPathCommand; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; +import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; @@ -92,41 +130,6 @@ import org.json.JSONObject; import org.solovyev.android.checkout.ActivityCheckout; import org.solovyev.android.checkout.Checkout; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.database.sqlite.SQLiteDoneException; -import android.databinding.DataBindingUtil; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.preference.PreferenceManager; -import android.support.design.widget.TabLayout; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.content.FileProvider; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - import java.io.File; import java.util.ArrayList; import java.util.Calendar; @@ -134,6 +137,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -220,6 +224,18 @@ public class MainActivity extends BaseActivity implements Action1, Ha public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + LanguageHelper languageHelper = new LanguageHelper(sharedPreferences.getString("language","en")); + Locale.setDefault(languageHelper.getLocale()); + Configuration configuration = new Configuration(); + if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN){ + configuration.locale = languageHelper.getLocale(); + } else { + configuration.setLocale(languageHelper.getLocale()); + } + getResources().updateConfiguration(configuration, + getResources().getDisplayMetrics()); + if (!HabiticaApplication.checkUserAuthentication(this, hostConfig)) { return; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java index 9cb550120..43ee90568 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java @@ -23,6 +23,7 @@ import com.habitrpg.android.habitica.prefs.TimePreference; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.Preferences; import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; @@ -206,15 +207,14 @@ public class PreferencesFragment extends BasePreferencesFragment implements } } else if (key.equals("language")) { LanguageHelper languageHelper = new LanguageHelper(sharedPreferences.getString(key,"en")); + Locale.setDefault(languageHelper.getLocale()); Configuration configuration = new Configuration(); - if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN){ configuration.locale = languageHelper.getLocale(); } else { configuration.setLocale(languageHelper.getLocale()); } - getActivity().getResources().updateConfiguration(configuration, getActivity().getResources().getDisplayMetrics()); @@ -224,7 +224,11 @@ public class PreferencesFragment extends BasePreferencesFragment implements .compose(apiHelper.configureApiCallObserver()) .subscribe(new MergeUserCallback(activity, user), throwable -> { }); - apiHelper.apiService.getContent(languageHelper.getLanguageCode()) + + Preferences preferences = user.getPreferences(); + preferences.setLanguage(languageHelper.getLanguageCode()); + apiHelper.languageCode = preferences.getLanguage(); + apiHelper.apiService.getContent(apiHelper.languageCode) .compose(apiHelper.configureApiCallObserver()) .subscribe(contentResult -> { }, throwable -> { From 90ff59a17c001576a6be98b351882dad8aa3bec4 Mon Sep 17 00:00:00 2001 From: Daniel Kaparunakis Date: Wed, 21 Sep 2016 00:00:24 -0500 Subject: [PATCH 9/9] Fix: Re-add code lost to Git conflicts. This commit adds code that was lost due to unresolved Git conflicts. Issue: #574, Pull Request: #613 --- Habitica/res/values/strings.xml | 2 + .../habitica/ui/activities/MainActivity.java | 89 +++++++++++-------- 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 901810142..ea5fc6c24 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -14,6 +14,8 @@ Your User ID API Token Your API Token + Language + Change Habitica\'s language Your QR Code Contact me An error happened… diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index a2978fc9b..169678604 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -1,5 +1,42 @@ package com.habitrpg.android.habitica.ui.activities; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.database.sqlite.SQLiteDoneException; +import android.databinding.DataBindingUtil; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.support.design.widget.TabLayout; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.FileProvider; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; @@ -34,9 +71,8 @@ import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; import com.habitrpg.android.habitica.events.commands.SellItemCommand; import com.habitrpg.android.habitica.events.commands.UnlockPathCommand; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; +import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; -import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator; -import com.habitrpg.android.habitica.prefs.scanner.IntentResult; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; import com.habitrpg.android.habitica.ui.TutorialView; @@ -95,42 +131,6 @@ import org.json.JSONObject; import org.solovyev.android.checkout.ActivityCheckout; import org.solovyev.android.checkout.Checkout; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.database.sqlite.SQLiteDoneException; -import android.databinding.DataBindingUtil; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.preference.PreferenceManager; -import android.support.design.widget.TabLayout; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.content.FileProvider; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - import java.io.File; import java.util.ArrayList; import java.util.Calendar; @@ -138,6 +138,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -224,6 +225,18 @@ public class MainActivity extends BaseActivity implements Action1, Ha public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + LanguageHelper languageHelper = new LanguageHelper(sharedPreferences.getString("language","en")); + Locale.setDefault(languageHelper.getLocale()); + Configuration configuration = new Configuration(); + if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN){ + configuration.locale = languageHelper.getLocale(); + } else { + configuration.setLocale(languageHelper.getLocale()); + } + getResources().updateConfiguration(configuration, + getResources().getDisplayMetrics()); + if (!HabiticaApplication.checkUserAuthentication(this, hostConfig)) { return; }