diff --git a/companion/domain/src/main/java/com/stormpanda/megingiard/macropad/MacroPadState.kt b/companion/domain/src/main/java/com/stormpanda/megingiard/macropad/MacroPadState.kt index cc39b61d..95ca4717 100644 --- a/companion/domain/src/main/java/com/stormpanda/megingiard/macropad/MacroPadState.kt +++ b/companion/domain/src/main/java/com/stormpanda/megingiard/macropad/MacroPadState.kt @@ -14,6 +14,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import java.util.Locale import java.util.UUID private const val TAG = "MacroPadState" @@ -21,6 +22,13 @@ private const val MP_DEFAULT_PROFILE_NAME = "Profile" private const val MP_DEFAULT_LAYOUT_NAME = "Layout" private const val DUPLICATE_BUTTON_OFFSET = 0.05f +private fun defaultInitialName(): String = + when (Locale.getDefault().language.lowercase()) { + "zh" -> "預設" + "de" -> "Standard" + else -> "Default" + } + private fun List.nextUniqueName( baseName: String, fallback: String, @@ -170,13 +178,14 @@ object MacroPadState { needsSave = true val defaultId = UUID.randomUUID().toString() val defaultLayoutId = UUID.randomUUID().toString() + val initialName = defaultInitialName() listOf( PadProfile( id = defaultId, - name = "Default", + name = initialName, layouts = listOf( - PadLayout(id = defaultLayoutId, name = "Default", mirrorCutouts = listOf(ScreenCutout.createDefault())), + PadLayout(id = defaultLayoutId, name = initialName, mirrorCutouts = listOf(ScreenCutout.createDefault())), ), activeLayoutId = defaultLayoutId, ), @@ -337,11 +346,12 @@ object MacroPadState { fun restoreDefaults() { val defaultId = UUID.randomUUID().toString() val defaultLayoutId = UUID.randomUUID().toString() + val initialName = defaultInitialName() val defaultProfile = PadProfile( id = defaultId, - name = "Default", - layouts = listOf(PadLayout(id = defaultLayoutId, name = "Default", mirrorCutouts = listOf(ScreenCutout.createDefault()))), + name = initialName, + layouts = listOf(PadLayout(id = defaultLayoutId, name = initialName, mirrorCutouts = listOf(ScreenCutout.createDefault()))), activeLayoutId = defaultLayoutId, ) _profiles.value = listOf(defaultProfile) diff --git a/companion/domain/src/test/java/com/stormpanda/megingiard/macropad/MacroPadStateTest.kt b/companion/domain/src/test/java/com/stormpanda/megingiard/macropad/MacroPadStateTest.kt index f507c679..0fd8bba2 100644 --- a/companion/domain/src/test/java/com/stormpanda/megingiard/macropad/MacroPadStateTest.kt +++ b/companion/domain/src/test/java/com/stormpanda/megingiard/macropad/MacroPadStateTest.kt @@ -14,6 +14,7 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test +import java.util.Locale import java.util.UUID /** @@ -23,14 +24,18 @@ import java.util.UUID @OptIn(ExperimentalCoroutinesApi::class) class MacroPadStateTest { private val testDispatcher = UnconfinedTestDispatcher() + private lateinit var originalLocale: Locale @Before fun setUp() { + originalLocale = Locale.getDefault() + Locale.setDefault(Locale.US) Dispatchers.setMain(testDispatcher) } @After fun tearDown() { + Locale.setDefault(originalLocale) Dispatchers.resetMain() } @@ -62,6 +67,26 @@ class MacroPadStateTest { assertEquals(defaultLayout, MacroPadState.activeLayout.value) } + @Test + fun `loadFrom with empty list in Traditional Chinese locale generates localized default name`() { + Locale.setDefault(Locale.TRADITIONAL_CHINESE) + MacroPadState.loadFrom(emptyList(), null) + + val defaultProfile = MacroPadState.profiles.value.first() + assertEquals("預設", defaultProfile.name) + assertEquals("預設", defaultProfile.layouts.first().name) + } + + @Test + fun `loadFrom with empty list in German locale generates localized default name`() { + Locale.setDefault(Locale.GERMANY) + MacroPadState.loadFrom(emptyList(), null) + + val defaultProfile = MacroPadState.profiles.value.first() + assertEquals("Standard", defaultProfile.name) + assertEquals("Standard", defaultProfile.layouts.first().name) + } + @Test fun `loadFrom with existing profiles preserves them`() { // Given existing profiles diff --git a/companion/ui/src/main/java/com/stormpanda/megingiard/keyboard/KeyboardBottomToolbar.kt b/companion/ui/src/main/java/com/stormpanda/megingiard/keyboard/KeyboardBottomToolbar.kt index b7c3d471..1db709d8 100644 --- a/companion/ui/src/main/java/com/stormpanda/megingiard/keyboard/KeyboardBottomToolbar.kt +++ b/companion/ui/src/main/java/com/stormpanda/megingiard/keyboard/KeyboardBottomToolbar.kt @@ -183,7 +183,7 @@ private fun KeyboardModeToggleButton( horizontalArrangement = Arrangement.Center, ) { Text( - text = "Ergo", + text = stringResource(R.string.keyboard_mode_ergo), color = ergoColor, fontSize = 12.sp, fontWeight = FontWeight.Medium, @@ -216,7 +216,7 @@ private fun KeyboardModeToggleButton( ) Spacer(modifier = Modifier.width(6.dp)) Text( - text = "Full", + text = stringResource(R.string.keyboard_mode_full), color = fullColor, fontSize = 12.sp, fontWeight = FontWeight.Medium, diff --git a/companion/ui/src/main/java/com/stormpanda/megingiard/macropad/MacroPadEditor.kt b/companion/ui/src/main/java/com/stormpanda/megingiard/macropad/MacroPadEditor.kt index b5821593..1cf2033f 100644 --- a/companion/ui/src/main/java/com/stormpanda/megingiard/macropad/MacroPadEditor.kt +++ b/companion/ui/src/main/java/com/stormpanda/megingiard/macropad/MacroPadEditor.kt @@ -727,7 +727,7 @@ private fun EditorTopBar( TopAppBar( title = { Text( - text = stringResource(R.string.macropad_editor_title_edit_profile), + text = stringResource(R.string.quick_menu_edit_layout), color = colors.onSurface, style = MaterialTheme.typography.titleMedium, ) diff --git a/companion/ui/src/main/java/com/stormpanda/megingiard/touchpad/FullscreenMouseOverlay.kt b/companion/ui/src/main/java/com/stormpanda/megingiard/touchpad/FullscreenMouseOverlay.kt index 1982772c..5a42d44a 100644 --- a/companion/ui/src/main/java/com/stormpanda/megingiard/touchpad/FullscreenMouseOverlay.kt +++ b/companion/ui/src/main/java/com/stormpanda/megingiard/touchpad/FullscreenMouseOverlay.kt @@ -734,7 +734,7 @@ private fun ModeToggleButton( horizontalArrangement = Arrangement.Center, ) { Text( - text = "Mouse", + text = stringResource(R.string.touchpad_mode_mouse), color = mouseColor, fontSize = 12.sp, fontWeight = FontWeight.Medium, @@ -767,7 +767,7 @@ private fun ModeToggleButton( ) Spacer(modifier = Modifier.width(6.dp)) Text( - text = "Touch", + text = stringResource(R.string.touchpad_mode_touch), color = touchColor, fontSize = 12.sp, fontWeight = FontWeight.Medium, diff --git a/companion/ui/src/main/res/values-de/strings.xml b/companion/ui/src/main/res/values-de/strings.xml index 0bde05b9..21382a12 100644 --- a/companion/ui/src/main/res/values-de/strings.xml +++ b/companion/ui/src/main/res/values-de/strings.xml @@ -1157,6 +1157,10 @@ Einstellungen öffnen, um ein Layout zu erstellen. Cover-Artwork ändern + Ergo + Voll + Maus + Touch Touchpad-Einstellungen Relative-Maus-Modus Absolut-Touch-Modus diff --git a/companion/ui/src/main/res/values-zh-rTW/strings.xml b/companion/ui/src/main/res/values-zh-rTW/strings.xml index ed07d5fc..4a13ef79 100644 --- a/companion/ui/src/main/res/values-zh-rTW/strings.xml +++ b/companion/ui/src/main/res/values-zh-rTW/strings.xml @@ -5,8 +5,8 @@ 搜尋應用程式與遊戲… 找不到應用程式 正在等待螢幕投影授權\u2026 - Megingiard 必須在底部螢幕運行。\n請移動應用程式以繼續。 - 指向底部螢幕的箭頭 + Megingiard 必須在副螢幕運行。\n請移動應用程式以繼續。 + 指向副螢幕的箭頭 開始投影 上一個工具 下一個工具 @@ -193,7 +193,7 @@ 選擇圖示 搜尋圖示… 找不到圖示 - 填滿 + 實心 當前選擇 備份與設定檔 應用程式更新 @@ -266,6 +266,15 @@ 觸控投影 全螢幕滑鼠 全螢幕鍵盤 + 啟動應用程式 + 應用程式: %s + 選擇應用程式 + 搜尋應用程式… + 找不到應用程式 + 選擇應用程式… + 開啟 %1$s + Megingiard 浮動球覆蓋層 + 輕觸以返回 Megingiard 活動設定檔 新設定檔… Pad 形狀 @@ -386,7 +395,7 @@ 自動填入(讀取螢幕) 正在掃描螢幕… 已自動填入配對資訊! - 無法在螢幕上偵測到完整的配對資訊。請確認上螢幕已開啟無線偵錯選單或「配對裝置」對話視窗。 + 無法在螢幕上偵測到完整的配對資訊。請確認主螢幕已開啟無線偵錯選單或「配對裝置」對話視窗。 請在系統設定中啟用無障礙服務,才能透過讀取螢幕文字自動填入。 Megingiard 現在將推送助手 daemon 執行檔到 /data/local/tmp 並啟動它。Daemon 以 ADB shell 使用者身份運行,直到您重啟設備為止。 推送並啟動 daemon @@ -434,8 +443,8 @@ 此名稱已存在。 重試偵測 設定與放置說明 - 1. 在次螢幕重新開啟 Megingiard,然後點擊「重試」。 - 2. 建議:如果您的啟動器支援,請將 Megingiard 固定在底部螢幕以保持其位置。 + 1. 在副螢幕重新開啟 Megingiard,然後點擊「重試」。 + 2. 建議:如果您的啟動器支援,請將 Megingiard 固定在副螢幕以保持其位置。 3. 焦點模式:由於 Megingiard 僅使用觸控控制,請在 AYN 設定中將焦點模式設為「主螢幕」。 開始 停止 @@ -549,7 +558,7 @@ 刪除步驟 從巨集中移除此步驟? 錄製手把輸入 - 觸碰螢幕上的控制器。輸入將被錄製並即時轉發到上方螢幕。 + 觸碰螢幕上的控制器。輸入將被錄製並即時轉發到主螢幕。 完成 取消 左搖桿 @@ -561,7 +570,7 @@ ST 開始 開始手把錄製 - 此螢幕上將開啟觸控手把覆蓋層。您的觸碰將被錄製為巨集步驟,並透過虛擬手把即時轉發到上方螢幕。 + 此螢幕上將開啟觸控手把覆蓋層。您的觸碰將被錄製為巨集步驟,並透過虛擬手把即時轉發到主螢幕。 不再顯示 手把錄製不可用 無法啟動虛擬手把。錄製未開始。 @@ -644,7 +653,7 @@ 上一個配置 下一個配置 編輯視窗 - 點擊此處控制上方螢幕 + 點擊此處控制主螢幕 拖曳移動 · 輕點點擊 鍵盤 手把 @@ -668,8 +677,8 @@ 選擇目標設定檔 選擇目標配置 重複按鈕 - 重複設定檔 - 重複配置 + 複製設定檔 + 複製配置 沒有其他可用的設定檔。 沒有其他可用的配置。 定義裁切區域 @@ -763,8 +772,8 @@ 開啟該巨集的時間軸編輯器,以便您查看或編輯其步驟。 選項選單 每列巨集都有一個選項選單 (三個點),可進行重新命名、重複、複製到設定檔或刪除巨集。刪除是永久性的。 - 拖曳把手 - 長按巨集列右側的拖曳把手並移動,以重新排序列表中的巨集。此處的順序僅供美觀參考,不影響執行。 + 拖曳控點 + 長按巨集列右側的拖曳控點並移動,以重新排列列表中的巨集順序。此處的順序僅供瀏覽參考,不影響執行。 巨集編輯器 — 說明 時間軸編輯器是用來建構巨集執行的確切輸入序列。步驟會依序從上到下執行。時序可以精確錄製或手動輸入。 頂端欄控制 @@ -805,9 +814,9 @@ 隨機化時序 每次執行時為每個步驟的時序新增一個微小的隨機偏移 (±範圍)。這使巨集感覺不那麼機械化,並有助於避免某些應用程式中的自動偵測模式。 螢幕投影設定 — 說明 - 這些設定控制投影的上方螢幕圖像在背景模式下的外觀 — 即當 Megingiard 在按鈕後方背景運行時。所有變更僅套用於當前活動的配置。 + 這些設定控制投影的主螢幕圖像在背景模式下的外觀 — 即當 Megingiard 在按鈕後方背景運行時。所有變更僅套用於當前活動的配置。 調暗 - 透過覆蓋一層黑色蒙版來降低投影圖像的亮度。0% 表示不調暗;90% 幾乎為全黑。使用眼睛圖示可在次螢幕上即時預覽效果而不儲存。 + 透過覆蓋一層黑色蒙版來降低投影圖像的亮度。0% 表示不調暗;90% 幾乎為全黑。使用眼睛圖示可在副螢幕上即時預覽效果而不儲存。 邊緣融合 使投影圖像的邊緣向內淡出,讓投影內容與背景平滑過渡而非生硬切斷。較高的值會產生更強的暈影效果。 將投影視窗中心對齊您在主螢幕上最後觸碰的位置。從下拉選單中選擇一個區塊以啟用,或選擇「關閉」以禁用。 @@ -817,14 +826,14 @@ 套用運動平滑於區塊平移 (關閉、輕微、中等或強烈)。較高的值會使視窗移動在平移過程中更加平滑,但可能會增加極少量的延遲。 將投影區塊區域上的觸控輸入轉換回主螢幕。啟用後,區塊內的觸碰會觸發主螢幕上相應的動作。 預覽 - 在次螢幕上啟用該滑桿值的即時預覽。與次螢幕的控制項互動以確認或取消該值。這讓您無需離開當前頁面即可看到效果。 + 在副螢幕上啟用該滑桿值的即時預覽。與副螢幕的控制項互動以確認或取消該值。這讓您無需離開當前頁面即可看到效果。 投影編輯器 — 說明 - 投影編輯器讓您在投影過程中,於次螢幕上新增、定位、調整大小與設定視窗區塊。點擊螢幕上的區塊即可選取,然後使用下方的工具列按鈕進行操作。 + 投影編輯器讓您在投影過程中,於副螢幕上新增、定位、調整大小與設定視窗區塊。點擊螢幕上的區塊即可選取,然後使用下方的工具列按鈕進行操作。 全域動作 - 在次螢幕的空閒位置建立新的視窗區塊。每個配置最多允許 10 個區塊。新區塊會自動被選取。 + 在副螢幕的空閒位置建立新的視窗區塊。每個配置最多允許 10 個區塊。新區塊會自動被選取。 開啟該配置的環境顯示設定(亮度、邊緣融合、平滑度)。變更僅套用於目前使用中的配置。 所選區塊 - 為所選區塊循環切換三種長寬比模式。「自由」— 無限制,可獨立調整大小。「頂部」— 鎖定長寬比以匹配主螢幕的裁切。「底部」— 鎖定長寬比以匹配次螢幕的區塊。 + 為所選區塊循環切換三種長寬比模式。「自由」— 無限制,可獨立調整大小。「主螢幕」— 鎖定長寬比以匹配主螢幕的裁切。「副螢幕」— 鎖定長寬比以匹配副螢幕的區塊。 形狀 在矩形與圓形之間切換所選區塊的形狀。適用於遊戲小地圖或圓形儀表,圓形裁切外觀更佳。 開啟所選區塊的裁切選擇器,讓您在主螢幕拖曳框架以選擇投影到此區塊的區域。 @@ -865,7 +874,7 @@ 開始或停止螢幕投影擷取。投影進行時,頂端卡片會展開以顯示更多控制項。 凍結 / 解除凍結 凍結投影影像,使其顯示靜態畫面而非即時畫面。適合在您需要仔細閱讀遊戲畫面時暫停。 - 在次螢幕開啟區塊配置編輯器,讓您在投影覆蓋層中調整大小、移動或新增透明區塊視窗。 + 在副螢幕開啟區塊配置編輯器,讓您在投影覆蓋層中調整大小、移動或新增透明區塊視窗。 擷取螢幕截圖 擷取主螢幕的截圖。若未在投影中,則需要特權模式已連接。 MacroPad 控制項 (底端卡片) @@ -873,18 +882,18 @@ 點擊標籤即可切換到目前設定檔中的不同按鈕配置。此處只會顯示在編輯器中標記為啟用的配置。 自動切換 切換動態設定檔自動比對開啟/關閉。開啟時,設定檔與副螢幕檢視將根據當前活動遊戲或模擬器自動切換。關閉時,設定檔自動比對將會暫停。 - 切換至 Hub / 遊戲設定檔 - 在 Companion Hub 儀表板與當前活動遊戲設定檔版面之間手動切換(會停用自動切換)。 + 切換至輔助中心/遊戲設定檔 + 在副螢幕輔助中心與當前活動遊戲設定檔配置之間手動切換(會停用自動切換)。 開啟「編輯設定檔/配置」畫面,您可以在此新增、移動與設定按鈕,管理設定檔與配置,以及建立或編輯巨集。 開啟全域設定視窗以進行 App 細部配置,例如主題、主題重點色、鏡像自動啟動與影音模式設定。 關閉 App 正常關閉 Megingiard,並停止螢幕投影與背景服務。 說明 (此螢幕) 開啟此說明工作表,其中包含快速選單中每個控制項的解釋。 - Companion Hub — 說明 - Companion Hub 畫面是您在副螢幕上的中央控制儀表板,用於管理特定遊戲的巨集控制、查看活動遊戲狀態,以及快速存取副螢幕工具。 + 副螢幕輔助中心 — 說明 + 副螢幕輔助中心是您在副螢幕上的中央控制儀表板,用於管理特定遊戲的巨集控制、查看活動遊戲狀態,以及快速存取副螢幕工具。 活動遊戲與控制設定檔 - 在下方螢幕全螢幕開啟當前活動遊戲的 MacroPad 觸控版面。 + 在副螢幕全螢幕開啟當前活動遊戲的 MacroPad 觸控配置。 開啟設定檔與版面編輯器,以自訂按鈕位置、樣式及巨集設定。 將自訂 MacroPad 控制設定檔連結至當前活動或選取的遊戲,或為其建立專屬設定檔。 副螢幕工具 @@ -992,6 +1001,10 @@ 發生非預期的錯誤。請重試。 確定 更換封面圖 + 簡易 + 完整 + 滑鼠 + 觸控 觸控板設定 手勢與點擊設定 絕對觸控模式 @@ -1092,14 +1105,14 @@ 新增設定檔 預設 顯示 - Megingiard Companion Hub - 請在上螢幕選擇遊戲,或在下方啟動副螢幕工具。 + Megingiard 副螢幕輔助中心 + 請在主螢幕選擇遊戲,或在此啟動副螢幕工具。 顯示 副螢幕工具 手把與巨集 滑鼠 / 觸控投影 虛擬鍵盤 - 上螢幕鏡射 + 主螢幕投影 全域設定 說明與教學 當前設定檔 @@ -1108,9 +1121,10 @@ 全域設定 應用程式偏好設定 螢幕鏡射 - 顯示儀表板 + 切換至輔助中心 切換至遊戲設定檔 自動切換 + 自動切換:關閉 有可用更新 自動檢查更新 在背景定期檢查 GitHub Releases 以取得應用程式更新 @@ -1126,6 +1140,6 @@ 備份並開啟連結 直接開啟連結 取消 - 啟用時,Megingiard 會每 24 小時靜默檢查一次新版本。若發現更新,您可以備份設定並在上方螢幕的預設瀏覽器中開啟發布頁面。 + 啟用時,Megingiard 會每 24 小時靜默檢查一次新版本。若發現更新,您可以備份設定並在主螢幕的預設瀏覽器中開啟發布頁面。 立即手動觸發對 GitHub Releases 儲存庫的更新檢查。 diff --git a/companion/ui/src/main/res/values/strings.xml b/companion/ui/src/main/res/values/strings.xml index 7536ab84..6723a92c 100644 --- a/companion/ui/src/main/res/values/strings.xml +++ b/companion/ui/src/main/res/values/strings.xml @@ -1150,6 +1150,10 @@ Open Settings to create a layout. Change Artwork + Ergo + Full + Mouse + Touch Touchpad Settings Relative Mouse Mode Absolute Touch Mode diff --git a/gamefocus/ui/src/main/res/values-zh-rTW/strings.xml b/gamefocus/ui/src/main/res/values-zh-rTW/strings.xml index 94e7c437..0473c79d 100644 --- a/gamefocus/ui/src/main/res/values-zh-rTW/strings.xml +++ b/gamefocus/ui/src/main/res/values-zh-rTW/strings.xml @@ -9,7 +9,7 @@ 取消 主螢幕 - 底部螢幕 + 副螢幕 Android 遊戲 Android 應用程式 所有應用程式