iT邦幫忙

2022 iThome 鐵人賽

DAY 30
1
Mobile Development

新手向Android&Kotlin學習紀錄30天系列 第 30

第30天 使用者介面本地化 - 多國語系 & 變更Launch Icon

  • 分享至 

  • xImage
  •  

多國語系簡介

想將應用程式讓更多人下載,提供多國語言的選項是不可避免的。
Android Studio提供了翻譯編輯器,讓我們對strings.xml資源檔做翻譯的編輯。沒錯只是編輯器,翻譯請自己來,或google也提供付費(以字計算)的翻譯服務
不管哪一種方式翻譯,都需要將專案中所有需要語言轉換的字串,都必須在strings.xml資源檔中管理。

先給今天程式碼

今天的例子 :
MainActivity中有2個按鈕,一個Delete按鈕會彈出Snackbar,一個Leave按鈕會跳出AlertDialog,有Ok跟Cancel按鍵都會彈出Toast。按下Ok還會呼叫onBackPressed()離開Activity。

在佈局檔

佈局檔中使用到的字串都要使用@string/keyName來引用,用哪一種layout不是重點,Button的排列不要重疊就好,完整的code就不貼出了。

    <Button
        android:id="@+id/btnDialog"
        android:text="@string/btnDialog"
        .../>
    <Button
        android:id="@+id/btnSnackbar"
        android:text="@string/delete"
        .../>

在MainActivity

這裡面設定的字串也都要使用R.string.keyName來引用,如:

  1. 變數
//變數使用getString(R.String.keyName)
val messageSb = getString(R.string.messageSb)
val messageSbUndo = getString(R.string.messageSbUndo)
  1. 傳入函數的引數
