Оценете темата:
  • 0 гласа - средно 0
  • 1
  • 2
  • 3
  • 4
  • 5

Превод на атрибут от обект
#1

Здравейте колеги,
от доста време мъдря един проблем и много бих се радвал ако някой може да ми помогне.

Имам примерна база данни от 100тина обекта  с вид 
Obj ( string, double, double, double, int)
при начално стартиране на приложението базата ми данни (SQLite) се пълни с тези обект посредством Dao.
Искам да попитам дали е възможно и ако е - как се прави, да вкарам в параметъра STRING на обектите 2 стойности от съответно 2-та ми стринг файла ( единия е със английските стрингове, другия е с българските).
Крайната ми цел е пълен превод на приложението ми, само тези стрингове от самите обекти ми останаха и не мога да го измисля.

Втория вариант е при самия гетър на на string-а на обекта да добавя един транслатор атачнат към променливата, който да проверява на какъв език е телефона и от там да превежда думата - в такъв случай базата не я докосвам. Това също не ми хрумва как може да се случи, не съм го правил досега.

Благодаря.
Цитирай
Аксесоари
#2

за мултиленгуич апп прочете ли това https://developer.android.com/training/b.../languages
Цитирай
#3

Това, което си му дал е основно, ако стринговете са в strings.xml, а ние не знаем къде са му всички стрингове. може да са в текстови файлове в assets. ако е така, това май няма да помогне. а и ако иска да превежда с бутон в приложението, а не според езика на устройството, това пак няма да свърши работа.
Аз искам да попитам, всички стрингове от къде ги вземаш? Ако са в текстови файлове, четеш двата файла с двата езика, вкарваш всичките им елементи в два масива и когато вкарваш в базата проверяваш езика.
Демек имаш array_bg и array_en, които са пълни с всички думи и преводите им.
И след това като пълниш базата
if (language == bg) {
stringInTheObject = array_bg[i]
} else {
stringInTheObject = array_en[i]
}
Това е най-селския начин, обяснен накратко. Ествествено си обхождаш всички елементи и един по един си добавяш елементите от езика към обектите и след това си пълниш обектите в базата. Доколкото разбирам нещо такова искаш.
Цитирай
#4

Така, имам 2 стринг файла - единия с английски стрингове, другия с български. Проблема е, че дори не мога да сложа стринг от тези файлове като параметър на обекта, а използвам хардкоуднат стринг. Dao не иска да ми вкара обектите в базата по този начин, дава ми грешка и крашва. Та, аз сменям езика си без бутон, според това какъв е езика на телефона се използва единия или другия файл. (Strings)

Това е, когато се опитвам да добавя стринг като параметър на обекта -> понеже го има в 2 стринг файла и SQLite-а не знае какво да прави (според мен).

Иначе като говорим за селски методи, винаги мога да добавя още един параметър на обекта със хардкоудната кирилица и да вадя него със if/else за локализацията. Ще стане една свинщина защото приложението ми е над 10К реда код сумарно.
Цитирай
#5

как вземаш стринга?
мисля, че трябва да е getString(R.string.something) и трябва да си работи. не виждам защо да не става.

изхода на горната функция е String формат и няма разлика дали си написал горното или си написал "something"
Цитирай
#6

(2019-05-21, 20:54:54)yo_asakura написа:  как вземаш стринга?
мисля, че трябва да е getString(R.string.something) и трябва да си работи. не виждам защо да не става.

изхода на горната функция е String формат и няма разлика дали си написал горното или си написал "something"

Там където вкарвам обектите класа е абстрактен, не мога да използвам getString, или поне няма с какво. Пробвах със Resources.getSystem().getString(----)
Пробвах и със Context.getResources().getString(-----)
Базата не ги иска, защото не знае кой стринг да вкара в колоната, този на английски или този на български, тук е съществения проблем.
Цитирай
#7

Трябва да намериш как да си подадеш контекста на тоя клас. Ето вариант:

