浏览代码

增加多语言设置,默认中文

weizhengliang 2 年之前
父节点
当前提交
b47676a16d

+ 36 - 14
app/src/main/java/com/example/informationkanban/InitActivity.java

@@ -23,6 +23,8 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.blankj.utilcode.util.NetworkUtils;
 import com.example.informationkanban.utils.GetInformationUtils;
+import com.example.informationkanban.utils.LanguageSetDialogHelper;
+import com.example.informationkanban.utils.LocaleMangerUtils;
 import com.example.informationkanban.utils.NetFunctionConfig;
 
 public class InitActivity extends AppCompatActivity {
@@ -39,6 +41,7 @@ public class InitActivity extends AppCompatActivity {
     private Button btnChangeIp;
     private Button btnSettings;
     private Button btnEnterMain;
+    private Button btnLanguageSet;
 
     private boolean loop = true;
     private boolean connected = false;
@@ -47,6 +50,9 @@ public class InitActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        int languageId = NetFunctionConfig.getLanguageId(this);
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId);
+
         super.onCreate(savedInstanceState);
         setContentView(R.layout.init_layout);
 
@@ -60,7 +66,7 @@ public class InitActivity extends AppCompatActivity {
         tvServer = findViewById(R.id.textView_server_ip);
         tvServerStatus = findViewById(R.id.textView_server_status);
         tvVersion = findViewById(R.id.textView_version);
-        tvVersion.setText("版本: V" + BuildConfig.VERSION_NAME);
+        tvVersion.setText("App version: V" + BuildConfig.VERSION_NAME);
         tvTime = findViewById(R.id.textView_countdown);
         group = findViewById(R.id.group_webview_type);
         btnWebview = findViewById(R.id.radio_webview);
@@ -68,6 +74,7 @@ public class InitActivity extends AppCompatActivity {
         btnChangeIp = findViewById(R.id.btn_change_ip);
         btnSettings = findViewById(R.id.btn_settings);
         btnEnterMain = findViewById(R.id.btn_enter_main);
+        btnLanguageSet = findViewById(R.id.btn_change_language);
 
         //webview类型,默认为原生webview
         if (NetFunctionConfig.getWebviewType() == 1) {
@@ -76,7 +83,7 @@ public class InitActivity extends AppCompatActivity {
             btnXwalk.setChecked(true);
         }
 
-        tvServer.setText("服务器IP: " + NetFunctionConfig.getServerIp() + ":" + NetFunctionConfig.getServerPort());
+        tvServer.setText("Server: " + NetFunctionConfig.getServerIp() + ":" + NetFunctionConfig.getServerPort());
 
         group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
@@ -133,6 +140,20 @@ public class InitActivity extends AppCompatActivity {
             }
         });
 
+        btnLanguageSet.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //取消倒计时
+                if (countDownTimer != null) {
+                    countDownTimer.cancel();
+                }
+                btnEnterMain.setVisibility(View.VISIBLE);
+                tvTime.setVisibility(View.INVISIBLE);
+
+                LanguageSetDialogHelper.showDialog(InitActivity.this);
+            }
+        });
+
         //检查服务器连接情况
         checkServer();
     }
