View Full Version : به کار گیری Locale در اندروید
sina4everafter
جمعه 19 اردیبهشت 1393, 12:35 عصر
سلام.اگه میشه من و راهنمایی کنید.
من می خوام برنامم به دو زبان فارسی و انگلیسی باشه.دو تا لی یوت ساختم و یک اکتیویتی.دو تا دکمه هم ساختم به اسم های فارسی و انگلیسی.می خوام وقتی که کاربر روی دکمه فارسی کلیک کرد مت و فارسی نشون بده و روی انگلیسی هم، انگلیسی نشون بده.فایل های values-fa و layout-fa و اینا هم ساختم و درسته.
کدم اینه.
@Override
public void onClick(View whichButton) {
//---switch---
switch (whichButton.getId()) {
case R.id.btn_persian:
Locale localeObjectFa = new Locale("fa");
Locale.setDefault(localeObjectFa);
Intent persianActivity = new Intent(FirstBMIActivity.this, CalculateBMIActivity.class);
startActivity(persianActivity);
break;
case R.id.btn_English:
Locale localeObjectEn = new Locale("en");
Locale.setDefault(localeObjectEn);
Intent englishActivity = new Intent(FirstBMIActivity.this, CalculateBMIActivity.class);
startActivity(englishActivity);
break;
ولی وقتی روی هر دو تا دکمه که کلیک می کنم، فقط انگلیسی و نشون میده.میشه بگین مشکل از کجاست؟ممنون اگه راهنمایی کنید.
sina4everafter
جمعه 19 اردیبهشت 1393, 17:57 عصر
دوستان کسی نیست من و راهنمایی کنه.
poorman
جمعه 19 اردیبهشت 1393, 18:17 عصر
سلام
کد اکتیویتی تون رو بذارید، شما احتمالا اونجا توی setContentView اون لیوت انگلیسی رو گذاشتید
باید یک متغیر public توی اکتیویتی داشته باشید که وقتی روی دکمه کلیک شد اون رو مقدار بدید
بعد توی onCreate اکتیویتی چک کنین اگر اون متغیر انگلیسی بود setContentView اون لیوت انگلیسی باشه
در غیر اینصورت فارسی
sina4everafter
جمعه 19 اردیبهشت 1393, 18:56 عصر
سلام.این هم کد اکتیویتیم.
توی setContentView لی یوت صفحه اول و گذاشتم.یعنی می خوام ابتدا یه صفحه نشون بده که دو تا دکمه داره، بعدش با توجه به دکمه ها به اکتیویتی های انگلیسی یا فارسی بره.نمی دونم مشکل کجاست.اگه راهنمایی کنید ممنون میشم.
package ir.blog.javaroid.bmicalculator;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class FirstBMIActivity extends Activity implements OnClickListener{
//---View---
Button btn_English, btn_Persian;//--End--
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_bmi_layout);
//---Link to the UI---
btn_English = (Button) findViewById(R.id.btn_English);
btn_Persian = (Button) findViewById(R.id.btn_persian);//---End---
//---setOnClickListener---
btn_English.setOnClickListener(this);
btn_Persian.setOnClickListener(this);//---End---
}
//---onClickListener---
@Override
public void onClick(View whichButton) {
//---switch---
switch (whichButton.getId()) {
case R.id.btn_persian:
Locale localeObjectFa = new Locale("fa");
Locale.setDefault(localeObjectFa);
Intent persianActivity = new Intent(FirstBMIActivity.this, CalculateBMIActivity.class);
startActivity(persianActivity);
break;
case R.id.btn_English:
Locale localeObjectEn = new Locale("en");
Locale.setDefault(localeObjectEn);
Intent englishActivity = new Intent(FirstBMIActivity.this, CalculateBMIActivity.class);
startActivity(englishActivity);
break;
}//---End of switch---
}//---End of onClickListener---
}
saeed_g21
جمعه 19 اردیبهشت 1393, 19:27 عصر
فکر کنم یک راه ساده ای هم باشه !!!!!
میتونی با استفاده از putExtra یک مقداری 1 و 2 رو به صفحه بعد بفرستی و در صفحه بعد بگیری با if شرایط بدی مثلا اگه 1 بود layout فارسی و 2 بود انگلیسی رو نشان بده !
sina4everafter
شنبه 20 اردیبهشت 1393, 19:23 عصر
سلام.دوستان میشه بیشتر توضیح بدین.ممنون.
poorman
شنبه 20 اردیبهشت 1393, 19:48 عصر
دوست عزیز چیزی که گفتم رو باید توی اکتیویتی CalculateBMIActivity پیاده سازی کنید نه اکتیویتی اول
توی متد onCreate اکتیویتی CalculateBMIActivity قبل از setContentView شرط بذارید درست میشه
sina4everafter
شنبه 20 اردیبهشت 1393, 19:59 عصر
دوست عزیز اگه میشه همون بخش کدی که لازم هست و بنویسین ممنون میشم.من اصلا نمی دونم چه شرطی و بذارم.تو رو خدا راهنمایی کنید.ممنون.
poorman
شنبه 20 اردیبهشت 1393, 20:13 عصر
اوکی کد اون اکتیویتی
CalculateBMIActivity رو بذارید تا من تغییراتش رو انجام بدم
sina4everafter
شنبه 20 اردیبهشت 1393, 21:10 عصر
سلام.من توی اکتیویتی دوم
(
CalculateBMIActivity)
هیچ کدی و فعلا ننوشتم.در حال حاضر فقط دو تا لی یوت درست کردم که یکی فارسیه و یکی انگلیسی.فقط کد اکتیویتی صفحه اول (لی یوت اول) و نوشتم که در بالا گذاشتم.
من نمی دونم شرط هایی که میگین و کجا باید بنویسم.ممنون.
package ir.blog.javaroid.bmicalculator;
import android.app.Activity;
import android.os.Bundle;
public class CalculateBMIActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calculate_bmi_layout);
}
}
poorman
شنبه 20 اردیبهشت 1393, 22:32 عصر
الان شما یکم منو گیج کردی :لبخند:
آقا شما توی اکتیویتی اول میخوای اگر روی دکمه فارسی کلیک شد، توی اکتیویتی دوم layout فارسی نشون بده
اگر که روی انگلیسی کلیک شد توی اکتیویتی دوم layout انگلیسی رو نشون بده
اگر این کار رو میخوای بکنی اکتیویتی دوم رو به این صورت بنویس
package ir.blog.javaroid.bmicalculator;
import android.app.Activity;
import android.os.Bundle;
public class CalculateBMIActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String locale = intent.getStringExtra("locale");
if(locale == "en"){
setContentView(R.layout.english_layout);
} else{
setContentView(R.layout.farsi_layout);
}
}
}
بعد توی اکتیویتی اول قبل از اینکه intent رو start کنید
این کد رو بنویسید ( برای دکمه انگلیسی مثلا )
englishActivity.putExtra("locale", "en");
امیدوارم منظورتون رو درست متوجه شده باشم ، اگر میخواین کار دیگه انجام بدید بگید
sina4everafter
یک شنبه 21 اردیبهشت 1393, 12:11 عصر
سلام.ببخشید که سوال زیاد می پرسم.
من دقیقا همون کاری که شما گفتین و می خوام انجام بدم.
یعنی توی صفحه اول دو تا دکمه باشه.یکی فارسی و یکی انگلیسی، و با توجه به کاربر که روی هر کدوم از دکمه ها کلیک می کنه به یکی از صفحه های فارسی یا انگلیسی بره.
من تا اینجای کار دو تا اکتیویتی درست کردم که اسم اکتیویتی اول:
FirstBMIActivity
و اسم اکتیویتی دوم:
CalculateBMIActivity.
در فولدر res یه فولدری با اسم : values-fa درست کردم که متن های فارسیمو توش نوشتم و توی فولدر values که به صورت خودکار ساخته میشه متن های انگلیسیمو وارد کردم.
همچنین در فولدر res دو فولدر دیگه با نام های layout-fa و layout-en، که به ترتیب باید صفحه رو فارسی یا انگلیسی نشون بدن.در فودلر layout که به صورت خودکار ساخته میشه، بنده هیچ لی یوتی به جز لی یوتی که به صفحه اول مربوط میشه نساختم.
حالا من دقیقا این کار هایی و که شما گفتین و انجام دادم، ولی وقتی برنامه رو اجرا می کنم و روی هر کدوم از دکمه ها که کلیک می کنم، برنامه کرش می کنه.
در ضمن من از موقعی که sdk اندروید و آپدیت کردم، و وقتی که یه پروژه جدیدی و درست می کنم، همراه با پروژه یه فایل دیگه ای با اسم: appcompat_v7
می سازه.احتمالا اشکال از این نیست؟
ممون اگه راهنماییم کنید.
sina4everafter
یک شنبه 21 اردیبهشت 1393, 18:57 عصر
سلام.ببخشید که سوال زیاد می پرسم.
من دقیقا همون کاری که شما گفتین و می خوام انجام بدم.
یعنی توی صفحه اول دو تا دکمه باشه.یکی فارسی و یکی انگلیسی، و با توجه به کاربر که روی هر کدوم از دکمه ها کلیک می کنه به یکی از صفحه های فارسی یا انگلیسی بره.
من تا اینجای کار دو تا اکتیویتی درست کردم که اسم اکتیویتی اول:
FirstBMIActivity
و اسم اکتیویتی دوم:
CalculateBMIActivity.
در فولدر res یه فولدری با اسم : values-fa درست کردم که متن های فارسیمو توش نوشتم و توی فولدر values که به صورت خودکار ساخته میشه متن های انگلیسیمو وارد کردم.
همچنین در فولدر res دو فولدر دیگه با نام های layout-fa و layout-en، که به ترتیب باید صفحه رو فارسی یا انگلیسی نشون بدن.در فودلر layout که به صورت خودکار ساخته میشه، بنده هیچ لی یوتی به جز لی یوتی که به صفحه اول مربوط میشه نساختم.
حالا من دقیقا این کار هایی و که شما گفتین و انجام دادم، ولی وقتی برنامه رو اجرا می کنم و روی هر کدوم از دکمه ها که کلیک می کنم، برنامه کرش می کنه.
در ضمن من از موقعی که sdk اندروید و آپدیت کردم، و وقتی که یه پروژه جدیدی و درست می کنم، همراه با پروژه یه فایل دیگه ای با اسم: appcompat_v7
می سازه.احتمالا اشکال از این نیست؟
ممون اگه راهنماییم کنید.
poorman
یک شنبه 21 اردیبهشت 1393, 19:27 عصر
شما از همین اول سعی نکنین خیلی پیشرفته جلو برید، سعی کنید مرحله به مرحله پروژه تون رو گسترش بدید
اول تنها با عوض کرد یک layout کار کنید، بعدش کم کم پیشرفته تر کار کنید
اینکه میگید ارور میده، میشه Logcat ارور رو بذارید
احتمال داره مشکل از این باشه که layout هاتون توی پوشه layout نیست !!!
sina4everafter
چهارشنبه 24 اردیبهشت 1393, 11:04 صبح
سلام دوست عزیز.ممنون.من هم در حال حاضر بیخیال همچین کاری شدم.هر کاری کردم نشد.
من تو یه شرکتی به عنوان کارآموز اندروید کار می کنم، ازم خواسته بودن که اینطوری برنامه رو بنویسم.فعلا برای دکمه فارسی یه Toast گذاشتم که وقتی کاربر روش کلیک می کنه می نویسه: coming soon که در آینده درست شه.
logcat هم این ارور و میده:
05-14 06:16:52.084: E/AndroidRuntime(1232): java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.blog.javaroid.bmicalculator/ir.blog.javaroid.bmicalculator.CalculateBMIActivit y}: android.content.res.Resources$NotFoundException: Resource ID #0x7f030018
saeed_g21
چهارشنبه 24 اردیبهشت 1393, 11:39 صبح
میتونی پروژت رو بدی برات حلش کنم ؟
sina4everafter
چهارشنبه 24 اردیبهشت 1393, 12:09 عصر
سلام.این لینک دانلود پروژم.ممنون اگه راهنمایی کنید.
دانلود. (http://www.mediafire.com/download/2mffz44zu94jnip/BMI_Calculator.zip)
saeed_g21
چهارشنبه 24 اردیبهشت 1393, 12:44 عصر
{ لینک جهت حفظ حریم خصوصی حذف شد }
ببین چیزی که میخواستی شده
sina4everafter
چهارشنبه 24 اردیبهشت 1393, 20:34 عصر
ممنون.یه مرحله بیشتر پیش رفت.ولی می دونید الان چه کاری و انجام نمیده.
من دو تا لی یوت درست کردم یکی برای فارسی و یکی برای انگلیسی.لی یوت انگلیسیم از چپ به راست (ه) و فارسی از راست به چپ.
الان وقتی روی دکمه فارسی کلیک می کنم، حالت لی یوت فارسی و نشون میده (از راست به چپ) ولی با متن انگلیسی.فارسی نمیشه.
دوست عزیز ممنون.تو زحمت افتادین.
saeed_g21
چهارشنبه 24 اردیبهشت 1393, 21:02 عصر
خواهش میکنم
ولی متوجه توضیحاتت نشدم!
sina4everafter
پنج شنبه 25 اردیبهشت 1393, 11:34 صبح
سلام.خوب هستین؟
می دونم یکم بد توضیح دادم.امیدوارم بتونم خوب منظورم و برسونم.
-------------------------------------------------------------------------
من دو تا لی یوت تعریف کردم، یکی برای فارسی و یکی برای انگلیسی.
همچنین یک فولدری با نام : values-fa که یه فایل xml داخلش ایجاد کردم و نوشته های فارسی و داخل این فایل نوشتم.
داخل فولدر values که به صورت پیش فرض ایجاد میشه هم متن های انگلیسی و وارد کردم.
-------------------------------------------------------------------------------------------------
من قبل از اینکه این کار و انجام بدم، دو تا اکتیویتی تعریف کردم که یکی برای لی یوت فارسی بود و یکی برای لی یوت انگلیسی.و id هایی که برای TextView ها و ... که برای لی یوت فارسی تعریف کردم با id های لی یوت انگلیسی فرق داشت.مثلا برای TextView فارسی نوشتم بودم:
@+id/txtView1st_Farsi
و برای TextView انگلیسی اینطور تعریف کرده بودم:
@+id/txtView1st_En
-------------------------------------
برای اینکه بخوام به لی یوت فارسی یه متنی و اختصاص بدم، توی فولدر values ( فقط از همین یک فولدربرای فارسی و انگلیسی استفاده می کردم.مثلا اینطوریمی نوشتم):
<string name="txtView1st_Farsi">BMI Calculator</string>
برای اینگلیسی هم اینطور می نوشتم:
<string name="txtView1st_En">BMI Calculator</string>
که اینطوری خیلی خوب و راحت برنامم اجرا میشد و لی یوت فارسی و فارسی نشون میداد و لی یوت انگلیسی و انگلیسی.
ولی توی این شرکتی که به عنوان کارآموز کار می کنم، وقتی این برنامم و دیدن اشکال گرفتن.گفتن بجای اینکه دو تا اکتیویتی تعریف کنی و بخوای از id های متفاوت استفاده کنی، بیا یک اکتیویتی تعریف کن و همه آی دی ها رو یکی در نظر بگیر.بجاش از متن های فارسی و داخل فولدر values-fa قرار بده و انگلیسی هم داخل فولدر values.و همچنین یه فولدر دیگه با نام layout-fa هم ایجاد کن و فایل xml لی یوت فارسی و توی این فولدر ایجاد کن.
و با به کار گیری locale کاری کن که خوده سیستم عامل تشخیص بده که از کدوم لی یوت استفاده کنه.همانطور که دیدین من کدم و گذاشتم، نشد.یعنی متن شو اصلا عوض نمی کنه.
ممنون از همه دوستانی که من و راهمایی کردن.ببخشید که دیگه خیلی این تاپیک طولانی شد.حالا اگر مشکلم حل نشد، بالاخره باید از خودشون بپرسم که دقیقا باید چیکار کنم.ممنون از همه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.