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 應用程式
所有應用程式