@@ -145,19 +166,19 @@ public class InitActivity extends AppCompatActivity {
         editIp.setText(NetFunctionConfig.getServerIp());
         final EditText editPort = contentView.findViewById(R.id.edit_server_port);
         editPort.setText(NetFunctionConfig.getServerPort());
-        builder.setTitle("设置服务器IP和端口");
-        builder.setPositiveButton("保存", new DialogInterface.OnClickListener() {
+        builder.setTitle(R.string.str_set_server_ip);
+        builder.setPositiveButton(R.string.str_save, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
                 String newIp = editIp.getText().toString();
                 String newPort = editPort.getText().toString();
                 NetFunctionConfig.setServerIp(newIp);
                 NetFunctionConfig.setServerPort(newPort);
-                tvServer.setText("服务器IP: " + newIp + ":" + newPort);
+                tvServer.setText("Server: " + newIp + ":" + newPort);
             }
         });
 
-        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
+        builder.setNegativeButton(R.string.str_cancel, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
                 //
@@ -173,7 +194,8 @@ public class InitActivity extends AppCompatActivity {
             @Override
             public void onTick(long millisUntilFinished) {
                 long untilTime = millisUntilFinished/1000;
-                tvTime.setText("倒计时: " + untilTime + "秒");
+                String time = getString(R.string.str_count_down, untilTime);
+                tvTime.setText(time);
             }
 
             @Override
@@ -202,7 +224,7 @@ public class InitActivity extends AppCompatActivity {
                         showServerStatus(false);
                         showMessage();
                         try {
-                            Thread.sleep(6000);
+                            Thread.sleep(10000);
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
@@ -232,10 +254,10 @@ public class InitActivity extends AppCompatActivity {
             public void run() {
                 if (status) {
                     tvServerStatus.setTextColor(Color.GREEN);
-                    tvServerStatus.setText("服务器连接成功");
+                    tvServerStatus.setText(R.string.str_connect_success);
                 } else {
                     tvServerStatus.setTextColor(Color.RED);
-                    tvServerStatus.setText("服务器连接失败");
+                    tvServerStatus.setText(R.string.str_connect_fail);
                 }
             }
         });
@@ -247,9 +269,9 @@ public class InitActivity extends AppCompatActivity {
             public void run() {
                 if (tvMac != null && tvIP != null) {
                     //tvMac.setText("MAC地址: " + GetInformationUtils.getMacAddress(InitActivity.this));
-                    tvMac.setText("设备ID: " + GetInformationUtils.getSerialNo(getApplicationContext()));
-                    tvIP.setText("本机IP地址: " + GetInformationUtils.getLocalIP());
-                    tvServer.setText("服务器IP: " + NetFunctionConfig.getServerIp() + ":" + NetFunctionConfig.getServerPort());
+                    tvMac.setText("Device ID: " + GetInformationUtils.getSerialNo(getApplicationContext()));
+                    tvIP.setText("Local IP: " + GetInformationUtils.getLocalIP());
+                    tvServer.setText("Server IP: " + NetFunctionConfig.getServerIp() + ":" + NetFunctionConfig.getServerPort());
                 }
             }
         });
@@ -259,7 +281,7 @@ public class InitActivity extends AppCompatActivity {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                Toast.makeText(InitActivity.this, "连接服务器失败,请检查网络", Toast.LENGTH_SHORT).show();
+                Toast.makeText(InitActivity.this, R.string.tips_server_connect_error, Toast.LENGTH_SHORT).show();
             }
         });
     }

+ 5 - 7
app/src/main/java/com/example/informationkanban/MainActivity.java

@@ -36,6 +36,7 @@ import com.example.informationkanban.tcp.dto.TcpModel;
 import com.example.informationkanban.tcp.enums.TcpAction;
 import com.example.informationkanban.utils.AppUtil;
 import com.example.informationkanban.utils.GetInformationUtils;
+import com.example.informationkanban.utils.LocaleMangerUtils;
 import com.example.informationkanban.utils.NetFunctionConfig;
 
 import org.greenrobot.eventbus.EventBus;
@@ -52,6 +53,9 @@ public class MainActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        int languageId = NetFunctionConfig.getLanguageId(this);
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId);
+
         super.onCreate(savedInstanceState);
 //        requestWindowFeature(Window.FEATURE_NO_TITLE);
 //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
@@ -63,7 +67,7 @@ public class MainActivity extends AppCompatActivity {
         if (!TextUtils.isEmpty(MAC)) {
             accessTheWebpage();
         } else {
-            Toast.makeText(this, "设备信息获取失败", Toast.LENGTH_LONG).show();
+            Toast.makeText(this, R.string.tips_device_info_error, Toast.LENGTH_LONG).show();
         }
         timeMonitor();
 
@@ -213,12 +217,6 @@ public class MainActivity extends AppCompatActivity {
 
             //finish();
         }
-//        new Handler().postDelayed(new Runnable() {
-//            @Override
-//            public void run() {
-//                finish();
-//            }
-//        }, 5000);
 
     }
 