val snackbar = Snackbar.make(contextView, messageSb, Snackbar.LENGTH_INDEFINITE)
            snackbar.setActionTextColor(Color.YELLOW)
            //作為引數直接使用R.string.keyName
            snackbar.setAction(R.string.snackAction) {
                Snackbar.make(contextView, messageSbUndo, Snackbar.LENGTH_SHORT).show()

完整的MainActivity程式碼

class MainActivity : AppCompatActivity() {
    private val TAG = "MainActivity"
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate: ")
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val contextView = binding.constraintLayout
        val messageSb = getString(R.string.messageSb)
        val messageSbUndo = getString(R.string.messageSbUndo)
        //AlertDialog Button
        binding.btnDialog.setOnClickListener {
            val builder = AlertDialog.Builder(this)
            builder.apply {
                setTitle(R.string.dialogTitle)
                setPositiveButton(R.string.positiveAction) { _, _ ->
                    Toast.makeText(context, R.string.positiveAction, Toast.LENGTH_SHORT).show()
                    onBackPressed()
                }
                setNegativeButton(R.string.negativeAction) { _, _ ->
                    Toast.makeText(context, R.string.negativeAction, Toast.LENGTH_SHORT).show()
                }
                create()
            }
            builder.show()
        }
        //Snackbar Button
        binding.btnSnackbar.setOnClickListener { view ->
            val snackbar = Snackbar.make(contextView, messageSb, Snackbar.LENGTH_INDEFINITE)
            snackbar.setActionTextColor(Color.YELLOW)          
            snackbar.setAction(R.string.snackAction) {
            Snackbar.make(contextView, messageSbUndo, Snackbar.LENGTH_SHORT).show()
            }.show()
        }
    }

strings.xml

<resources>
    <string name="app_name">IronManProject</string>
    <string name="btnDialog" >Leave</string>
    <string name="delete">Delete</string>
    <string name="messageSb">Item is deleted</string>
    <string name="messageSbUndo">Undo</string>
    <string name="dialogTitle">Sure to leave?</string>
    <string name="positiveAction">"Ok"</string>
    <string name="negativeAction">"Cancel"</string>
    <string name="snackAction">"Undo"</string>
</resources>

翻譯編輯器在哪?

  1. 從視覺設計編輯器開啟(還是使用前天的activity當例子)
  2. 從專案結構在strings資料夾或strings.xml文件按滑鼠右鍵開啟。

開始編輯

  1. 編輯器介面長這樣,預設的語言會是英文,裡面會列出strings.xml中的所有字串
  2. 若要添加字串可以點擊加號「+」操作。
  3. 增加本地化的語言:本例翻譯成繁體中文,可以重複操作此步驟,增加多個語言。
  4. 完成後專案結構中會多一個繁體中文的strings.xml(zh_rTW)檔案
  5. 雙擊本地化語言的欄位添加繁體中文翻譯。若是不希望翻譯或沒有對應翻譯的詞句,如公司名、App名稱等,可以勾選Untranslatable。
  6. 若需刪除則在該行key欄位點擊左上方減號或滑鼠右鍵->Delete String或是直接到strings.xml檔中刪除。

這樣設定繁體中文化完成了,運行app看看,然後將手機或虛擬機的設置->系統->語言與輸入設定->改為繁體中文(各家手機的路徑可能有所不同),再回到這個app看看繁體中文化的效果:

請忽略影片轉gif後,畫質劣化QQ
原本英文

繁體中文化

參考:
官方文檔
官方文檔 Localize your app

更改App Launch icon

預設的是綠色背景+機器人圖像,開的專案多了之後每個icon長一樣也有點難找,所以來變更一下

這個圖示可以

  • 顯示在主畫面和裝置上已安裝應用程式的清單中。
  • 代表應用程式的捷徑 (例如可開啟聯絡人詳細資訊的聯絡人捷徑圖示)。
  • 供啟動器應用程式使用。
  • 讓用戶在Google Play找到應用程式。

圖片來源

  1. 可以自己匯入圖片,Image Asset Studio 支援下列檔案類型:PNG (建議)、JPG (可接受) 和 GIF (不建議)。
  2. 使用 Image Asset Studio內建的 material icons或Text。Image Asset Studio 可建立不同密度的各類圖示,並顯示這些圖示在專案中的位置。

使用material icons 替換預設 launch icon 步驟

  1. 開啟Image Asset Studio
  2. 「Icon Type」欄位中,應用程式支援 Android 8.0 版本選取「Launcher Icons (Adaptive & Legacy)」【註:若應用程式支援 Android 7.1 以下版本請選擇「Launcher Icons (Legacy Only)」】
  3. 「Name」欄位不改名的話,新的圖檔會覆蓋掉舊的圖檔。這個名稱只能包含小寫字元、底線和數字。
  4. 在「Foreground Layer」分頁中選取「Asset Type」:
    • 選取「Image」,指定圖片檔的路徑。
    • 選取「Clip Art」,指定 material icons中的圖示。這次選則使用這種icon。
    • 選取「Text」,指定文字字串並選取字型。
  5. 接著在「Background Layer」分頁中設置背景顏色或圖片。這裡我選擇改成黃色。
  6. 「Options」分頁中,設定是否產生舊版、圓形和 Google Play 商店圖示
  7. 接下來就是Next -> 設定要放哪個資料夾(現在先不用改) -> Finish -> Image Asset Studio 會將圖片新增至用於不同密度的「mipmap」資料夾。
  8. 然後到AndroidManifest.xml設定新的圖檔路徑:android:icon="@mipmap/ic_launcher_new"android:roundIcon="@mipmap/ic_launcher_new_round"
<application
        ...
        android:icon="@mipmap/ic_launcher_new"
        android:roundIcon="@mipmap/ic_launcher_new_round"
        ...>

運行專案看看成果吧:

終於完成不輕鬆卻充實30天發文挑戰!謝謝收看!


上一篇
第29天 單一個 Activity 生命週期介紹
系列文
新手向Android&Kotlin學習紀錄30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言