Create a subclass of Application, for instance public class App extends Application {

Set the android:name attribute of your <application> tag in the AndroidManifest.xml to point to your new class, e.g. android:name=".App"

In the onCreate() method of your app instance, save your context (e.g. this) to a static field named mContext and create a static method that returns this field, e.g. getContext():

This is how it should look:


Код:
public class App extends Application {

private static Context mContext;

@Override public void onCreate() {
  super.onCreate();
  mContext = this;
}

public static Context getContext() {
  return mContext;
}
}


Now you can use: App.getContext() whenever you want to get a context, and then getResources() (or App.getContext().getResources()).

чети още тук: https://stackoverflow.com/questions/4253...r-activity
Цитирай
#8

(2019-05-22, 10:21:40)yo_asakura написа:  Трябва да намериш как да си подадеш контекста на тоя клас. Ето вариант:

Create a subclass of Application, for instance public class App extends Application {

Set the android:name attribute of your <application> tag in the AndroidManifest.xml to point to your new class, e.g. android:name=".App"

In the onCreate() method of your app instance, save your context (e.g. this) to a static field named mContext and create a static method that returns this field, e.g. getContext():

This is how it should look:


Код:
public class App extends Application {

private static Context mContext;

@Override public void onCreate() {
 super.onCreate();
 mContext = this;
}

public static Context getContext() {
 return mContext;
}
}


Now you can use: App.getContext() whenever you want to get a context, and then getResources() (or App.getContext().getResources()).

чети още тук: https://stackoverflow.com/questions/4253...r-activity

Благодаря за отговора, мисля че този вариант съм го пробвал преди и пак проблема е - с какво ще се запълни въпросната колона в базата ми с данни. Кой стринг ще вземе, при положение, че базата се пълни САМО един единствен път след инсталиране на приложението. След това по никакъв начин не се променя.

Засега временно съм го направил с проверка на езика на телефона при първоначална инсталация и според него вкарвам български или английски данни.
Цитирай
#9

Базата ще се напълни със сътвения стринг според езика на устройството. Ако по-късно се смени езика, трябва да изчистиш базата и да я напълниш наново. Другия вариант е да имаш 2 бази - по една за всеки език. Така показваш базата, според езика на устройството. И третия вариант е да си добавиш в базата още една колона от стрингове, която да ти е втория език. И всеки път когато зареждаш данните, показваш само колоната на съответния език.

Аз бих използвал втория или третия вариант. Ще си направя 2 бази и ще използвам само базата за съответния език. Или една база, която да има всички езици. И при поакзване на информацията ще проверявам езика и показвам само това, което трябва.
Цитирай
#10

По-добре обясни какво приложение искаш да направиш, а не какво сега се опитваш да направиш с текстовете за превод. Защо ти е превода да го наливаш в база.

Ако сега навлизаш в програмирането по-добре да ти се подскаже правилния начин, а не да се омажеш до гуша и да се чудиш, какво да правиш.



@yo_asakura по-добре не го съветвай да прави 123123 бази за 1 арр. Това даже не може да се влезе в класацията "лоша практика"
Цитирай
#11

Приложение не се опитвам да правя, приложението е готово, това което правя е поддръжката на български език. Стигнах до самата база и питам за съотвения проблем. В момента работя с вариант 2. Ако все пак някой се сети за нещо по-разумно, много бих се радвал да го сподели.

@ndsbg Моля да обясниш кое не разбра и защо да не налея превода в базата ако е възможно?

Искам 1 колона от базата да излиза на 2та езика според стринг файловете, това е, търся начин да го направя.
Цитирай
#12

Демек искаш да си преведеш съдържанието на приложението, а не самия интерфейс. Тогава значи отпада превода с string-en.xml string-bg.xml и т.н.

След като е твое приложението защо не си праправиш базата multilanguage
пример:
pages
id
lang
title
content
date

и след като си detect-нал езика да направиш един прост селект към базата

select * from pages where lang = '{detected_lang}' and id = '{selected_page}';
// detected_lang е езика който си взел от устройството
// selected_page активитито/фрагмента което/който си отворил
Цитирай
#13

(2019-05-23, 12:06:55)ndsbg написа:  Демек искаш да си преведеш съдържанието на приложението, а не самия интерфейс. Тогава значи отпада превода с string-en.xml string-bg.xml и т.н.

След като е твое приложението защо не си праправиш базата multilanguage
пример:
pages
id
lang
title
content
date

и след като си detect-нал езика да направиш един прост селект към базата

select * from pages where lang = '{detected_lang}' and id = '{selected_page}';
// detected_lang е езика който си взел от устройството
// selected_page активитито/фрагмента което/който си отворил

Интерфейса + съдържанието искам да преведа, интерфейса е готов със string.xml, остава ми съдържанието на базата и по-точно едната колона понеже другите са числа.
Благодаря за тази идея, ако някакъв линк или бърза информация как се случва този multilanguage на базата.
Цитирай




Потребители разглеждащи темата: 1 гост(и)