+ 22 - 0
app/src/main/java/com/example/informationkanban/application/MyApplication.java

@@ -1,6 +1,13 @@
 package com.example.informationkanban.application;
 
 import android.app.Application;
+import android.content.Context;
+import android.content.res.Configuration;
+
+import androidx.annotation.NonNull;
+
+import com.example.informationkanban.utils.LocaleMangerUtils;
+import com.example.informationkanban.utils.NetFunctionConfig;
 
 public class MyApplication extends Application {
 
@@ -15,4 +22,19 @@ public class MyApplication extends Application {
         return myApplication;
     }
 
+    @Override
+    protected void attachBaseContext(Context base) {
+        int languageId = NetFunctionConfig.getLanguageId(base);
+        LocaleMangerUtils.setApplicationLanguageByIndex(base, languageId);
+
+        super.attachBaseContext(base);
+    }
+
+    @Override
+    public void onConfigurationChanged(@NonNull Configuration newConfig) {
+        int languageId = NetFunctionConfig.getLanguageId(myApplication);
+        LocaleMangerUtils.setApplicationLanguageByIndex(myApplication, languageId);
+
+        super.onConfigurationChanged(newConfig);
+    }
 }

+ 18 - 0
app/src/main/java/com/example/informationkanban/utils/AppUtil.java

@@ -1,9 +1,13 @@
 package com.example.informationkanban.utils;
 
 import android.app.AlarmManager;
+import android.app.PendingIntent;
 import android.content.Context;
+import android.content.Intent;
 import android.text.TextUtils;
 
+import com.example.informationkanban.InitActivity;
+
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
@@ -104,4 +108,18 @@ public class AppUtil {
         alarmManager.setTimeZone(timezone);
         alarmManager.setTime(timeMills);
     }
+
+
+    public static void restartApp(Context context) {
+        //重新启动app
+        Intent mStartActivity = new Intent(context.getApplicationContext(), InitActivity.class);
+        mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        int mPendingIntentId = 123456;
+        PendingIntent mPendingIntent = PendingIntent.getActivity(context.getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+        AlarmManager mgr = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
+        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1500, mPendingIntent);
+
+        android.os.Process.killProcess(android.os.Process.myPid());
+        System.exit(0);
+    }
 }

+ 140 - 0
app/src/main/java/com/example/informationkanban/utils/LanguageSetDialogHelper.java

@@ -0,0 +1,140 @@
+package com.example.informationkanban.utils;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.Handler;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+import com.example.informationkanban.R;
+import com.example.informationkanban.application.MyApplication;
+
+
+public class LanguageSetDialogHelper {
+
+    private static AlertDialog dialog;
+    private static int selectIndex;
+
+    public static void showDialog(final Activity activity) {
+        if (dialog != null && dialog.isShowing()) {
+            return;
+        }
+
+        final int originIndex = LocaleMangerUtils.getCurrentLocaleIndex();
+        selectIndex = originIndex;
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.language_set_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        /*RadioButton btnYes = contentView.findViewById(R.id.rb_language_yes);
+        RadioButton btnNo = contentView.findViewById(R.id.rb_language_no);
+        final int mode = SettingConfig.getLanguageMode(activity);
+        if (mode == 0) {
+            btnYes.setChecked(true);
+        } else {
+            btnNo.setChecked(true);
+        }*/
+
+        Button buttonCancel = contentView.findViewById(R.id.cancel_button);
+        Button buttonConfirm = contentView.findViewById(R.id.confirm_button);
+        Spinner spinner = contentView.findViewById(R.id.spinner_language_select);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(activity,
+                R.array.language_list, R.layout.spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinner.setAdapter(adapter);
+        spinner.setSelection(originIndex);
+        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                Log.d("languageId", "pos: " + position + ", originIndex: " + originIndex);
+                selectIndex = position;
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+
+        /*RadioGroup languageGroup = contentView.findViewById(R.id.group_language_mode);
+        languageGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup group, int checkedId) {
+                if (checkedId == R.id.rb_language_yes) {
+                    SettingConfig.setLanguageMode(activity, 0);
+                } else {
+                    SettingConfig.setLanguageMode(activity, 1);
+                }
+            }
+        });*/
+
+        buttonCancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (dialog != null) {
+                    dialog.dismiss();
+                }
+            }
+        });
+
+        buttonConfirm.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                NetFunctionConfig.setLanguageId(MyApplication.getInstance(), selectIndex);
+
+                //if (SettingConfig.getLanguageMode(activity) == 1) {
+                    if (selectIndex != originIndex) {
+                        Toast.makeText(activity, "restart now...", Toast.LENGTH_LONG).show();
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                AppUtil.restartApp(activity);
+                            }
+                        }, 3000);
+                    }
+                /*} else {
+                    Toast.makeText(activity, "restart now...", Toast.LENGTH_LONG).show();
+                    new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            AppUpdateHelper.restartApp(activity);
+                        }
+                    }, 3000);
+                }*/
+
+                if (dialog != null) {
+                    dialog.dismiss();
+                }
+            }
+        });
+
+        dialog = builder.create();
+        //dialog.setCanceledOnTouchOutside(false);
+        //dialog.setCancelable(false);
+        dialog.show();
+
+        //设置dialog宽高及位置
+        try {
+            Window window = dialog.getWindow();
+            WindowManager.LayoutParams lp = window.getAttributes();
+            lp.width = 480;
+            lp.height = 420;
+            lp.gravity = Gravity.CENTER;
+            window.setAttributes(lp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 82 - 0
app/src/main/java/com/example/informationkanban/utils/LocaleMangerUtils.java

@@ -0,0 +1,82 @@
+package com.example.informationkanban.utils;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Build;
+import android.util.DisplayMetrics;
+import android.util.Log;
+
+import androidx.annotation.RequiresApi;
+
+import com.example.informationkanban.R;
+import com.example.informationkanban.application.MyApplication;
+
+import java.util.Locale;
+
+public class LocaleMangerUtils {
+
+    public static Locale getSystemLocale() {
+        return Locale.getDefault();
+    }
+
+    //获取当前语言id: 0--auto, 1--English, 2--中文, 3--西班牙语, 4--俄语
+    public static int getCurrentLocaleIndex() {
+        int languageSize = MyApplication.getInstance().getResources().getStringArray(R.array.language_list).length;
+        int index = NetFunctionConfig.getLanguageId(MyApplication.getInstance());
+        //Log.d("wzl", "current language index: " + index);
+        if (index >= 0 && index <languageSize) {
+            return index;
+        } else {
+            return 0;
+        }
+    }
+
+    public static void setApplicationLanguageByIndex(Context context, int index) {
+        Locale locale = Locale.getDefault();
+        switch (index) {
+            case 0:
+                //
+                break;
+            case 1:
+                locale = Locale.ENGLISH;
+                break;
+            case 2:
+                locale = Locale.CHINESE;
+                break;
+            case 3:
+                locale = new Locale("es");
+                break;
+            case 4:
+                locale = new Locale("ru");
+                break;
+        }
+
+        setApplicationLanguage(context, locale);
+    }
+
+    public static void setApplicationLanguage(Context context, Locale locale) {
+        Log.d("locale", "set locale language: " + locale.getLanguage());
+        Configuration configuration = context.getResources().getConfiguration();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            configuration.setLocale(locale);
+        } else {
+            configuration.locale = locale;
+        }
+        // 更新context中的语言设置
+        Resources resources = context.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        resources.updateConfiguration(configuration, dm);
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    public static Locale getApplicationLocale() {
+        Configuration config = MyApplication.getInstance().getResources().getConfiguration();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return config.locale;
+        } else {
+            return config.getLocales().get(0);
+        }
+    }
+
+}

+ 22 - 0
app/src/main/java/com/example/informationkanban/utils/NetFunctionConfig.java

@@ -18,6 +18,10 @@ public class NetFunctionConfig {
 
     private static final String UUID = "UUID";
 
+    //默认语言
+    private static final String KEY_LANGUAGE_ID = "KEY_LANGUAGE_ID";
+    private static final String KEY_LANGUAGE_MODE = "KEY_LANGUAGE_MODE";
+
     private static final String default_server_ip = "172.28.100.100";
     //private static final String default_server_ip = "8.129.220.143";
     private static final String default_server_port = "8100";
@@ -62,13 +66,31 @@ public class NetFunctionConfig {
         return getSP().getString(UUID, "NULL");
     }
 
+    public static int getLanguageId(Context context) {
+        //0--auto, 1--English, 2--中文, 3--西班牙语, 4--俄语
+        return getSP(context).getInt(KEY_LANGUAGE_ID, 2);
+    }
+
+    public static void setLanguageId(Context context, int id) {
+        getEditor(context).putInt(KEY_LANGUAGE_ID, id).apply();
+    }
+
+
     private static SharedPreferences getSP() {
         return MyApplication.getInstance().getSharedPreferences(INFORMATION_KAN_BAN_KEY, Context.MODE_PRIVATE);
     }
 
+    private static SharedPreferences getSP(Context context) {
+        return context.getSharedPreferences(INFORMATION_KAN_BAN_KEY, Context.MODE_PRIVATE);
+    }
+
     private static SharedPreferences.Editor getEditor() {
         return getSP().edit();
     }
 
+    private static SharedPreferences.Editor getEditor(Context context) {
+        return getSP(context).edit();
+    }
+
 
 }

+ 16 - 10
app/src/main/res/layout/init_layout.xml

@@ -10,7 +10,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="40dp"
-        android:text="mac地址"
+        android:text="MAC:"
         android:textSize="28sp" />
 
     <TextView
@@ -18,7 +18,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
-        android:text="本机IP地址"
+        android:text="Local IP:"
         android:textSize="28sp" />
 
     <TextView
@@ -26,7 +26,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
-        android:text="服务器IP"
+        android:text="Server IP:"
         android:textSize="28sp" />
 
     <TextView
@@ -41,24 +41,31 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp">
         <Button
+            android:id="@+id/btn_change_language"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/setting_language"
+            android:textSize="20sp"/>
+        <Button
             android:id="@+id/btn_change_ip"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="修改服务器地址"
+            android:layout_marginLeft="20dp"
+            android:text="@string/setting_change_server"
             android:textSize="20sp"/>
         <Button
             android:id="@+id/btn_settings"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
-            android:text="进入设置"
+            android:text="@string/enter_settings"
             android:textSize="20sp"/>
         <TextView
             android:id="@+id/textView_version"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
-            android:text="APP版本"
+            android:text="APP version"
             android:textSize="20sp" />
     </LinearLayout>
 
@@ -73,7 +80,7 @@
             android:id="@+id/radio_webview"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="使用系统Webview"
+            android:text="@string/use_system_webview"
             android:textSize="20sp"/>
         <RadioButton
             android:id="@+id/radio_xwalk"
@@ -81,7 +88,7 @@
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
             android:layout_marginStart="20dp"
-            android:text="使用内置Webview"
+            android:text="@string/use_app_webview"
             android:textSize="20sp"/>
     </RadioGroup>
 
@@ -90,7 +97,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="10dp"
-        android:text="进入信息看板"
+        android:text="@string/enter_info_board"
         android:textSize="20sp"
         android:visibility="invisible"/>
 
@@ -99,7 +106,6 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="40dp"
-        android:text="倒计时"
         android:textColor="#ff0000"
         android:textSize="28sp" />
 </LinearLayout>

+ 79 - 0
app/src/main/res/layout/language_set_dialog.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="20dp"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <!--<TextView
+        android:id="@+id/tv_language_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:text="@string/language_set_mode"
+        android:textSize="24sp" />
+
+    <RadioGroup
+        android:id="@+id/group_language_mode"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:orientation="horizontal">
+        <RadioButton
+            android:id="@+id/rb_language_yes"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/str_yes"/>
+        <RadioButton
+            android:id="@+id/rb_language_no"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="4dp"
+            android:text="@string/str_no"/>
+    </RadioGroup>-->
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:text="@string/setting_language"
+            android:textSize="24sp" />
+
+        <Spinner
+            android:id="@+id/spinner_language_select"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="60dp"
+        android:gravity="center_horizontal">
+        <Button
+            android:id="@+id/confirm_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:text="@string/str_confirm"
+            android:textSize="20sp" />
+
+        <Button
+            android:id="@+id/cancel_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="80dp"
+            android:padding="8dp"
+            android:text="@string/str_cancel"
+            android:textSize="20sp" />
+    </LinearLayout>
+
+</LinearLayout>

+ 10 - 0
app/src/main/res/layout/spinner_item.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:singleLine="true"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:padding="4dp"
+    android:ellipsize="marquee"
+    android:textAlignment="inherit"
+    android:textSize="20sp"/>

+ 12 - 0
app/src/main/res/values-zh-rCN/arrays.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+    <string-array name="language_list">
+        <item value="0">跟随系统</item>
+        <item value="1">英语</item>
+        <item value="2">中文</item>
+        <!--<item value="3">西班牙语</item>
+        <item value="4">俄语</item>-->
+    </string-array>
+
+</resources>

+ 19 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -0,0 +1,19 @@
+<resources>
+    <string name="app_name">InfoBoard2</string>
+
+    <string name="setting_language">语言设置</string>
+    <string name="setting_change_server">修改服务器地址</string>
+    <string name="enter_settings">进入设置</string>
+    <string name="use_system_webview">使用系统webview</string>
+    <string name="use_app_webview">使用内置webview</string>
+    <string name="enter_info_board">进入信息看板</string>
+    <string name="str_count_down">倒计时: %d</string>
+    <string name="str_set_server_ip">设置服务器IP和端口</string>
+    <string name="str_confirm">确认</string>
+    <string name="str_save">保存</string>
+    <string name="str_cancel">取消</string>
+    <string name="str_connect_success">服务器连接成功</string>
+    <string name="str_connect_fail">服务器连接失败</string>
+    <string name="tips_server_connect_error">服务器连接失败,请检查网络</string>
+    <string name="tips_device_info_error">设备信息获取失败</string>
+</resources>

+ 12 - 0
app/src/main/res/values/arrays.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+    <string-array name="language_list">
+        <item value="0">Auto</item>
+        <item value="1">English</item>
+        <item value="2">Chinese</item>
+        <!--<item value="3">Spanish</item>
+        <item value="4">Russian</item>-->
+    </string-array>
+
+</resources>

+ 17 - 1
app/src/main/res/values/strings.xml

@@ -1,3 +1,19 @@
 <resources>
-    <string name="app_name">信息看板2</string>
+    <string name="app_name">InfoBoard2</string>
+
+    <string name="setting_language">Language set</string>
+    <string name="setting_change_server">Change server</string>
+    <string name="enter_settings">Settings</string>
+    <string name="use_system_webview">System webview</string>
+    <string name="use_app_webview">App webview</string>
+    <string name="enter_info_board">Enter InfoBoard</string>
+    <string name="str_count_down">Countdown: %d</string>
+    <string name="str_set_server_ip">Set server IP/Port</string>
+    <string name="str_confirm">Confirm</string>
+    <string name="str_save">Save</string>
+    <string name="str_cancel">Cancel</string>
+    <string name="str_connect_success">Connect server success</string>
+    <string name="str_connect_fail">Connect server failed</string>
+    <string name="tips_server_connect_error">Connect server failed, please check network</string>
+    <string name="tips_device_info_error">Get device info error</string>
 </resources>