diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings
index 49be909..64ead76 100644
--- a/DynamicIsland/Localizable.xcstrings
+++ b/DynamicIsland/Localizable.xcstrings
@@ -159,8 +159,8 @@
},
"ko" : {
"stringUnit" : {
- "state" : "needs_review",
- "value" : " – %lld"
+ "state" : "translated",
+ "value" : "- %lld"
}
},
"pl" : {
@@ -205,6 +205,12 @@
"comment" : "A secondary line of text displayed in a lock screen weather view, below the main weather information. The first argument is the main weather information. The second argument is an optional secondary piece of information to display below the main",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -223,6 +229,12 @@
"state" : "translated",
"value" : "-%@"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "-%@"
+ }
}
}
},
@@ -236,6 +248,12 @@
"value" : "—"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "—"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -248,6 +266,12 @@
"comment" : "A colon used in the timer interface.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : ":"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -767,6 +791,12 @@
"value" : "%1$@ · %2$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$@ · %2$@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -789,6 +819,12 @@
"value" : "%@ modèles"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@모델"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -801,6 +837,12 @@
"comment" : "A control within the lock screen settings that allows the user to adjust the offset for a specific dimension (e.g. width or height). The argument is the name of the dimension, and the second argument is",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ 오프셋"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -813,6 +855,12 @@
"comment" : "A text view displaying the current offset value for a specific lock screen control. The argument is the name of the control.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ pt"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -825,6 +873,12 @@
"comment" : "A row of text with a label and its corresponding value. The argument is the label text, and the second is the value text.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -843,6 +897,12 @@
"value" : "%1$@. Focus active: %2$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$@. %2$@ 집중 모드 켜짐"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -855,6 +915,12 @@
"comment" : "A label inside the temperature gauge that shows the current temperature. The value is shown in degrees Celsius (or Fahrenheit, if specified in the snapshot).",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@°"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -995,6 +1061,12 @@
"value" : "%lld animations"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld애니메이션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1007,6 +1079,12 @@
"comment" : "A small, rounded badge displaying the number of characters in the note.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld글자"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1023,6 +1101,12 @@
"value" : "%lld couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1041,6 +1125,12 @@
"value" : "%1$lld day%2$@ ago"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$lld 일%2$@ 전"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -1059,6 +1149,12 @@
"value" : "%1$lld hour%2$@ ago"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$lld시간%2$@전"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -1082,6 +1178,12 @@
"value" : "%1$lld minute%2$@ ago"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$lld분%2$@전"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -1092,7 +1194,15 @@
},
"%lld pt" : {
"comment" : "A label displaying the current font size of the terminal. The value is shown in point size.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld pt"
+ }
+ }
+ }
},
"%lld px" : {
"comment" : "A label displaying the current expanded notch width value. The value is shown in pixels.",
@@ -1114,6 +1224,12 @@
"value" : "%1$lld tab%2$@ enabled · min %3$lld px"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "탭 %1lld 개 활성화됨⋅최소 %3$lld px"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -1225,23 +1341,63 @@
},
"%lldd ago" : {
"comment" : "A string describing how many days have passed since a given date. The argument is the number of days.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld일 전"
+ }
+ }
+ }
},
"%lldh" : {
"comment" : "Text that describes a time interval, such as \"1 hour ago\".",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld시간"
+ }
+ }
+ }
},
"%lldh ago" : {
"comment" : "A string describing how long ago a given date was, in terms of hours.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld시간 전"
+ }
+ }
+ }
},
"%lldm" : {
"comment" : "A string that describes how long ago a given date was, in a human-readable form.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld분"
+ }
+ }
+ }
},
"%lldm ago" : {
"comment" : "A string describing how long ago a given date was, in terms of minutes. The argument is the number of minutes.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld분 전"
+ }
+ }
+ }
},
"%lldx" : {
"localizations" : {
@@ -1377,6 +1533,12 @@
"comment" : "A bullet point in the \"Appearance\" section of the Custom OSD settings, describing a glass material option.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "• 프로스티드 글래스: 반투명 블러 효과"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1489,6 +1651,12 @@
"comment" : "A description of the \"Liquid Glass\" option in the Custom OSD settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "• 리퀴드 글래스: 현대적인 유리 효과 (macOS 26+)"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1601,6 +1769,12 @@
"comment" : "A bullet point in the \"Appearance\" section of the Custom OSD settings, describing the appearance of the OSD when using solid colors.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "• 다크/라이트/자동 단색: 불투명 배경"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1617,6 +1791,12 @@
"value" : "• Réflexion"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "• 생각중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1633,6 +1813,12 @@
"state" : "needs_review",
"value" : "• Mis à jour %@"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "• %@ 업데이트됨"
+ }
}
}
},
@@ -1647,6 +1833,12 @@
"value" : "+%lld en plus"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "+%lld 더보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1661,6 +1853,10 @@
}
}
},
+ "±10 Seconds" : {
+ "comment" : "Display name for the \"±10 Seconds\" music skip behavior option.",
+ "isCommentAutoGenerated" : true
+ },
"0" : {
"comment" : "A label displayed in a circular gauge to indicate the minimum battery level.",
"isCommentAutoGenerated" : true,
@@ -1677,9 +1873,26 @@
"shouldTranslate" : false
},
"1 hour" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "1시간"
+ }
+ }
+ }
},
"1 min" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "1분"
+ }
+ }
+ }
+ },
+ "1m" : {
},
"1x" : {
@@ -1691,6 +1904,12 @@
"value" : "1x"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "1x"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -1700,7 +1919,14 @@
}
},
"2 hours" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "2시간"
+ }
+ }
+ }
},
"3 items" : {
"localizations" : {
@@ -1710,6 +1936,12 @@
"value" : "3 éléments"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "3 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1732,6 +1964,12 @@
"value" : "5 couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "5개"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1748,6 +1986,12 @@
"value" : "5 éléments"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "5 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1757,6 +2001,16 @@
}
},
"5 mins" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "5분"
+ }
+ }
+ }
+ },
+ "5m" : {
},
"7 items" : {
@@ -1767,6 +2021,12 @@
"value" : "7 éléments"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "7 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1789,6 +2049,12 @@
"value" : "10 couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "10개"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1805,6 +2071,12 @@
"value" : "10 éléments"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "10 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1814,7 +2086,14 @@
}
},
"10 mins" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "10분"
+ }
+ }
+ }
},
"15 colors" : {
"localizations" : {
@@ -1824,6 +2103,12 @@
"value" : "15 couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "15개"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1839,6 +2124,16 @@
}
},
"15 mins" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "15분"
+ }
+ }
+ }
+ },
+ "15m" : {
},
"20" : {
@@ -1856,7 +2151,8 @@
"value" : "15 мин"
}
}
- }
+ },
+ "shouldTranslate" : false
},
"20 colors" : {
"localizations" : {
@@ -1866,6 +2162,12 @@
"value" : "20 couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "20개"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -1883,13 +2185,28 @@
"value" : "30"
}
}
- }
+ },
+ "shouldTranslate" : false
},
"30 mins" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "30분"
+ }
+ }
+ }
},
"45 mins" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "45분"
+ }
+ }
+ }
},
"100" : {
"comment" : "The text displayed below a 100% battery level in the lock screen.",
@@ -2013,6 +2330,10 @@
}
}
},
+ "Accent" : {
+ "comment" : "Display name for the caps lock indicator tint mode.",
+ "isCommentAutoGenerated" : true
+ },
"Accent color" : {
"localizations" : {
"ar" : {
@@ -2117,6 +2438,12 @@
"comment" : "A label describing the colour picker for the timer preset.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "강조 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2227,6 +2554,12 @@
},
"Accessibility" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "접근성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2243,6 +2576,12 @@
"value" : "Actions"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "동작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2260,6 +2599,12 @@
"value" : "Activer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2277,6 +2622,12 @@
"value" : "Activer votre license"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "라이선스 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2294,6 +2645,12 @@
"value" : "Activation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2316,6 +2673,12 @@
"value" : "Activité"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활동중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2332,6 +2695,12 @@
"value" : "Aktiv - kein Fokus"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 모드 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2350,6 +2719,12 @@
"value" : "Actif - Aucun enregistrement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화 활동 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2358,6 +2733,14 @@
}
}
},
+ "Active GPU" : {
+ "comment" : "Label for the active GPU field in the GPU usage dashboard.",
+ "isCommentAutoGenerated" : true
+ },
+ "Adaptive gradient" : {
+ "comment" : "Display name for the timer icon color mode: adaptive gradient.",
+ "isCommentAutoGenerated" : true
+ },
"Add" : {
"localizations" : {
"ar" : {
@@ -2468,6 +2851,12 @@
"value" : "Ajouter une animation depuis une URL"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "URL로 부터 애니메이션 추가"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2490,6 +2879,12 @@
"value" : "Ajouter des fichiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일 추가"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2508,6 +2903,12 @@
"value" : "Ajouter depuis une URL…"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "URL로 부터 추가…"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2517,7 +2918,14 @@
}
},
"Add icon" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아이콘 추가"
+ }
+ }
+ }
},
"Add manually" : {
"extractionState" : "stale",
@@ -2630,6 +3038,12 @@
"value" : "Ajouter"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "새로운 항목 추가"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2742,6 +3156,12 @@
"comment" : "A button label that adds a new timer preset.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프리셋 추가"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2851,10 +3271,23 @@
}
},
"Adds a Guake-style dropdown terminal tab. The terminal session persists across notch open/close cycles." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Guake 스타일의 드롭다운 터미널 탭을 추가합니다. 터미널 세션은 노치를 여닫아도 끊기지 않고 유지됩니다."
+ }
+ }
+ }
},
"Adds a notch HUD when Caps Lock is enabled, with optional label and tint controls." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Caps Lock이 활성화되면 노치 HUD를 추가합니다. 레이블 및 색조 제어 옵션을 제공합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2871,6 +3304,12 @@
},
"Adds the AirPlay/route picker button back to the customizable controls palette." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AirPlay/경로 선택기 버튼을 사용자 지정 제어기 팔레트에 다시 추가합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2883,6 +3322,12 @@
"comment" : "A footer in the \"Preview\" section of the Custom OSD settings, explaining how to use the live preview feature.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "위의 설정을 조정하여 변경 사항을 실시간으로 확인하세요. 실제 OSD는 화면 중앙 하단에 나타납니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2899,6 +3344,12 @@
"value" : "Assistant IA"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AI 어시스턴트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2915,6 +3366,12 @@
"value" : "L’IA rélfléchis"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AI가 생각하는 중..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2931,6 +3388,12 @@
"value" : "Sélection du modèle d’IA"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AI 모델 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2947,6 +3410,12 @@
"value" : "Fournisseur des modèles"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AI 공급자"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2969,6 +3438,12 @@
"value" : "Un assistant IA qui peut analyser des fichiers, des images, et fournir une aide conversationnelle. Utiliser Cmd+Maj+A pour y accéder facilement."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일과 이미지를 분석하고 대화형 도움말을 제공하는 AI 지원 어시스턴트입니다. Cmd+Shift+A를 눌러 어시스턴트에 빠르게 접근할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -2986,6 +3461,12 @@
"value" : "Air quality index %1$d, %2$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대기 질 지수 %1$d, %2$@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3002,6 +3483,12 @@
},
"Air quality requires the Open Meteo provider." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대기 질 정보를 표시하려면 Open Meteo 제공업체 설정이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3012,6 +3499,12 @@
},
"Air quality scale" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "공기질 척도"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3221,11 +3714,28 @@
}
}
},
+ "AirPlay" : {
+ "comment" : "A label for the AirPlay button.",
+ "isCommentAutoGenerated" : true
+ },
"Alignment" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "정렬"
+ }
+ }
+ }
},
"All" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3344,6 +3854,12 @@
"comment" : "A section header that allows the user to hide all-day events from the calendar view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "종일 이벤트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3454,31 +3970,84 @@
},
"Allow extension live activities" : {
"comment" : "Toggle to allow extension live activities.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확장 실시간 현황 허용"
+ }
+ }
+ }
},
"Allow extension lock screen widgets" : {
"comment" : "Text displayed in a toggle that allows users to enable or disable the display of lock screen widgets in Atoll.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 위젯 확장 허용"
+ }
+ }
+ }
},
"Allow extension notch experiences" : {
"comment" : "Text displayed in a toggle that allows users to enable or disable the display of notch-specific features in an extension.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 경험 확장 허용"
+ }
+ }
+ }
},
"Allow interactive web content" : {
"comment" : "Toggle label for allowing interactive web content in notch experiences.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대화형 웹 콘텐츠 허용"
+ }
+ }
+ }
},
"Allow minimalistic overrides" : {
"comment" : "Label for a toggle that allows minimalistic overrides in notch experiences.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미니멀 레이아웃 덮어쓰기 허용"
+ }
+ }
+ }
},
"Allow mouse reporting" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마우스 보고 활성화"
+ }
+ }
+ }
},
"Allowed Features" : {
"comment" : "A label describing the allowed features for an app extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "허용된 기능"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3707,6 +4276,12 @@
"value" : "Animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3725,6 +4300,12 @@
"value" : "Nom de l'animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션 이름"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3741,6 +4322,12 @@
"value" : "Configuration de l'API"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "API 구성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3757,6 +4344,12 @@
"value" : "Clé d’API nécessaire"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "API 키 필요"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3764,6 +4357,9 @@
}
}
}
+ },
+ "App" : {
+
},
"App icon" : {
"localizations" : {
@@ -3869,6 +4465,12 @@
"comment" : "A section header in the settings view that lists the permissions of installed apps.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "앱 권한"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3977,8 +4579,18 @@
}
}
},
+ "Apple Music" : {
+ "comment" : "Media controller type for Apple Music",
+ "isCommentAutoGenerated" : true
+ },
"Applies the notch-style parallax effect to the lock screen media widget album art." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 미디어 위젯의 앨범 아트에 노치 스타일의 패럴랙스 효과를 적용합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -3997,6 +4609,12 @@
"comment" : "A description below the placeholder text in the \"Search extensions...\" text field, explaining that apps using AtollExtensionKit will be listed here once they grant permission to use the app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AtollExtensionKit을 사용하는 앱이 권한을 요청하면 여기에 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4007,7 +4625,14 @@
},
"AQI" : {
"comment" : "Label for the US AQI scale in the lock screen weather view.",
- "isCommentAutoGenerated" : true
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AQI"
+ }
+ }
+ }
},
"Are you sure you want to delete \"%@\"?" : {
"comment" : "A confirmation prompt asking the user to confirm the deletion of a custom idle animation. The placeholder text inside the quotation marks should be replaced with the name of the animation.",
@@ -4018,6 +4643,12 @@
"value" : "Voulez-vous vraiment supprimer \"%@\" ?"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "\"%@\"을(를) 삭제하시겠습니까?"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4040,6 +4671,12 @@
"value" : "Voulez-vous vraiment supprimer cette couleur de votre historique ?"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 색상을 기록에서 삭제하시겠습니까?"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4056,6 +4693,12 @@
"value" : "Demandez-moi ce que vous voulez…"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "무엇이든 물어보세요..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4077,10 +4720,24 @@
},
"Atoll always listens to selected-provider brightness events, and listens to provider volume events only when external volume listener is enabled." : {
"comment" : "A footer text that explains the behavior of the third-party DDC integration settings.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll은 항상 선택된 제공업체의 밝기 이벤트를 감지하며, 외부 음량 감지 기능이 활성화된 경우에만 제공업체의 음량 이벤트를 감지합니다."
+ }
+ }
+ }
},
"Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll은 예정된 모든 일정을 한곳에 모아 보여줍니다. 일정을 표시하려면 캘린더 접근 권한이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4091,6 +4748,12 @@
},
"Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll에는 노치에서 바로 카메라를 통해 외모를 빠르게 확인할 수 있는 거울 기능이 포함되어 있습니다. 카메라 접근 권한은 이 실시간 미리보기를 표시하는 용도로만 사용됩니다. 거울 기능은 앱 설정에서 언제든지 켜거나 끌 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4101,11 +4764,25 @@
},
"Atoll keeps native volume key interception. External provider volume payloads are ignored while this is off." : {
"comment" : "A description of the behavior of Atoll's volume key interception when the external volume control listener is disabled.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll은 시스템 기본 음량 키 제어 기능을 유지합니다. 이 기능을 끄면 외부 제공업체의 음량 데이터가 무시됩니다."
+ }
+ }
+ }
},
"Atoll needs Full Disk Access to read the system notification database. If Atoll does not appear in the list, use 'Reveal App in Finder' and drag it into the settings window." : {
"extractionState" : "stale",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll이 시스템 알림 데이터베이스를 읽으려면 '전체 디스크 접근 권한'이 필요합니다. 목록에 Atoll이 표시되지 않으면 'Finder에서 앱 보기'를 사용하여 앱을 설정 창으로 드래그하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4116,7 +4793,15 @@
},
"Atoll's built-in volume key interception is disabled while external volume listening is on. Volume HUD/OSD will follow %@ payloads." : {
"comment" : "A description below the toggle that explains the effect of enabling or disabling the feature.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "외부 음량 감지 기능이 켜져 있으면 Atoll의 내장 음량 키 제어 기능이 비활성화됩니다. 음량 HUD/OSD는 %@ 데이터를 기준으로 표시됩니다."
+ }
+ }
+ }
},
"Attached Files" : {
"localizations" : {
@@ -4126,6 +4811,12 @@
"value" : "Fichiers joints"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "첨부된 파일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4138,6 +4829,12 @@
"comment" : "A section header that lists audio feedback settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "오디오 피드백"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4150,6 +4847,12 @@
"comment" : "A button that authorizes an app extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "인증"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4162,6 +4865,12 @@
"comment" : "A label indicating that an app has been granted permission to use AtollExtensionKit.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "인증됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4169,11 +4878,20 @@
}
}
}
+ },
+ "Auto-hide inactive notch media player" : {
+
},
"Auto-scroll to next event" : {
"comment" : "A toggle that enables or disables the automatic scrolling to the next event in the calendar view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다음 이벤트까지 자동 스크롤"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4381,6 +5099,12 @@
}
}
}
+ },
+ "Automatically switch displays" : {
+
+ },
+ "Average" : {
+
},
"Averages" : {
"comment" : "A label displayed above the average usage and last update information for a GPU.",
@@ -4392,6 +5116,12 @@
"value" : "Moyennes"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "평균"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4401,12 +5131,25 @@
}
},
"Background" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배경"
+ }
+ }
+ }
},
"Backlight" : {
"comment" : "A control for adjusting the keyboard backlight intensity.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "백라이트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4421,6 +5164,10 @@
}
}
},
+ "Bar" : {
+ "comment" : "Name of the timer progress style that shows a horizontal bar.",
+ "isCommentAutoGenerated" : true
+ },
"Battery" : {
"localizations" : {
"ar" : {
@@ -4524,6 +5271,12 @@
"Battery at %d percent" : {
"comment" : "Battery percentage",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 %d 퍼센트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4535,6 +5288,12 @@
"Battery charging" : {
"comment" : "Battery charging without estimate",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 충전중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4546,6 +5305,12 @@
"Battery charging, %@ remaining" : {
"comment" : "Charging time remaining",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 충전중, %@ 남음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4557,6 +5322,12 @@
"Battery fully charged" : {
"comment" : "Battery is full",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 충전 완료"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4569,6 +5340,12 @@
"comment" : "A section header in the Settings app that lists options for customizing the appearance of the battery indicator.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 표시기 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4779,6 +5556,12 @@
},
"Battery settings and informations are only available on MacBooks" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 설정 및 정보는 MacBook에서만 사용할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4889,6 +5672,12 @@
},
"Battery Widget" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4899,6 +5688,12 @@
},
"Behavior & Style" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "동작 및 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4921,6 +5716,12 @@
"value" : "La boîte bleue en pointillés affiche la taille actuelle dans la Atoll"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파란색 점선 상자는 Atoll에서의 실제 크기를 나타냅니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4939,6 +5740,12 @@
"comment" : "A tooltip explaining that the blue outline in the animation preview matches the notch on a device.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파란색 윤곽선이 노치 캔버스 영역에 맞춰 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4957,6 +5764,12 @@
"value" : "Appareils audios Bluetooth"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "블루투스 오디오 기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4974,6 +5787,12 @@
"value" : "Bluetooth device %1$@ at %2$d percent"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bluetooth 기기 %1$@: %2$d 퍼센트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -4989,7 +5808,14 @@
}
},
"Bold text as bright colors" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "볼드체를 밝은 색으로 표시"
+ }
+ }
+ }
},
"Boost your productivity with Clipboard Manager" : {
"localizations" : {
@@ -5106,6 +5932,12 @@
"value" : "Les deux"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모두"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5122,7 +5954,15 @@
},
"Break" : {
"comment" : "Name of a default timer preset that lasts for 5 minutes.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "휴식"
+ }
+ }
+ }
},
"Breakdown" : {
"comment" : "A label displayed above the breakdown of memory usage.",
@@ -5140,6 +5980,12 @@
"value" : "Répartition"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상세 내역"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -5158,6 +6004,12 @@
"comment" : "A control that adjusts the brightness of the device.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "밝기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5180,6 +6032,12 @@
"value" : "Luminosité de l’ATH"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "밝기 HUD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5192,6 +6050,12 @@
"comment" : "A label for a toggle that controls whether the brightness OSD is enabled",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "밝기 OSD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5210,6 +6074,12 @@
"value" : "Intégré"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "내장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -5226,6 +6096,12 @@
"state" : "translated",
"value" : "Système Intégré de Suivi"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "내장 시스템 모니터링"
+ }
}
}
},
@@ -5243,6 +6119,12 @@
"state" : "translated",
"value" : "Le système intégré de suivi détecte les changements de volume, luminosité et éclairage du clavier sans l’aide d’applications externes."
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "내장 시스템 모니터링은 외부 앱 없이도 음량, 밝기 및 키보드 백라이트 변경 사항을 직접 감지합니다."
+ }
}
}
},
@@ -5259,8 +6141,17 @@
"state" : "translated",
"value" : "Achetez-nous un café"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개발자 후원하기"
+ }
}
}
+ },
+ "Cached" : {
+
},
"Calendar" : {
"localizations" : {
@@ -5473,6 +6364,12 @@
"value" : "Der Zugriff auf Kalender oder Erinnerungen ist verweigert. Bitte aktivieren Sie ihn in den Systemeinstellungen."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 또는 미리 알림 접근 권한이 거부되었습니다. 시스템 설정에서 접근 권한을 활성화 해주세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5482,7 +6379,14 @@
}
},
"Calendar Widget" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 위젯"
+ }
+ }
+ }
},
"Calendars" : {
"localizations" : {
@@ -5498,6 +6402,12 @@
"value" : "Calendriers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5528,6 +6438,12 @@
"value" : "Caméra"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카메라"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5550,6 +6466,12 @@
"value" : "Caméra Active"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카메라 활동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5572,6 +6494,12 @@
"value" : "Status de la Caméra"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카메라 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5685,6 +6613,12 @@
},
"Caps Lock color" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Caps Lock 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5701,6 +6635,12 @@
},
"Caps Lock Indicator" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Caps Lock 표시기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5724,6 +6664,12 @@
"value" : "Centrer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "중앙"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5740,6 +6686,12 @@
"value" : "Changer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "변경"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -5851,7 +6803,15 @@
},
"Charging battery" : {
"comment" : "Text displayed in the status text field when the device is charging.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 충전중"
+ }
+ }
+ }
},
"Charging on Hold: Desktop Mode" : {
"localizations" : {
@@ -6057,6 +7017,12 @@
"comment" : "A label for the color of the chip in the lock screen reminder widget.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "칩 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -6074,6 +7040,12 @@
"value" : "Choisissez un son personnalisé lorsque le minuteur . Formats supportés : MP3, M4A, WAV, AIFF."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머가 종료될 때 재생할 사용자 지정 사운드 파일을 선택하세요. 지원 형식: MP3, M4A, WAV, AIFF."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6190,6 +7162,12 @@
"value" : "Choisir le modèle d’IA"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AI 모델 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6214,6 +7192,12 @@
"value" : "Choisir une animation à afficher lorsque la Atoll est inactive. Touchez pour sélectionner, maintenez pour supprimer."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll이 유휴 상태일 때 표시할 애니메이션을 선택하세요. 탭하여 선택하고, 길게 눌러 사용자 지정 애니메이션을 삭제할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6224,6 +7208,12 @@
},
"Choose directly on which side of the screen the vertical bar appears." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "수직 막대가 나타날 화면 방향을 직접 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6240,6 +7230,12 @@
"value" : "Choisir un fichier"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6250,6 +7246,12 @@
},
"Choose the global material mode for lock screen widgets. Custom Liquid unlocks per-widget variant sliders while Standard sticks to the classic frosted/liquid options." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 위젯의 전체적인 Material 모드를 선택하세요. '사용자 지정 리퀴드'를 선택하면 위젯별 스타일 슬라이더를 사용할 수 있으며, '표준'을 선택하면 기존의 프로스티드/리퀴드 옵션이 유지됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6262,6 +7264,12 @@
"comment" : "A footer description under the Quick Share section of the Shelf settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "서랍에서 파일을 공유할 때 사용할 서비스를 선택하세요. 파일을 셸프로 드래그하거나 셸프 버튼을 클릭하여 파일을 선택할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6274,6 +7282,12 @@
"comment" : "A footer description for the \"Controls\" section of the Custom OSD settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 OSD 창을 표시할 시스템 제어기를 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6286,6 +7300,12 @@
"comment" : "A footer for the \"Controls\" section in the HUD settings, explaining that users can choose which system controls should display HUD notifications.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "HUD 알림을 표시할 시스템 제어기를 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6302,6 +7322,12 @@
"value" : "Choisissez votre modèle d’IA préféré et sa configuration"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선호하는 AI 모델 및 구성을 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6320,6 +7346,12 @@
"value" : "Choisissez votre profil"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프로필 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6430,16 +7462,38 @@
},
"Circular" : {
"comment" : "Label for the \"Circular\" tab in the HUD and OSD settings view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "원형"
+ }
+ }
+ }
},
"Classic" : {
"comment" : "Name of the timer surface mode in the lock screen that looks like a traditional stopwatch.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클래식"
+ }
+ }
+ }
},
"Classic mode keeps the original translucent black background." : {
"comment" : "A description of the \"Classic mode\" option in the Lock Screen Integration settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클래식 모드에서는 기존의 반투명 검은색 배경이 유지됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6456,7 +7510,15 @@
},
"Classic notch shape that blends into the top screen edge" : {
"comment" : "Description of a notch shape that blends into the top screen edge.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 상단 가장자리와 자연스럽게 어우러지는 클래식 노치 디자인"
+ }
+ }
+ }
},
"Clear" : {
"extractionState" : "stale",
@@ -6467,6 +7529,12 @@
"value" : "Effacer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6489,6 +7557,12 @@
"value" : "Effacer tous les fichiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모든 파일 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6511,6 +7585,12 @@
"value" : "Effacer tous les fichiers supprime tous les fichiers et enregistrements joints. Cette action est définitive."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'모든 파일 지우기'를 선택하면 첨부된 모든 파일과 오디오 녹음이 삭제됩니다. 이 작업은 영구적입니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6527,6 +7607,12 @@
"value" : "Effacer l’Historique du Presse-papiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6549,6 +7635,12 @@
"value" : "Effacer l’historique du presse-papier supprime les copies récentes. Effacer les éléments épinglés supprime vos favoris. Les deux actions sont permanentes."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'클립보드 기록 지우기'를 선택하면 최근 복사한 항목이 삭제됩니다. '고정된 항목 지우기'를 선택하면 즐겨찾기가 삭제됩니다. 두 작업 모두 영구적입니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6561,6 +7653,12 @@
"comment" : "An alert title that asks the user to confirm clearing their clipboard history.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록을 지우시겠습니까?"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6577,6 +7675,12 @@
"value" : "Effacer l’Historique de Couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 기록 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6599,6 +7703,12 @@
"value" : "Effacer l’historique de couleurs supprime toutes les couleurs prélevées."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'색상 기록 지우기'를 선택하면 추출한 모든 색상이 삭제됩니다. '색상 선택 시작'을 선택하면 화면 색상 캡처 모드가 시작됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6609,7 +7719,15 @@
},
"Clear conversation and attachments" : {
"comment" : "A help text for the \"Reset Context\" button in the chat messages view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대화 및 첨부 항목 지우기"
+ }
+ }
+ }
},
"Clear Data" : {
"localizations" : {
@@ -6619,6 +7737,12 @@
"value" : "Effacer les données"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "데이터 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6631,6 +7755,12 @@
"comment" : "The text on a button that clears the clipboard history.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기록 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6647,6 +7777,12 @@
"value" : "Effacer les Éléments épinglés"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "고정된 항목 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6659,6 +7795,12 @@
"comment" : "An accessibility label for the button that clears the search field in the sidebar.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "검색 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6671,6 +7813,12 @@
"comment" : "A label for a button that clears a music control slot.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "슬롯 지우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6687,6 +7835,12 @@
"value" : "Cliquez sur \"Pick Color\" ou pressez simultanément Cmd+Maj+P pour prélever des couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'색상 선택기'를 클릭하거나 Cmd+Shift+P를 눌러 색상 선택을 시작하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6705,6 +7859,12 @@
"value" : "Cliquez pour en savoir plus"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "눌려서 자세히 보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6721,6 +7881,12 @@
"value" : "Presse-papiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6737,6 +7903,12 @@
"value" : "La fonctionnalité de presse-papiers est désactivée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기능 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6753,6 +7925,12 @@
"value" : "Historique du presse-papiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6769,6 +7947,12 @@
"value" : "Historique du presse-papiers:"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6785,6 +7969,12 @@
"value" : "Gestionnaire de presse-papiers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 매니저"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6901,6 +8091,12 @@
"value" : "Fermer l’assistant"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "어시스턴트 닫기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6908,15 +8104,32 @@
}
}
}
+ },
+ "Close gesture" : {
+
},
"Code and debug with color picker, stats monitoring, and screen assistant." : {
"comment" : "Description of a user profile when the name is \"Developer\".",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기, 상태 모니터링 및 화면 어시스턴트로 코딩하고 디버깅하세요."
+ }
+ }
+ }
},
"Collect the latest crash report to share with the developer when reporting lock screen or overlay issues." : {
"comment" : "A footer for the \"Diagnostics\" section of the lock screen settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 또는 오버레이 문제를 보고할 때 개발자에게 공유할 최신 충돌 보고서를 수집합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6939,6 +8152,12 @@
"value" : "Détails des couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 세부 정보"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6955,6 +8174,12 @@
"value" : "Formats de couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 포맷"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6971,6 +8196,12 @@
"value" : "Historique des couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 기록"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6983,6 +8214,12 @@
"comment" : "A description under the \"Appearance\" section of the Custom OSD settings, explaining that the color options control the icon and progress bar appearance, and that \"Auto\" automatically adapts to the system theme.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 옵션으로 아이콘 및 진행 표시줄의 외관을 제어합니다. '자동' 설정 시 시스템 테마에 맞게 조정됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -6999,6 +8236,12 @@
"value" : "Couleur prélevée!"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7015,6 +8258,12 @@
"value" : "Pipette de couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7031,6 +8280,12 @@
"value" : "La fonctionnalité de pipette est désactivée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기 기능 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7047,6 +8302,12 @@
"value" : "Panneau de la pipette de couleurs"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기 패널:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7054,11 +8315,20 @@
}
}
}
+ },
+ "Color-coded battery display" : {
+
},
"Color-coded fills and smooth gradients are unavailable in Segmented mode. Switch to Hierarchical or Gradient to adjust these options." : {
"comment" : "An explanatory text that appears when the user tries to enable color-coded color gradients in Segmented progress bars. It instructs the user to switch to Hierarchical or Gradient progress bars to enable these features.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'세그먼트' 모드에서는 색상별 채우기 및 부드러운 그라데이션을 사용할 수 없습니다. 이 옵션을 조정하려면 '계층형' 또는 '그라데이션'으로 전환하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7071,6 +8341,12 @@
"comment" : "A message explaining that color-coded battery indicators are unavailable in segmented progress bar style. It also includes a suggestion to switch to a more advanced progress bar style to adjust advanced options.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'세그먼트' 모드에서는 색상별 채우기를 사용할 수 없습니다. 고급 옵션을 조정하려면 '제어기 › Dynamic Island'에서 '계층형' 또는 '그라데이션'으로 전환하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7078,6 +8354,12 @@
}
}
}
+ },
+ "Color-coded Volume" : {
+
+ },
+ "Color-coded volume display" : {
+
},
"ColorPicker Disabled" : {
"localizations" : {
@@ -7087,6 +8369,12 @@
"value" : "La pipette de couleur est désactivée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7096,7 +8384,14 @@
}
},
"Colors" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상"
+ }
+ }
+ }
},
"Coming soon" : {
"localizations" : {
@@ -7197,6 +8492,12 @@
}
}
}
+ },
+ "Compressed" : {
+
+ },
+ "Compute" : {
+
},
"Configuration" : {
"localizations" : {
@@ -7206,6 +8507,12 @@
"value" : "Configuration"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "구성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7218,6 +8525,12 @@
"comment" : "A footer for the \"Enable reminder live activity\" toggle in the Live Activities settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 탭에서 카운트다운 스타일과 잠금 화면 위젯을 설정하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7228,6 +8541,12 @@
},
"Configure how the timer looks inside the closed notch. Progress can render as a ring around the icon or as horizontal bars." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치가 닫혔을 때의 타이머 모양을 설정하세요. 진행 상황은 아이콘 주변의 고리 또는 가로 막대 형태로 표시될 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7238,6 +8557,12 @@
},
"Configure lock screen materials from the Appearance tab. Custom Liquid unlocks variant sliders for both widgets whenever Liquid Glass is selected." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 표시 탭에서 잠금 화면 Material을 설정하세요. '리퀴드 글래스'를 선택하면 두 위젯 모두에서 '사용자 지정 리퀴드' 스타일 슬라이더를 사용할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7250,6 +8575,12 @@
"comment" : "A message displayed when there are no presets configured. It encourages the user to configure presets in the app settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정에서 프리셋 구성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7262,6 +8593,12 @@
"comment" : "A message displayed when there are no timer presets configured. It instructs the user to configure presets in the app settings to see them here.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "여기에 표시하려면 설정에서 프리셋을 구성하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7278,14 +8615,34 @@
"state" : "translated",
"value" : "Connecté"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "연결됨"
+ }
}
}
},
"Connects directly to the Apple Music app." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Apple Music 앱과 직접 연결됩니다."
+ }
+ }
+ }
},
"Connects directly to the Spotify app." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Spotify 앱과 직접 연결됩니다."
+ }
+ }
+ }
},
"Continue" : {
"localizations" : {
@@ -7391,6 +8748,12 @@
"comment" : "A section header in the music slot configuration view, describing the available controls.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "조작 팔레트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7401,6 +8764,12 @@
},
"Control timer availability, live activity behaviour, and whether the app mirrors timers started from the macOS Clock app." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 활성화 여부, 실시간 현황 동작, 그리고 macOS '시계' 앱에서 시작된 타이머의 연동 여부를 제어합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7417,6 +8786,12 @@
"value" : "Contrôles"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제어 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7427,6 +8802,12 @@
},
"Controls how often system metrics refresh while monitoring is active." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링이 활성화된 동안 시스템 측정값이 새로고침되는 빈도를 조절합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7436,10 +8817,23 @@
}
},
"Controls the lock screen reminder chip and its positioning." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 리마인더 칩과 그 위치를 제어합니다."
+ }
+ }
+ }
},
"Controls the optional timer widget that floats above the media panel, including its classic, frosted, or liquid glass surface independent of the global material setting." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 패널 위에 떠 있는 선택적 타이머 위젯을 제어합니다. 여기에는 전체 Material 설정과는 별개로 적용되는 클래식, 프로스티드 또는 리퀴드 글래스 스타일이 포함됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7456,6 +8850,12 @@
},
"Controls whether Dynamic Island mirrors lock/unlock events with its own live activity and audible chimes." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island가 자체 실시간 현황 및 효과음과 함께 잠금/잠금 해제 이벤트를 연동할지 여부를 제어합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7468,6 +8868,12 @@
"comment" : "A tooltip for a button that copies the link of a reminder event to the clipboard.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이벤트 링크 복사"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7480,6 +8886,12 @@
"comment" : "A toggle that allows users to copy items to the clipboard when dragging them.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "드래그 시 항목 복사"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7496,6 +8908,12 @@
"value" : "Copier le dernier rapport de crash"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "최근 충돌 보고 복사"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7512,6 +8930,12 @@
"value" : "Copiez quelque-chose pour commencer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시작하려면 항목을 복사하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7528,6 +8952,12 @@
"value" : "Copier quelque-chose pour commencer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "항목을 복사하여 시작하기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7540,6 +8970,12 @@
"comment" : "A description below the \"No copies yet\" text, instructing the user to copy text to see it in the clipboard.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "텍스트를 복사하면 여기에 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7560,11 +8996,26 @@
}
},
"shouldTranslate" : false
+ },
+ "Core Clock" : {
+
+ },
+ "Cores" : {
+
+ },
+ "Corner radius scaling" : {
+
},
"Countdown style" : {
"comment" : "A label for the style of countdown to use when reminders are live.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카운트다운 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7575,7 +9026,18 @@
},
"CPU" : {
"comment" : "Title for the CPU usage graph.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "CPU"
+ }
+ }
+ }
+ },
+ "CPU Overview" : {
+
},
"CPU Usage" : {
"localizations" : {
@@ -7585,6 +9047,12 @@
"value" : "Utilisation CPU"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "CPU 사용량"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7601,10 +9069,24 @@
},
"Create and design with color picker, mirror, and visual effects." : {
"comment" : "Description of a user profile when the name is \"Designer\".",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기, 거울 및 시각 효과를 사용하여 제작하고 디자인해 보세요."
+ }
+ }
+ }
},
"Create from Clipboard" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드로 부터 생성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7618,6 +9100,9 @@
}
}
}
+ },
+ "Critical" : {
+
},
"Current custom timer:" : {
"extractionState" : "stale",
@@ -7627,6 +9112,12 @@
"state" : "translated",
"value" : "Minuteur personnalisé actuel :"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 사용자 지정 타이머:"
+ }
}
}
},
@@ -7634,6 +9125,12 @@
"comment" : "A label displayed alongside the currently set default timer duration.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 기본값:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7650,6 +9147,12 @@
"value" : "Historique actuel :"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 기록"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7666,6 +9169,12 @@
"value" : "Éléments actuels"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7678,6 +9187,12 @@
"comment" : "A label displayed above the current transform values in the preview stats view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 변형"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7696,6 +9211,12 @@
"value" : "Activée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 활동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7708,6 +9229,12 @@
"comment" : "A label showing the currently selected quick share service. The argument is the ID of the currently selected quick share service.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 선택된 항목: %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7721,10 +9248,24 @@
"isCommentAutoGenerated" : true
},
"Cursor" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커서"
+ }
+ }
+ }
},
"Cursor style" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커서 스타일"
+ }
+ }
+ }
},
"Custom" : {
"extractionState" : "stale",
@@ -7735,6 +9276,12 @@
"value" : "Personnalisé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -7758,6 +9305,12 @@
"value" : "Couleur personnalisée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 색상"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -7867,12 +9420,25 @@
}
},
"Custom Liquid" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커스텀 리퀴드"
+ }
+ }
+ }
},
"Custom liquid glass already renders with Apple's liquid material, so this option is managed automatically." : {
"comment" : "A description of the custom liquid blur option in the media settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 리퀴드 글래스는 이미 Apple의 리퀴드 마테리얼로 렌더링되므로, 이 옵션은 자동으로 관리됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7888,10 +9454,23 @@
}
},
"Custom Liquid is available on macOS 26 or later." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커스텀 리퀴드는 macOS 26 이상 버전이 필요합니다."
+ }
+ }
+ }
},
"Custom Liquid settings require the Liquid Glass material." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 리퀴드 설정을 사용하려면 '리퀴드 글래스' 머티리얼이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -7907,7 +9486,14 @@
}
},
"Custom liquid variant" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커스텀 리퀴드 유형"
+ }
+ }
+ }
},
"Custom music live activity animation" : {
"localizations" : {
@@ -8113,6 +9699,12 @@
"comment" : "The title of the settings screen for customizing the OSD.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 OSD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8125,6 +9717,12 @@
"comment" : "A description of the Custom OSD feature, visible only on macOS 15 or later.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 OSD 기능은 macOS 15 또는 최신 버전을 필요로 합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8141,6 +9739,12 @@
"value" : "Minuteur personnalisé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 타이머"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8157,6 +9761,12 @@
"state" : "translated",
"value" : "Durée du minuteur personnalisée"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 타이머 지속시간"
+ }
}
}
},
@@ -8268,6 +9878,12 @@
"value" : "Personnalisé: %@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정: %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8284,6 +9900,12 @@
"value" : "Personnaliser l’animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 애니메이션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8296,6 +9918,12 @@
"comment" : "A footer text that describes the purpose of the \"Customize how you organize and create notes\" section in the settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메모를 정리하고 작성하는 방법을 사용자 지정하세요. 색상 필터링과 검색 기능을 활성화하면 방대한 목록을 관리하는 데 도움이 됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8362,8 +9990,8 @@
},
"ko" : {
"stringUnit" : {
- "state" : "needs_review",
- "value" : "설정에서 커스텀하기"
+ "state" : "translated",
+ "value" : "설정에서 사용자 지정"
}
},
"pl" : {
@@ -8408,6 +10036,12 @@
"comment" : "A description under the live preview section of the animation editor.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "점선 외곽선은 실제 노치 영역과 일치합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8418,7 +10052,15 @@
},
"Deep Work" : {
"comment" : "Name of a default timer preset for deep work.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "딥 워크"
+ }
+ }
+ }
},
"Default" : {
"localizations" : {
@@ -8524,6 +10166,12 @@
"comment" : "A label displayed above the section that lets users configure a custom timer.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본 사용자 지정 타이머"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8546,6 +10194,12 @@
"value" : "Par défaut : dynamique.m4a"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본: dynamic.m4a"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8562,6 +10216,12 @@
"value" : "Supprimer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "삭제"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8572,6 +10232,12 @@
},
"Delete All Notes?" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모든 메모를 삭제하시겠습니까?"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8590,6 +10256,12 @@
"value" : "Supprimer l’Animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션 삭제"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8606,6 +10278,12 @@
"value" : "Supprimer la Couleur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 삭제"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8618,6 +10296,12 @@
"comment" : "A label describing an extension with denied or revoked permissions.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "거부됨/취소됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8630,6 +10314,12 @@
"comment" : "A button that denies an app extension's access.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "거부"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8740,11 +10430,26 @@
}
},
"Deselect All" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모두 선택해제"
+ }
+ }
+ }
},
"Designer" : {
"comment" : "Name of a user profile for a designer.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디자이너"
+ }
+ }
+ }
},
"Detection Status" : {
"comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.",
@@ -8756,6 +10461,12 @@
"value" : "Statut de la détéction"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "감지 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8772,12 +10483,26 @@
},
"Developer" : {
"comment" : "Name of a user profile.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개발자"
+ }
+ }
+ }
},
"Devices" : {
"comment" : "The title of the \"Devices\" section in the settings menu.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8796,6 +10521,12 @@
"comment" : "A section header in the Lock Screen Settings view, describing diagnostics-related functionality.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진단"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8804,8 +10535,18 @@
}
}
},
+ "Digital" : {
+ "comment" : "The display name for the \"Digital\" reminder presentation style.",
+ "isCommentAutoGenerated" : true
+ },
"Dimensions" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "치수"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -8922,7 +10663,14 @@
}
},
"Disable Minimalistic UI to configure the standard notch media controls." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "표준 노치 미디어 제어기를 설정하려면 '미니멀리즘 UI'를 비활성화하세요."
+ }
+ }
+ }
},
"Disabled" : {
"localizations" : {
@@ -9025,12 +10773,25 @@
}
},
"Disabled while external display integration is active — brightness keys are handled by the external app." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "외부 디스플레이 연동이 활성화된 동안에는 비활성화됩니다. 밝기 키는 외부 앱에서 제어합니다."
+ }
+ }
+ }
},
"Discrete transitions snap between Green (0–60%), Yellow (60–85%), and Red (85–100%)." : {
"comment" : "A description of how the color-coded progress bars work when not using smooth transitions.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "단계적 전환은 초록색(0~60%), 노란색(60~85%), 빨간색(85~100%) 구간에 맞춰 색상이 즉시 전환됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9047,7 +10808,21 @@
},
"Disk" : {
"comment" : "Title for the \"Disk\" section in the stats view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스크"
+ }
+ }
+ }
+ },
+ "Disk I/O" : {
+
+ },
+ "Disk Overview" : {
+
},
"Disk Read" : {
"localizations" : {
@@ -9057,6 +10832,12 @@
"value" : "Lecture du disque"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스크 읽기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9079,6 +10860,12 @@
"value" : "Écriture du disque"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스크 쓰기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9095,6 +10882,12 @@
"value" : "Mode d’affichage"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스플레이 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9111,11 +10904,24 @@
"state" : "translated",
"value" : "Options d’affichage"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스플레이 옵션"
+ }
}
}
},
"Display Style" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "디스플레이 스타일"
+ }
+ }
+ }
},
"Displays a HUD notification when Bluetooth audio devices (headphones, AirPods, speakers) connect, showing device name and battery level." : {
"comment" : "A footer for the \"Bluetooth Audio Devices\" section in the HUD settings.",
@@ -9127,6 +10933,12 @@
"value" : "Affiche une notification sur l’ATH lorsque des appareils audio Bluetooth (Écouteurs, AirPods, enceintes) se connectent, et affiche le nom et la charge de la batterie de celui-ci."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bluetooth 오디오 기기(헤드폰, AirPods, 스피커)가 연결되면 기기 이름과 배터리 잔량을 보여주는 HUD 알림을 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9143,6 +10955,12 @@
},
"Displays play/pause and skip buttons beside the notch while music is active. Disabled by default." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "음악이 재생 중일 때 노치 옆에 재생/일시 정지 및 건너뛰기 버튼을 표시합니다. 이 기능은 기본적으로 비활성화되어 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9153,6 +10971,12 @@
},
"Displays the current Focus state above the weather capsule whenever Focus detection is enabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 모드 감지가 활성화된 경우 날씨 캡슐 위에 현재 집중 모드 상태를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -9162,10 +10986,23 @@
}
},
"Displays your next upcoming calendar event above or below the weather capsule. Calendar selection here is independent from the Dynamic Island calendar filter." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨 캡슐의 위 또는 아래에 예정된 다음 일정을 표시합니다. 여기서 선택한 캘린더는 Dynamic Island의 캘린더 필터와 별개로 적용됩니다."
+ }
+ }
+ }
},
"Do Not Disturb" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "방해금지 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9182,12 +11019,26 @@
},
"Donate" : {
"comment" : "A button label that says \"Donate\".",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "후원"
+ }
+ }
+ }
},
"Done" : {
"comment" : "A button label that indicates that the user has finished editing a note.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "완료"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9201,6 +11052,9 @@
}
}
}
+ },
+ "Down" : {
+
},
"Download" : {
"localizations" : {
@@ -9307,6 +11161,12 @@
"comment" : "A section header in the Downloads settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 감지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9330,6 +11190,12 @@
"value" : "Télécharger le style d’icône"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 아이콘 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9358,6 +11224,12 @@
"value" : "Télécharger le style de l’indicateur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 표시기 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9380,8 +11252,17 @@
"state" : "translated",
"value" : "Télécharger les indicateurs"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 표시기"
+ }
}
}
+ },
+ "Downloaded" : {
+
},
"Downloads" : {
"localizations" : {
@@ -9488,6 +11369,12 @@
"comment" : "A description below the control palette that explains how users can interact with it.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제어기를 슬롯으로 드래그하거나, 탭하여 첫 번째 빈 슬롯에 배치하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9500,6 +11387,12 @@
"comment" : "A description of how to interact with the music slot configuration view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "슬롯 간에 항목을 드래그하거나 팔레트에서 드롭하여 제어기를 재배치하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9512,6 +11405,12 @@
"comment" : "A footer text describing the functionality of the lock screen positioning controls.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리보기를 드래그하여 세로 위치를 조정하세요. 양수 값은 패널을 올리고, 음수 값은 내립니다. 아래의 너비 슬라이더를 사용하여 미디어 및 타이머 위젯의 너비를 기본 크기 내에서 좁게 조절할 수 있습니다. 위젯이 표시되는 동안 변경 사항이 즉시 적용됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9521,7 +11420,14 @@
}
},
"Drop a PNG, JPEG, TIFF, or ICNS file to add it to your icon library." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "PNG, JPEG, TIFF 또는 ICNS 파일을 드롭하여 아이콘 라이브러리에 추가하세요."
+ }
+ }
+ }
},
"Drop files here" : {
"localizations" : {
@@ -9625,12 +11531,26 @@
},
"Dynamic Island" : {
"comment" : "Description of the dynamic island style.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island"
+ }
+ }
+ }
},
"Dynamic Island Progress Bars" : {
"comment" : "A section header that lists the options for customizing the appearance of the progress bars displayed by Dynamic Island.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island 진행 표시줄"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9646,7 +11566,14 @@
}
},
"Dynamic Island Visibility" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island 표시"
+ }
+ }
+ }
},
"dynamic.island" : {
"localizations" : {
@@ -9673,6 +11600,12 @@
"value" : "Chaque graphique peut être individuellement activé ou désactivé. L’activité réseau affiche la vitesse de téléchargement et d’envoi, et l’activité du disque affiche la vitesse de lecture et d’écriture."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "각 그래프는 개별적으로 활성화하거나 비활성화할 수 있습니다. 네트워크 활동은 다운로드/업로드 속도를, 디스크 I/O는 읽기/쓰기 속도를 보여줍니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9683,7 +11616,15 @@
},
"EAQI" : {
"comment" : "The label to use for the compact version of the weather air quality scale in the lock screen.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "EAQI"
+ }
+ }
+ }
},
"Easily copy, store, and manage your most-used content. Upgrade now for advanced features like multi-item storage and quick access!" : {
"localizations" : {
@@ -9793,6 +11734,12 @@
"value" : "Modifier l’Animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션 수정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9909,17 +11856,36 @@
"state" : "translated",
"value" : "Adresse e-mail"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이메일 주소"
+ }
}
}
},
"Enable \"Idle Animation\" to customize animations" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "추천 번역 ⭐️: 애니메이션을 사용자 지정하려면 '유휴 상태 애니메이션'을 활성화하세요."
+ }
+ }
+ }
},
"Enable \"Show cool face animation while inactivity\" to customize animations" : {
"comment" : "A message displayed below the section header in the IdleAnimationsSettingsSection, explaining that users can customize animations by enabling this feature.",
"extractionState" : "stale",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션을 사용자 지정하려면 '유휴 상태 시 멋진 얼굴 애니메이션 표시'를 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -9927,11 +11893,23 @@
}
}
}
+ },
+ "Enable album art parallax" : {
+
+ },
+ "Enable album art parallax effect" : {
+
},
"Enable and style the media controls that appear above the system clock when the screen is locked." : {
"comment" : "A description of the media panel settings in the lock screen settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면이 잠겨 있을 때 시스템 시계 위에 나타나는 미디어 제어기를 활성화하고 스타일을 지정합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9939,6 +11917,9 @@
}
}
}
+ },
+ "Enable blur effect behind album art" : {
+
},
"Enable Built-in System HUD" : {
"extractionState" : "stale",
@@ -9948,6 +11929,12 @@
"state" : "translated",
"value" : "Activer le système d’ATH intégré"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "내장 시스템 HUD 활성화"
+ }
}
}
},
@@ -9959,11 +11946,23 @@
"state" : "translated",
"value" : "Activez le système de suivi intégré pour remplacer les notifications macOS avec celles de Atoll."
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "내장 시스템 모니터링을 활성화하여 macOS HUD 알림을 Atoll 디스플레이로 대체할 수 있습니다."
+ }
}
}
},
"Enable Calendar Access" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 접근 허용"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9974,6 +11973,12 @@
},
"Enable Camera Access" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카메라 접근 허용"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -9981,9 +11986,20 @@
}
}
}
+ },
+ "Enable Camera Detection" : {
+
+ },
+ "Enable Clipboard Manager" : {
+
+ },
+ "Enable Color Filtering" : {
+
+ },
+ "Enable Color Picker" : {
+
},
"Enable colored spectrograms" : {
- "extractionState" : "stale",
"localizations" : {
"ar" : {
"stringUnit" : {
@@ -10091,6 +12107,12 @@
"value" : "Activez la pipette de couleur dans Réglages → Pipette de couleur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'설정 → 색상 선택기'에서 색상 선택기를 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10098,11 +12120,20 @@
}
}
}
+ },
+ "Enable Create from Clipboard" : {
+
},
"Enable customizable controls" : {
"comment" : "A toggle that allows users to enable or disable customizable controls for media playback.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 정의 조작 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10110,18 +12141,45 @@
}
}
}
+ },
+ "Enable download detection" : {
+
},
"Enable Dynamic Island media controls to manage the lock screen panel." : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island 미디어 제어기를 활성화하여 잠금 화면 패널을 관리합니다."
+ }
+ }
+ }
+ },
+ "Enable Dynamic mirror" : {
},
"Enable extension diagnostics logging" : {
"comment" : "A toggle that enables or disables logging of diagnostic information related to extensions.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진단 기록 확장 활성화"
+ }
+ }
+ }
},
"Enable extensions to allow third-party apps to display live activities and lock screen widgets in Atoll." : {
"comment" : "A footer text that explains the purpose of enabling extensions.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll에서 서드파티 앱의 실시간 현황 및 잠금 화면 위젯을 표시할 수 있도록 확장 프로그램을 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10138,10 +12196,33 @@
},
"Enable external volume control listener" : {
"comment" : "A toggle that enables external volume control listener.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "추가 볼륨 조작 리스너 활성화"
+ }
+ }
+ }
+ },
+ "Enable Focus Detection" : {
+
+ },
+ "Enable gestures" : {
+
+ },
+ "Enable global keyboard shortcuts" : {
+
},
"Enable global keyboard shortcuts above to customize your shortcuts." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "위의 글로벌 키보드 단축키를 활성화하여 단축키를 사용자 지정하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10149,11 +12230,20 @@
}
}
}
+ },
+ "Enable glowing effect" : {
+
},
"Enable graph visibility in Settings → Stats to view performance data." : {
"comment" : "A message displayed when no graphs are enabled in the Stats tab.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "성능 데이터를 확인하려면 '설정 → 상태'에서 그래프 표시를 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10163,7 +12253,6 @@
}
},
"Enable haptics" : {
- "extractionState" : "stale",
"localizations" : {
"ar" : {
"stringUnit" : {
@@ -10365,12 +12454,31 @@
}
},
"Enable it in Settings → Terminal" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'설정 → 터미널'에서 활성화하세요."
+ }
+ }
+ }
+ },
+ "Enable lock screen live activity" : {
+
+ },
+ "Enable lyrics" : {
},
"Enable media panel blur" : {
"comment" : "A toggle switch that enables or disables the blur effect on the media panel.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 패널 블러 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10384,6 +12492,12 @@
}
}
}
+ },
+ "Enable Microphone Detection" : {
+
+ },
+ "Enable Minimalistic UI" : {
+
},
"Enable music live activity" : {
"localizations" : {
@@ -10484,9 +12598,30 @@
}
}
}
+ },
+ "Enable Note Pinning" : {
+
+ },
+ "Enable Note Search" : {
+
+ },
+ "Enable Notes" : {
+
+ },
+ "Enable reminder live activity" : {
+
+ },
+ "Enable Screen Assistant" : {
+
},
"Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 색상 선택 기능을 활성화하세요. Cmd+Shift+P를 사용하여 색상 선택기를 빠르게 실행할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10494,6 +12629,12 @@
}
}
}
+ },
+ "Enable Screen Recording Detection" : {
+
+ },
+ "Enable shelf" : {
+
},
"Enable sneak peek" : {
"localizations" : {
@@ -10503,6 +12644,12 @@
"value" : "Activer Sneak Peek"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "살짝 보기 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10513,6 +12660,12 @@
},
"Enable stats monitoring in Settings to view system performance data." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시스템 성능 데이터를 확인하려면 설정에서 상태 모니터링을 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10520,9 +12673,21 @@
}
}
}
+ },
+ "Enable system stats monitoring" : {
+
+ },
+ "Enable terminal" : {
+
},
"Enable the battery capsule and configure its layout." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 캡슐을 활성화하고 레이아웃을 설정하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -10535,6 +12700,12 @@
"comment" : "A message explaining that the timer feature must be enabled in settings to access this tab.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 탭을 사용하려면 설정에서 타이머 기능을 활성화하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10547,6 +12718,12 @@
"comment" : "A footer for the \"Weather Widget\" section in the Lock Screen Settings view, describing its purpose.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨 캡슐을 활성화하고 레이아웃, 제공처, 단위 및 선택 사항인 배터리/AQI 표시등을 설정하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10557,6 +12734,12 @@
},
"Enable Thinking Mode" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사고 모드 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10567,14 +12750,39 @@
},
"Enable third-party DDC app integration" : {
"comment" : "A toggle switch that enables or disables integration with a third-party Dynamic Display Control (DDC) app.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제 3자 DDC 앱 통합 활성화"
+ }
+ }
+ }
},
"Enable third-party extensions" : {
"comment" : "Toggle to enable or disable third-party extensions.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제 3자 확장 활성화"
+ }
+ }
+ }
+ },
+ "Enable timer feature" : {
+
},
"Enable timer live activity" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 실시간 현황 활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10591,10 +12799,24 @@
},
"Enable to route BetterDisplay or Lunar display adjustments through Atoll's active HUD style." : {
"comment" : "A description of the feature that allows third-party display integrations to be enabled.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "BetterDisplay 또는 Lunar의 디스플레이 조정을 Atoll의 활성 HUD 스타일로 연결하려면 활성화하세요."
+ }
+ }
+ }
},
"Enable when scaling beyond 30x20px so the Atoll opens gracefully." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "30x20px 이상으로 확대할 때 Atoll이 자연스럽게 열리도록 활성화합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10608,6 +12830,9 @@
}
}
}
+ },
+ "Enable window shadow" : {
+
},
"Engine Utilization" : {
"comment" : "A label describing the utilization of the GPU's engine components.",
@@ -10619,6 +12844,12 @@
"value" : "Utilisation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "엔진 사용률"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -10835,6 +13066,12 @@
"value" : "Entrez votre clé Gemini API"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gemini API 키 입력"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10945,12 +13182,26 @@
},
"Event color" : {
"comment" : "Name of the chip style that shows the event color.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이벤트 색상"
+ }
+ }
+ }
},
"Event List" : {
"comment" : "A section header in the calendar settings view, describing the list of calendar events.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이벤트 목록"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -10980,6 +13231,12 @@
"value" : "Exclure des applications"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제외할 앱"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -11090,6 +13347,12 @@
},
"Expand notch to follow animation width" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "애니메이션 너비에 맞춰 노치 확장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11102,6 +13365,12 @@
"comment" : "A toggle that lets users enable or disable expanded drag detection.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "드래그 감지 구역 확장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -11114,6 +13383,12 @@
"comment" : "A label describing the expanded notch width setting.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 너비 확장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11121,11 +13396,20 @@
}
}
}
+ },
+ "Extend hover area" : {
+
},
"Extension tab unavailable" : {
"comment" : "A message displayed when the extension tab is not available.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확장 프로그램 탭을 사용할 수 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11244,6 +13528,12 @@
"value" : "Externe"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "외부"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11254,15 +13544,42 @@
},
"External display style" : {
"comment" : "A picker that lets the user choose the style of the external display.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "외부 디스플레이 스타일"
+ }
+ }
+ }
+ },
+ "Fan Speed" : {
+
},
"Favorites" : {
"comment" : "Localized name of the \"Favorites\" tab in the clipboard.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "즐겨찾기"
+ }
+ }
+ }
},
"File" : {
"comment" : "Display name for a \"File\" clipboard item type.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일"
+ }
+ }
+ }
},
"Files dropped here will be shared via this service" : {
"comment" : "A description of what happens when files are dropped into the AirDrop view.",
@@ -11272,6 +13589,12 @@
"comment" : "A description below the currently selected quick share provider, explaining that files dropped on the shelf will be shared via that provider.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "서랍에 드롭한 파일은 이 서비스를 통해 공유됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11292,6 +13615,12 @@
},
"Fill Notch" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 채우기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11402,6 +13731,12 @@
},
"Fit to Notch" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치에 맞추기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11414,6 +13749,12 @@
"comment" : "A section header that describes the floating window panel's skip behaviour settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "플로팅 윈도우 패널 건너뛰기 동작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11424,12 +13765,26 @@
},
"Focus" : {
"comment" : "Name of a default timer preset.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중"
+ }
+ }
+ }
},
"Focus active: %@" : {
"comment" : "An accessibility label for the focus widget, describing the currently active focus mode.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 모드 켜짐: %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11446,10 +13801,24 @@
},
"Focus detection mode" : {
"comment" : "The title of a confirmation dialog that lets users choose between using the focus detection mode with or without the use of the SwiftUI Inspector (DevTools).",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 모드 감지 모드"
+ }
+ }
+ }
},
"Focus Status" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11466,6 +13835,12 @@
},
"Focus Widget" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "집중 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11475,13 +13850,38 @@
}
},
"Font family" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "폰트"
+ }
+ }
+ }
},
"Font size" : {
"comment" : "A label displayed above a slider that controls the font size of the terminal",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "폰트 사이즈"
+ }
+ }
+ }
},
"Foreground" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "글자 색"
+ }
+ }
+ }
+ },
+ "Free" : {
},
"Free · %@" : {
@@ -11494,6 +13894,12 @@
"value" : "Libre · %@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "여유 공간 · %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11507,18 +13913,43 @@
}
}
}
+ },
+ "Frequency" : {
+
},
"Frosted Glass" : {
"comment" : "The name of the frosted glass style.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프로스티드 글래스"
+ }
+ }
+ }
},
"Full charge" : {
"comment" : "Text displayed in the status text when the battery is fully charged.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "완전 충전"
+ }
+ }
+ }
},
"Full Disk Access required" : {
"extractionState" : "stale",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체 디스크 접근 권한 필요"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11536,6 +13967,12 @@
"Fully charged" : {
"comment" : "Charging fallback label when already charged",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "충전 완료"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11552,6 +13989,12 @@
"value" : "Clé Gemini API"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gemini API 키"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11864,6 +14307,12 @@
"comment" : "A picker that lets the user choose how a music player skips tracks using horizontal gestures.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제스처 건너뛰기 동작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -11980,6 +14429,12 @@
"value" : "Obtenez votre clé API gratuitement depuis Google AI Studio"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Google AI Studio에서 무료 API 키를 받으세요"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12091,10 +14546,24 @@
},
"Glass" : {
"comment" : "Name of the timer surface mode that uses a glass effect.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "글래스"
+ }
+ }
+ }
},
"Glass mode" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "글래스 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12113,6 +14582,12 @@
"comment" : "The header for the section that controls global settings related to extensions.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전역 설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12223,7 +14698,18 @@
},
"GPU" : {
"comment" : "Title for the GPU usage graph.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "GPU"
+ }
+ }
+ }
+ },
+ "GPU Overview" : {
+
},
"GPU Usage" : {
"localizations" : {
@@ -12233,6 +14719,12 @@
"value" : "Utilisation GPU"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "GPU 사용량"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12355,6 +14847,12 @@
"value" : "Visibilité du graphique"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "그래프 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12363,6 +14861,10 @@
}
}
},
+ "Green" : {
+ "comment" : "Display name for the green caps lock indicator tint mode.",
+ "isCommentAutoGenerated" : true
+ },
"Height:" : {
"extractionState" : "stale",
"localizations" : {
@@ -12372,6 +14874,12 @@
"value" : "Hauteur :"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "높이:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12388,6 +14896,12 @@
},
"Height: %lldpx" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "높이: %lldpx"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12395,6 +14909,9 @@
}
}
}
+ },
+ "HH" : {
+
},
"Hide" : {
"localizations" : {
@@ -12404,6 +14921,12 @@
"value" : "Cacher"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "숨기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12416,6 +14939,12 @@
"comment" : "A toggle to hide all-day events in the calendar.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "종일 이벤트 숨기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12428,6 +14957,12 @@
"comment" : "A toggle that lets the user hide completed reminders",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "완료된 미리 알림 숨기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12435,6 +14970,9 @@
}
}
}
+ },
+ "Hide Dynamic Island during screenshots & recordings" : {
+
},
"Hide DynamicIsland Options" : {
"localizations" : {
@@ -12444,6 +14982,12 @@
"value" : "Cacher les options de DynamicIsland"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다이나믹 아일랜드 옵션 숨기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12453,7 +14997,14 @@
}
},
"Hide lock screen preview" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 미리보기 숨기기"
+ }
+ }
+ }
},
"Hide only when NowPlaying app is in fullscreen" : {
"localizations" : {
@@ -12554,6 +15105,9 @@
}
}
}
+ },
+ "Hide until hovered on non-notch displays" : {
+
},
"Hierarchical" : {
"localizations" : {
@@ -12758,6 +15312,12 @@
},
"High-frequency updates without a timeout can increase battery usage." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시간 제한 없는 빈번한 업데이트는 배터리 사용량을 증가시킬 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12768,7 +15328,15 @@
},
"History" : {
"comment" : "Localized name of each tab in the clipboard view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기록"
+ }
+ }
+ }
},
"History Size" : {
"localizations" : {
@@ -12778,6 +15346,12 @@
"value" : "Taille de l’historique"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기록 크기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -12920,10 +15494,24 @@
},
"HUD icon style" : {
"comment" : "A label describing the style of the 3D or symbol-based Bluetooth HUD icon.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "HUD 아이콘 스타일"
+ }
+ }
+ }
},
"HUD Position" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "HUD 위치"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13144,6 +15732,12 @@
"comment" : "A picker that lets users choose the color scheme for the icon and progress bar in the OSD.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아이콘 & 진행도 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13162,6 +15756,12 @@
"value" : "En veille"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "유휴"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13169,6 +15769,9 @@
}
}
}
+ },
+ "Idle Animation" : {
+
},
"Idle Animation Style" : {
"comment" : "The header label for the section that lets users choose the style of idle animation.",
@@ -13180,6 +15783,12 @@
"value" : "Style de l’animation de veille"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "유휴 애니메이션 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13190,7 +15799,15 @@
},
"Image" : {
"comment" : "Name of the \"Image\" clipboard item type.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이미지"
+ }
+ }
+ }
},
"Import" : {
"localizations" : {
@@ -13200,6 +15817,12 @@
"value" : "Importer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "가져오기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13224,6 +15847,12 @@
"value" : "Erreur d’importation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "가져오기 에러"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13242,6 +15871,12 @@
"value" : "Importer un fichier"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일 가져오기..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13358,6 +15993,12 @@
"value" : "Inactif"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "비활성"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13468,6 +16109,12 @@
},
"Inline snapshot preview" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "인라인 스냅샷 미리보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -13477,7 +16124,14 @@
}
},
"Input" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "입력"
+ }
+ }
+ }
},
"Install updates automatically" : {
"extractionState" : "stale",
@@ -13494,6 +16148,12 @@
"value" : "Installer les mises à jour automatiquement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "업데이트 자동 설치"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -13603,8 +16263,18 @@
}
}
},
+ "Integrations" : {
+ "comment" : "Section header for settings related to third-party integrations.",
+ "isCommentAutoGenerated" : true
+ },
"Interactive (Drag to Change)" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "반응형 (드래그해서 변경)"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13612,6 +16282,9 @@
}
}
}
+ },
+ "Interfaces" : {
+
},
"IPv4 · %@" : {
"comment" : "A label displaying an IP address for a network interface. The text inside the parentheses is the IP address of the interface.",
@@ -13641,6 +16314,12 @@
},
"Join the meeting" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미팅 참여"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13651,14 +16330,37 @@
},
"just now" : {
"comment" : "Text describing a moment in time that is just now.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "방금"
+ }
+ }
+ }
},
"Just now" : {
"comment" : "A string indicating that an action was performed just recently.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "방금"
+ }
+ }
+ }
},
"Keep terminal open until clicked outside" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "외부를 클릭할 때까지 터미널 유지"
+ }
+ }
+ }
},
"Keyboard Backlight HUD" : {
"localizations" : {
@@ -13668,6 +16370,12 @@
"value" : "ATH de l’éclairage du clavier"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "키보드 백라이트 HUD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13686,6 +16394,12 @@
"comment" : "A label displayed above the toggle for the keyboard backlight OSD.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "키보드 백라이트 OSD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13702,6 +16416,12 @@
"value" : "Les raccourcis claviers sont désactivés"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "키보드 단축키 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13714,6 +16434,12 @@
"comment" : "A help text explaining why the \"Show Focus Label\" toggle is disabled when the \"Show Focus as brief toast\" toggle is enabled.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'간소화된 토스트 모드'가 활성화되어 있는 동안에는 레이블이 '켬/끔' 텍스트로 축소되어 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -13726,6 +16452,12 @@
"comment" : "A label for the \"Last Denied Reason\" section in the extensions settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마지막 거부 사유:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13742,6 +16474,12 @@
"value" : "Dernière mise à jour"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마지막 업데이트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13849,6 +16587,9 @@
}
}
}
+ },
+ "Launch at login" : {
+
},
"Layout" : {
"comment" : "A label for the segment control that lets the user choose the layout of the weather widget.",
@@ -13857,6 +16598,12 @@
},
"Layout Preview" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "레이아웃 미리보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13873,6 +16620,12 @@
},
"Left" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "왼쪽"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13889,15 +16642,35 @@
"state" : "translated",
"value" : "Clé de license"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "라이선스 키"
+ }
}
}
},
"Light Use" : {
"comment" : "Name of the \"Light Use\" user profile.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "일반 사용자"
+ }
+ }
+ }
},
"Line Width: %lldpx" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선 너비: %lldpx"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13926,7 +16699,15 @@
},
"Liquid Glass" : {
"comment" : "Name of the \"Liquid Glass\" lock screen glass style.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "리퀴드 글래스"
+ }
+ }
+ }
},
"Liquid Glass requires macOS 26 or later." : {
"localizations" : {
@@ -13936,6 +16717,12 @@
"value" : "Liquid Glass nécessite macOS 26 ou plus récent."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "리퀴드 글래스는 macOS 26 이상 버전이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13952,6 +16739,12 @@
},
"Listens for Focus session changes via distributed notifications" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "분산 알림을 통해 집중 모드 세션 변경 사항을 감지합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13964,6 +16757,12 @@
"comment" : "A label indicating that the music is live.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Live"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13976,6 +16775,12 @@
"comment" : "The title of the \"Live Activities\" screen.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 현황"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -13988,6 +16793,12 @@
"comment" : "The header for the \"Live Activity & Feedback\" section in the lock screen settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 현황 & 피드백"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14004,6 +16815,12 @@
"state" : "translated",
"value" : "Suivi en directe"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 모니터링"
+ }
}
}
},
@@ -14015,6 +16832,12 @@
"value" : "Données de performance en directe"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 성능 데이터"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14027,6 +16850,12 @@
"comment" : "A section header that indicates the live preview of custom OSD settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 미리보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14039,6 +16868,12 @@
"comment" : "A visual indicator that appears when a music stream is live.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 스트림 표시기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14046,6 +16881,15 @@
}
}
}
+ },
+ "Load 1m" : {
+
+ },
+ "Load 5m" : {
+
+ },
+ "Load 15m" : {
+
},
"Load Average" : {
"comment" : "A label displayed above the load average values.",
@@ -14057,6 +16901,12 @@
"value" : "Moyenne de la charge"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "부하 평균"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14067,7 +16917,15 @@
},
"Loading..." : {
"comment" : "A placeholder text displayed while loading the wallpaper.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "불러오는 중..."
+ }
+ }
+ }
},
"Lock Screen" : {
"localizations" : {
@@ -14077,6 +16935,12 @@
"value" : "Écran verrouillé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14093,6 +16957,12 @@
},
"Lock Screen Glass" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 글래스"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14103,6 +16973,12 @@
},
"Lock screen glass mode" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 글래스 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14113,6 +16989,12 @@
},
"Lock Screen Integration" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 통합"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14125,6 +17007,12 @@
"comment" : "The title of the music panel on the lock screen.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 리퀴드 글래스"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14135,6 +17023,12 @@
},
"Lock Screen Media" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 미디어"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14147,6 +17041,12 @@
"comment" : "A description of the content displayed in the lock screen panel.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 패널 미리보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14159,6 +17059,12 @@
"comment" : "The header text for the \"Lock Screen Positioning\" section in the settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 배치"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14171,6 +17077,12 @@
"comment" : "A section header for the lock screen reminder widget settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 미리 알림 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14183,6 +17095,12 @@
"comment" : "A toggle that enables or disables the use of lock screen widgets by the extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14190,9 +17108,18 @@
}
}
}
+ },
+ "Logical cores" : {
+
},
"Loop Mode" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "반복 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14404,7 +17331,15 @@
},
"Low battery" : {
"comment" : "Text displayed when the battery level drops below a certain threshold.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 부족"
+ }
+ }
+ }
},
"Low Power Mode" : {
"localizations" : {
@@ -14508,11 +17443,25 @@
},
"Low Power: %@" : {
"comment" : "Text displayed in a status label at the top of the screen indicating whether low power mode is on or off.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "배터리 부족: %@"
+ }
+ }
+ }
},
"Mac battery at %d percent" : {
"comment" : "Mac battery gauge accessibility label",
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "맥 배터리 %d 퍼센트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14531,6 +17480,12 @@
"comment" : "A message displayed when the Custom OSD feature is unavailable on this version of macOS.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "macOS 15 또는 최신 버전 필요"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14543,6 +17498,12 @@
"comment" : "A footer text that credits the developer of the app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ebullioscopic이 ❤️으로 제작함"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14552,12 +17513,25 @@
}
},
"Main screen style" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메인 화면 스타일"
+ }
+ }
+ }
},
"Manage indicator preferences from Settings → Privacy. No manual microphone toggle is required." : {
"comment" : "A description of how to manage the microphone privacy indicator preferences.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정 → 개인정보 보호'에서 표시기 환경설정을 관리하세요. 마이크 토글을 수동으로 조작할 필요가 없습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14576,6 +17550,12 @@
"comment" : "An accessibility label for a button that marks an item as complete.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "완료로 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14588,6 +17568,12 @@
"comment" : "An accessibility label for a button that marks an item as incomplete.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미완료로 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14805,6 +17791,12 @@
"comment" : "A label describing the material options for the custom OSD.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Material 옵션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -14921,7 +17913,15 @@
},
"Maximum height" : {
"comment" : "A label for the terminal's maximum height setting.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "최대 높이"
+ }
+ }
+ }
},
"Media" : {
"localizations" : {
@@ -15023,9 +18023,12 @@
}
}
},
+ "Media & Display" : {
+ "comment" : "Display title for the section header for settings related to media and display.",
+ "isCommentAutoGenerated" : true
+ },
"Media change with horizontal gestures" : {
"comment" : "A toggle that lets the user enable or disable the feature of changing the currently playing media using horizontal gestures.",
- "extractionState" : "stale",
"isCommentAutoGenerated" : true,
"localizations" : {
"ar" : {
@@ -15330,6 +18333,12 @@
"comment" : "A section header that lists the media live activity settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 실시간 현황"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15342,6 +18351,12 @@
"comment" : "Accessibility label describing the control that opens the media output selector.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 출력"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15354,6 +18369,12 @@
"comment" : "A section header in the lock screen settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 패널"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15665,6 +18686,12 @@
},
"Meeting starts at %@" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@에 회의 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15675,7 +18702,27 @@
},
"Memory" : {
"comment" : "Title of the memory usage single value graph.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메모리"
+ }
+ }
+ }
+ },
+ "Memory Clock" : {
+
+ },
+ "Memory Overview" : {
+
+ },
+ "Memory pressure is critical; the system may purge aggressively." : {
+
+ },
+ "Memory pressure is elevated. Closing apps may help." : {
+
},
"Memory Usage" : {
"localizations" : {
@@ -15685,6 +18732,12 @@
"value" : "Utilisation de la mémoire"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메모리 사용량"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15700,7 +18753,6 @@
}
},
"Menubar icon" : {
- "extractionState" : "stale",
"localizations" : {
"ar" : {
"stringUnit" : {
@@ -15805,6 +18857,12 @@
"extractionState" : "stale",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메세지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15815,7 +18873,15 @@
},
"Mic" : {
"comment" : "Name of a sneak action type that controls the microphone.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크"
+ }
+ }
+ }
},
"Mic %@" : {
"extractionState" : "stale",
@@ -15922,6 +18988,12 @@
"comment" : "A description of the state when the microphone is muted.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크 음소거"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15934,6 +19006,12 @@
"comment" : "A description of the state when the microphone is unmuted.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크 음소거 해제"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -15952,6 +19030,12 @@
"value" : "Microphone"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15968,6 +19052,12 @@
"value" : "Microphone actif"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크 작동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15980,6 +19070,12 @@
"comment" : "A description of the microphone privacy indicator feature.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@에 회의 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -15996,6 +19092,12 @@
"value" : "Statut du microphone"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "마이크 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16012,11 +19114,23 @@
"state" : "translated",
"value" : "min"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "분"
+ }
}
}
},
"Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미니멀 모드는 미디어 제어기와 시스템 HUD에 집중하며, 깔끔하고 몰입감 있는 경험을 위해 모든 추가 기능을 숨깁니다. 활성화 시 애니메이션도 자동으로 간소화됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16126,13 +19240,18 @@
}
},
"Minutes" : {
- "extractionState" : "stale",
"localizations" : {
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minutes"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "분"
+ }
}
}
},
@@ -16240,6 +19359,12 @@
"comment" : "A toggle that enables or disables the app's ability to mirror macOS Clock timers.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "macOS 시계 타이머와 연동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16350,6 +19475,12 @@
},
"Mirrors the toggle found under Lock Screen settings so timer-specific workflows can enable or disable the widget without switching tabs." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'잠금 화면' 설정에 있는 토글과 연동되어, 탭을 전환하지 않고도 타이머 전용 워크플로에서 위젯을 활성화하거나 비활성화할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16357,9 +19488,18 @@
}
}
}
+ },
+ "MM" : {
+
},
"Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 변경 사항을 모니터링하고 최근 복사 기록을 유지합니다. Cmd+Shift+V를 눌러 클립보드 기록에 빠르게 접근할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16372,6 +19512,12 @@
"comment" : "A footer description for the \"Downloads\" section of the settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 폴더에서 크로미움 스타일의 다운로드(.crdownload 파일)를 감지하고, 다운로드가 진행되는 동안 Dynamic Island에 실시간 현황을 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16382,6 +19528,12 @@
},
"Monitoring Behavior" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링 행동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16398,6 +19550,12 @@
"value" : "Statut du suivi"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16414,6 +19572,12 @@
"state" : "translated",
"value" : "Le suivi a pris fin"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링 중지됨"
+ }
}
}
},
@@ -16521,6 +19685,12 @@
"comment" : "A button label that says \"Move Down\".",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아래로 이동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16533,6 +19703,12 @@
"comment" : "A button label that says \"Move Up\".",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "위로 이동"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16543,6 +19719,12 @@
},
"Music panel variant" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "음악 패널 유형"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16761,6 +19943,12 @@
"value" : "Mon Animation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "나의 애니메이션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16877,6 +20065,12 @@
"value" : "Navigation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "탐색"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -16987,7 +20181,18 @@
},
"Network" : {
"comment" : "Title for the \"Network\" section in the stats view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "네트워크"
+ }
+ }
+ }
+ },
+ "Network Activity" : {
+
},
"Network Download" : {
"localizations" : {
@@ -16997,6 +20202,12 @@
"value" : "Téléchargement réseau"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "네트워크 다운로드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17010,6 +20221,9 @@
}
}
}
+ },
+ "Network Overview" : {
+
},
"Network Upload" : {
"localizations" : {
@@ -17019,6 +20233,12 @@
"value" : "Envoi réseau"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "네트워크 업로드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17137,6 +20357,12 @@
"value" : "Aucune interface détectée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아직 감지된 활성 인터페이스가 없습니다"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17145,10 +20371,24 @@
}
}
},
+ "No AirPlay devices found" : {
+ "comment" : "A message displayed when no AirPlay devices are found.",
+ "isCommentAutoGenerated" : true
+ },
+ "No AirPlay outputs available" : {
+ "comment" : "A message displayed when there are no available AirPlay outputs.",
+ "isCommentAutoGenerated" : true
+ },
"No audio outputs available" : {
"comment" : "Displayed when no audio output devices can be listed in the media output selector.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "유효한 오디오 출력 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17165,6 +20405,12 @@
"value" : "L’historique du presse-papiers est vide"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17181,6 +20427,12 @@
"value" : "Aucune couleur n’a été trouvé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 발견 안됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17197,6 +20449,12 @@
"value" : "Aucune couleur ne correspond à \"%@\""
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'%@'와(과) 일치하는 색상이 없습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17207,6 +20465,12 @@
},
"No Colors Yet" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17219,6 +20483,12 @@
"comment" : "A message displayed when the clipboard is empty, indicating that there are no copied items.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "복사된 항목 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17435,6 +20705,12 @@
"comment" : "A description displayed when there are no events in the calendar.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이벤트 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17552,6 +20828,12 @@
"value" : "No excludes"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제외된 항목 없음"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -17665,6 +20947,12 @@
"comment" : "A message displayed when there are no extensions that have requested permission.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아직 확장 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17681,6 +20969,12 @@
"value" : "Aucun favoris"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "즐겨찾기 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17693,6 +20987,12 @@
"comment" : "A label displayed when no graphs are enabled in the Stats tab.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화된 그래프가 없습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17703,6 +21003,12 @@
},
"No notes yet" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아직 메모 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17715,6 +21021,12 @@
"comment" : "A message displayed when there are no timer presets configured, encouraging the user to add one.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정된 프리셋이 없습니다. 타이머 팝오버에 표시되도록 프리셋을 추가해 보세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17727,6 +21039,12 @@
"comment" : "A message displayed when there is no process data available to display in the CPU stats view. It encourages the user to keep the stats open for a moment to gather more data.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아직 프로세스 데이터가 없습니다. 잠시 동안 '상태' 창을 열어두세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17743,6 +21061,12 @@
"value" : "Aucun résultats"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "결과 없음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17759,6 +21083,12 @@
"value" : "Aucun résultats"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "결과 발견 안됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17771,6 +21101,12 @@
"comment" : "A message indicating that no storage devices have been detected yet.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아직 감지된 저장 장치가 없습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17878,6 +21214,9 @@
}
}
}
+ },
+ "Normal" : {
+
},
"Not active" : {
"comment" : "A description of whether the camera is currently active.",
@@ -17889,6 +21228,12 @@
"value" : "Non active"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화되지 않음"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -17899,7 +21244,15 @@
},
"Not charging" : {
"comment" : "Text displayed in the status text when the battery is not charging.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "충전 중 아님"
+ }
+ }
+ }
},
"Not Now" : {
"localizations" : {
@@ -18003,6 +21356,12 @@
},
"Not Set" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정 안 됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18320,6 +21679,12 @@
"comment" : "A section header for adjusting the expanded notch width.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 너비"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18332,6 +21697,12 @@
"comment" : "The title of the Notes settings page.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메모"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18342,12 +21713,26 @@
},
"Nothing Playing" : {
"comment" : "A label displayed when there is nothing playing in the music player.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "재생중인 항목 없음"
+ }
+ }
+ }
},
"Notify before" : {
"comment" : "A label describing the slider that allows the user to set a reminder lead time.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리 알림"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18362,12 +21747,31 @@
}
}
},
+ "Now Playing" : {
+ "comment" : "Name of the media controller type for the \"Now Playing\" option.",
+ "isCommentAutoGenerated" : true
+ },
"Number of lines kept in the scrollback buffer. Higher values use more memory." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크롤백 버퍼에 보관할 줄 수입니다. 값이 클수록 메모리 사용량이 늘어납니다."
+ }
+ }
+ }
},
"Off" : {
"comment" : "Text displayed in a status label at the top of the screen indicating whether low power mode is on or off.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "끔"
+ }
+ }
+ }
},
"OK" : {
"localizations" : {
@@ -18472,7 +21876,15 @@
},
"On" : {
"comment" : "Status text that indicates whether low power mode is on or off.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "켬"
+ }
+ }
+ }
},
"One or more files failed to load" : {
"localizations" : {
@@ -18583,6 +21995,12 @@
"value" : "Only app icon"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "앱 아이콘만"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -18595,6 +22013,12 @@
"comment" : "A description of the media panel blur setting, visible only when Material is set to Frosted Glass.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "‘Material’이 '프로스티드 글래스'로 설정된 경우에만 적용됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18607,6 +22031,12 @@
"comment" : "A description of a feature that is only available when a specific setting is enabled.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Material이 '프로스티드 글래스'로 설정된 경우에만 사용할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18624,6 +22054,12 @@
"value" : "Only download icon"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 아이콘만"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -18634,6 +22070,12 @@
},
"Open Google AI Studio" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Google AI Studio 열기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18646,6 +22088,12 @@
"comment" : "A button label that opens a calendar with the event details.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더에서 열기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18656,6 +22104,12 @@
},
"Open Model Settings" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모델 설정 열기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18663,9 +22117,21 @@
}
}
}
+ },
+ "Open notch on hover" : {
+
+ },
+ "Open shelf tab by default if items added" : {
+
},
"Open System Settings" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시스템 설정 열기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18675,10 +22141,23 @@
}
},
"Opens a transparent preview window with mock data that mirrors the current lock screen widget configuration." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "현재 잠금 화면 위젯 설정이 반영된 가상 데이터와 함께 투명한 미리보기 창을 엽니다."
+ }
+ }
+ }
},
"Opens the AI assistant panel for file analysis and conversation. Default is Cmd+Shift+A. Only works when screen assistant feature is enabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "파일 분석 및 대화를 위한 AI 어시스턴트 패널을 엽니다. 기본 단축키는 Cmd+Shift+A이며, 화면 어시스턴트 기능이 활성화된 경우에만 작동합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18695,6 +22174,12 @@
},
"Opens the clipboard history panel. Default is Cmd+Shift+V (similar to Windows+V on PC). Only works when clipboard feature is enabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 기록 패널을 엽니다. 기본 단축키는 Cmd+Shift+V(Windows의 Win+V와 유사)이며,"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18705,6 +22190,12 @@
},
"Opens the color picker panel for screen color capture. Default is Cmd+Shift+P. Only works when color picker feature is enabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 색상 캡처를 위한 색상 선택기 패널을 엽니다. 기본 단축키는 Cmd+Shift+P이며, 색상 선택기 기능이 활성화된 경우에만 작동합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18714,18 +22205,48 @@
}
},
"Opens the terminal tab in the notch. Default is Ctrl+`. Only works when terminal feature is enabled." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치에서 터미널 탭을 엽니다. 기본 단축키는 Ctrl+`이며, 터미널 기능이 활성화된 경우에만 작동합니다."
+ }
+ }
+ }
},
"Option as Meta key" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Option을 Meta 키로 사용"
+ }
+ }
+ }
},
"Option as Meta sends Esc+key instead of macOS special characters. Mouse reporting forwards mouse events to terminal applications like vim or tmux." : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'Option을 Meta 키로 사용'을 선택하면 macOS 특수 문자 대신 Esc+키를 전송합니다. '마우스 리포팅'은 마우스 이벤트를 vim이나 tmux 같은 터미널 애플리케이션으로 전달합니다."
+ }
+ }
+ }
+ },
+ "Other" : {
},
"Output devices" : {
"comment" : "Section title for the list of available audio output devices in the media output selector.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "출력 기기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18744,6 +22265,12 @@
"comment" : "Label describing the system volume control inside the media output selector.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "출력 볼륨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18756,6 +22283,12 @@
"comment" : "A label indicating that the timer is running overtime.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시간 초과"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18764,10 +22297,20 @@
}
}
},
+ "Panel" : {
+ "comment" : "Display name for the clipboard display mode \"Panel\".",
+ "isCommentAutoGenerated" : true
+ },
"Panel mode shows clipboard in a floating window near the notch." : {
"comment" : "A description of the \"Panel\" clipboard display mode.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "패널 모드는 노치 근처의 플로팅 윈도우에 클립보드를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18784,6 +22327,12 @@
},
"Panel mode shows color picker in a floating window. Popover mode shows color picker as a dropdown attached to the color picker button." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "패널 모드는 플로팅 윈도우에 색상 선택기를 표시합니다. 팝오버 모드는 색상 선택기 버튼에 연결된 드롭다운 형식으로 색상 선택기를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18794,6 +22343,12 @@
},
"Panel mode shows the assistant in a floating window near the notch. Popover mode shows the assistant as a dropdown attached to the AI button." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "패널 모드는 노치 근처의 플로팅 윈도우에 어시스턴트를 표시합니다. 팝오버 모드는 AI 버튼에 연결된 드롭다운 형식으로 어시스턴트를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18804,11 +22359,20 @@
},
"Pause" : {
"shouldTranslate" : false
+ },
+ "Peak" : {
+
},
"Pending" : {
"comment" : "A label indicating that a user's permission to access a feature is being checked.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대기 중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18816,6 +22380,9 @@
}
}
}
+ },
+ "Per-Core Usage" : {
+
},
"Percentage" : {
"localizations" : {
@@ -18825,6 +22392,12 @@
"value" : "Percentage"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "퍼센트"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -18837,6 +22410,12 @@
"comment" : "A label describing the different permission states displayed in the footer of the extensions settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "권한 상태:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18847,6 +22426,12 @@
},
"Permissions" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "권한"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18857,6 +22442,12 @@
},
"Pick Color" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18867,6 +22458,12 @@
},
"Pick per-widget liquid-glass variants below. Changes mirror the Lock Screen tab." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아래에서 위젯별 리퀴드 글래스 스타일을 선택하세요. 변경 사항은 '잠금 화면' 탭에 동일하게 반영됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18877,6 +22474,12 @@
},
"Picked %@" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ 선택됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18887,6 +22490,12 @@
},
"Picked Color" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선택된 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18897,6 +22506,12 @@
},
"Picking Status" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선택 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18907,10 +22522,24 @@
},
"Pill-shaped island with rounded corners, similar to iPhone's Dynamic Island" : {
"comment" : "Description of the Dynamic Island style for external displays.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "iPhone의 Dynamic Island와 유사한, 모서리가 둥근 알약 모양의 아일랜드"
+ }
+ }
+ }
},
"Pin items from history to save them here" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기록에서 항목을 고정하여 이곳에 저장하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18927,6 +22556,12 @@
},
"Pin items to add favorites" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "항목을 고정하여 즐겨찾기에 추가하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18937,6 +22572,12 @@
},
"Pin items to add them to favorites" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "항목을 고정하여 즐겨찾기에 추가하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18947,6 +22588,12 @@
},
"Pinned Items" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "고정된 항목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18954,11 +22601,26 @@
}
}
}
+ },
+ "Play feedback when volume is changed" : {
+
+ },
+ "Play lock/unlock sounds" : {
+
+ },
+ "Play low battery alert sound" : {
+
},
"Plays the supplied feedback clip whenever you press the hardware volume keys." : {
"comment" : "A help text describing the audio feedback feature.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "하드웨어 음량 버튼을 누를 때마다 제공된 피드백 사운드를 재생합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -18969,6 +22631,12 @@
},
"Please configure your API key for the selected AI provider in model settings." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모델 설정에서 선택한 AI 제공업체의 API 키를 설정해 주세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19079,12 +22747,26 @@
},
"Popover" : {
"comment" : "Description of a timer display mode when the controls are displayed as a popover.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "팝오버"
+ }
+ }
+ }
},
"Popover mode shows clipboard as a dropdown attached to the clipboard button." : {
"comment" : "A description of the \"Popover mode\" in the Clipboard Settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "팝오버 모드는 클립보드 버튼에 연결된 드롭다운 형식으로 클립보드를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19101,6 +22783,12 @@
},
"Popover mode shows color picker as a dropdown attached to the color picker button. Panel mode shows color picker in a floating window." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "팝오버 모드는 색상 선택기 버튼에 연결된 드롭다운 형식으로 색상 선택기를 표시합니다. 패널 모드는 플로팅 윈도우에 색상 선택기를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19111,6 +22799,12 @@
},
"Popover mode shows the assistant as a dropdown attached to the AI button. Panel mode shows the assistant in a floating window near the notch." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "팝오버 모드는 AI 버튼에 연결된 드롭다운 형식으로 어시스턴트를 표시합니다. 패널 모드는 노치 근처의 플로팅 윈도우에 어시스턴트를 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19127,6 +22821,12 @@
"value" : "Position"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "위치"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19139,6 +22839,12 @@
"comment" : "A label for the name of a timer preset.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프리셋 이름"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19151,6 +22857,12 @@
"comment" : "A header label for the list of timer presets.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프리셋"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19163,6 +22875,12 @@
"comment" : "A footer for the \"Timer Presets\" section in the TimerSettings view, explaining how to manage and reorder timer presets.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "프리셋은 설정된 이름, 시간 및 강조 색상과 함께 타이머 팝오버 안에 표시됩니다. 표시 순서를 바꾸려면 항목을 재정렬하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19181,6 +22899,12 @@
"value" : "Pression"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "압력"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19189,8 +22913,18 @@
}
}
},
- "Prevents the terminal from closing when the cursor accidentally leaves the notch area." : {
+ "Pressure & Swap" : {
+ },
+ "Prevents the terminal from closing when the cursor accidentally leaves the notch area." : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "커서가 실수로 노치 영역을 벗어날 때 터미널이 닫히지 않도록 방지합니다."
+ }
+ }
+ }
},
"Preview" : {
"localizations" : {
@@ -19200,6 +22934,12 @@
"value" : "Aperçu"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19209,12 +22949,25 @@
}
},
"Preview lock screen widgets" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 위젯 미리보기"
+ }
+ }
+ }
},
"Preview Zoom" : {
"comment" : "A label describing the zoom control for the animation preview.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리보기 확대"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19233,6 +22986,12 @@
"comment" : "A heading for the section that lists privacy indicators.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개인정보 보호 표시기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19245,6 +23004,12 @@
"comment" : "A link to the privacy policy.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개인정보 보호 정책"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19253,9 +23018,21 @@
}
}
},
+ "Productivity" : {
+ "comment" : "Title of a settings tab group related to productivity features.",
+ "isCommentAutoGenerated" : true
+ },
"Progress" : {
"comment" : "Name of the download indicator style that shows a progress bar.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진행도"
+ }
+ }
+ }
},
"Progress bar" : {
"extractionState" : "stale",
@@ -19266,6 +23043,12 @@
"value" : "Progress bar"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진행 표시줄"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -19276,6 +23059,12 @@
},
"Progress style" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진행도 스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19342,8 +23131,8 @@
},
"ko" : {
"stringUnit" : {
- "state" : "needs_review",
- "value" : "진행 바 스타일"
+ "state" : "translated",
+ "value" : "진행 표시줄 스타일"
}
},
"pl" : {
@@ -19386,7 +23175,15 @@
},
"Provider" : {
"comment" : "A label for selecting a third-party display integration provider.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "공급자"
+ }
+ }
+ }
},
"Quick Actions" : {
"localizations" : {
@@ -19396,6 +23193,12 @@
"value" : "Actions rapides"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "빠른 동작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19413,6 +23216,12 @@
"comment" : "A picker that lets the user select a quick share service to use when sharing files from the shelf.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Quick Share 서비스"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19646,6 +23455,12 @@
"value" : "Quitter boring.notch"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "boring.notch 종료"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -19656,12 +23471,26 @@
},
"R " : {
"comment" : "Label for the read data in the disk usage graph.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "R"
+ }
+ }
+ }
},
"Re-authorize" : {
"comment" : "A button that re-authorizes an app when pressed.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "재인증"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19686,6 +23515,12 @@
"value" : "Lecture"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "읽기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19702,6 +23537,12 @@
"value" : "Prêt"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "준비"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19718,6 +23559,12 @@
"value" : "Mode de raisonnemen"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "추론 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19730,6 +23577,12 @@
"comment" : "A label describing the recent activity of a particular extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "최근 활동 (최근 5분간)"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19746,6 +23599,12 @@
"value" : "Couleurs récentes"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "최근 색상"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19762,6 +23621,12 @@
"value" : "Enregistrement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19780,6 +23645,12 @@
"value" : "Enregistrement détécté"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화 감지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19796,6 +23667,12 @@
"value" : "Statut de l’enregistrement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화 상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -19806,7 +23683,15 @@
},
"Refresh detection" : {
"comment" : "A button label that refreshes the detection status of BetterDisplay.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "새로고침 감지"
+ }
+ }
+ }
},
"Refresh devices" : {
@@ -20015,6 +23900,12 @@
"comment" : "A section header that lists the options related to live activity notifications for reminders.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리 알림 실시간 현황"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20024,7 +23915,14 @@
}
},
"Reminder Widget" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리 알림 위젯"
+ }
+ }
+ }
},
"Reminders" : {
"localizations" : {
@@ -20034,6 +23932,12 @@
"value" : "Rappels"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미리 알림"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20052,6 +23956,12 @@
"comment" : "A button that removes an extension from the authorized list.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제거"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20064,6 +23974,12 @@
"comment" : "A message presented when a user confirms they want to remove an extension from the authorized list. The argument is the name of the extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@을(를) 승인된 확장 프로그램 목록에서 제거하시겠습니까? 제거하면 이 앱의 모든 활성화된 실시간 현황, 잠금 화면 위젯 및 노치 경험이 종료됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20074,6 +23990,12 @@
},
"Remove Extension" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확장 제거"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20084,6 +24006,12 @@
},
"Remove from shelf after dragging" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "드래그한 후 서랍에서 제거"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20093,6 +24021,19 @@
}
},
"Remove selected" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선택된 항목 제거"
+ }
+ }
+ }
+ },
+ "Render" : {
+
+ },
+ "Renderer" : {
},
"Request Access" : {
@@ -20103,6 +24044,12 @@
"value" : "Demander l’accès"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "접근 권한 요청"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20119,10 +24066,24 @@
},
"Requires a third-party client with API plugin enabled." : {
"comment" : "Description of a music controller type when it requires a third-party client with an API plugin enabled.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "API 플러그인이 활성화된 서드파티 클라이언트가 필요합니다."
+ }
+ }
+ }
},
"Requires Accessibility permission so Dynamic Island can intercept the hardware volume keys." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dynamic Island가 하드웨어 음량 키를 제어할 수 있도록 접근성 권한이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20145,6 +24106,12 @@
"value" : "Réinitialiser"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20161,6 +24128,12 @@
"value" : "Tout réinitialiser"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체 초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20171,12 +24144,26 @@
},
"Reset Context" : {
"comment" : "A button label that resets the conversation context.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "컨텍스트 초기화"
+ }
+ }
+ }
},
"Reset Live Activities" : {
"comment" : "A menu item that resets live activities for a particular app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "실시간 현황 초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20189,6 +24176,12 @@
"comment" : "A menu item that resets all lock screen widgets for a particular app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "잠금 화면 위젯 초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20201,6 +24194,12 @@
"comment" : "A menu item that resets all notch experiences for a particular app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 경험 초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20213,6 +24212,12 @@
"comment" : "A button that resets the rate limits for a particular extension.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "속도 제한 재설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20229,6 +24234,12 @@
"value" : "Réinitialiser aux paramètres d’origine "
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본값으로 재설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20241,6 +24252,12 @@
"comment" : "A button that resets the music slot configuration to its default values.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본값으로 재설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20253,6 +24270,12 @@
"comment" : "A button to reset the expanded notch width to its default value.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "너비 초기화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20370,6 +24393,12 @@
"value" : "Relancer Atoll"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Atoll 재시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20380,20 +24409,50 @@
},
"Restart shell" : {
"comment" : "A button label that says \"Restart shell\".",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Shell 재시작"
+ }
+ }
+ }
},
"Restart Shell" : {
"comment" : "A button that restarts the shell process. Any unsaved work in the terminal will be lost.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Shell 재시작"
+ }
+ }
+ }
},
"Restarts the shell process. Any unsaved work in the terminal will be lost." : {
"comment" : "A footer description for the \"Restart Shell\" button in the Terminal settings view.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "셸 프로세스를 재시작합니다. 터미널에서 저장되지 않은 작업 내용은 삭제됩니다."
+ }
+ }
+ }
},
"Restore" : {
"comment" : "The text for a button that restores default settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "qhrrn"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20412,6 +24471,12 @@
"comment" : "A confirmation dialog title asking if the user wants to restore the default timer presets.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본 타이머 프리셋을 복구하시겠습니까?"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20424,6 +24489,12 @@
"comment" : "A button that, when tapped, presents a confirmation dialog to reset all timer settings to their default values.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "기본값 복원"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20440,6 +24511,12 @@
"value" : "Reprendre"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "재개"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20447,11 +24524,23 @@
}
}
}
+ },
+ "Reverse open/close scroll gestures" : {
+
+ },
+ "Reverse swipe gestures" : {
+
},
"Revoke Access" : {
"comment" : "A button that revokes access to an app.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "접근 권한 철회"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20462,10 +24551,24 @@
},
"Rich Text" : {
"comment" : "Name for a clipboard item type that represents a rich text format.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "리치 텍스트"
+ }
+ }
+ }
},
"Right" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "오른쪽"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20480,6 +24583,10 @@
}
}
},
+ "Ring" : {
+ "comment" : "The name of the timer progress style that shows a ring shape.",
+ "isCommentAutoGenerated" : true
+ },
"Rotation:" : {
"extractionState" : "stale",
"localizations" : {
@@ -20489,6 +24596,12 @@
"value" : "Rotation:"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "회전:"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -20600,6 +24713,12 @@
},
"Sampling can continue while the notch is closed when the timeout is disabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시간 제한이 비활성화된 경우, 노치가 닫혀 있는 동안에도 샘플링이 계속될 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20616,6 +24735,12 @@
"value" : "Enregistrer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "저장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20632,6 +24757,12 @@
"value" : "Enregistrer les changements"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "변경된 항목 저장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20648,6 +24779,12 @@
"value" : "Enregistrer la configuration"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "구성 저장"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20664,6 +24801,12 @@
"value" : "Réduire l’échelle"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "축소"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20680,6 +24823,12 @@
"value" : "Doubler l’échelle"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "2배 확대"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20696,11 +24845,23 @@
"state" : "translated",
"value" : "Échelle :"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확대:"
+ }
}
}
},
"Screen Assistant" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크린 어시스턴트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20711,6 +24872,12 @@
},
"Screen Assistant feature is disabled" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크린 어시스턴트 기능 비활성화 됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20727,6 +24894,12 @@
"value" : "Assistant d’écran :"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크린 어이스턴트:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20737,6 +24910,12 @@
},
"Screen Padding: %lldpx" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 여백: %lldpx"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -20747,6 +24926,12 @@
},
"Screen Recording" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "화면 녹과"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20763,6 +24948,12 @@
"value" : "Options de capture d’écran"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캡처 옵션"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20779,6 +24970,12 @@
"value" : "Format de la capture d’écran"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캡처 유형"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20791,6 +24988,12 @@
"comment" : "A hint text that appears when scrolling horizontally in the control palette.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크롤"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20799,11 +25002,28 @@
}
}
},
- "Scrollback" : {
+ "Scroll device name in HUD" : {
+ },
+ "Scrollback" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크롤백"
+ }
+ }
+ }
},
"Scrollback lines" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스크롤백 줄 수"
+ }
+ }
+ }
},
"Search clipboard..." : {
"localizations" : {
@@ -20813,6 +25033,12 @@
"value" : "Rechercher dans le presse-papiers…"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "클립보드 검색..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20835,6 +25061,12 @@
"value" : "Rechercher des couleurs…"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 검색..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20847,6 +25079,12 @@
"comment" : "A placeholder text for a text field used to filter through a list of extensions.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확장 검색..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20859,6 +25097,12 @@
"comment" : "A placeholder text for a search bar in the note list view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "메모 검색..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20871,6 +25115,12 @@
"comment" : "A placeholder text for a search bar in the settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "검색 설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20887,6 +25137,12 @@
"value" : "Rechercher…"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "검색…"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20910,6 +25166,12 @@
"value" : "secondes"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "초"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -20926,6 +25188,12 @@
"state" : "translated",
"value" : "Secondes"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "초"
+ }
}
}
},
@@ -20937,6 +25205,12 @@
"value" : "Segmenté"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "세그먼트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20947,6 +25221,12 @@
},
"Select a color to view details" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "세부 정보를 보려면 색상을 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20959,6 +25239,12 @@
"comment" : "A description below the option to select a custom timer sound.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머가 종료될 때 재생할 사용자 지정 사운드를 선택하세요. 지원되는 형식은 MP3, M4A, WAV, AIFF입니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20975,6 +25261,12 @@
"value" : "Sélectionner des calendriers"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 선택"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -20987,6 +25279,12 @@
"comment" : "A description below the header that instructs users to select one or more profiles to customize their experience.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "하나 이상의 프로필을 선택하여 사용자 환경을 맞춤 설정하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21205,6 +25503,12 @@
"value" : "Sélectionnée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선택됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21321,13 +25625,29 @@
"state" : "translated",
"value" : "Sensibilité"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "감도"
+ }
}
}
},
+ "Separate Tab" : {
+ "comment" : "Display name for the clipboard display mode option to open the clipboard in a separate tab.",
+ "isCommentAutoGenerated" : true
+ },
"Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left." : {
"comment" : "A description of the \"Separate Tab\" clipboard display mode.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'별도 탭' 모드는 복사된 항목과 메모를 하나의 뷰로 통합합니다. 두 기능이 모두 활성화된 경우 메모는 오른쪽에, 클립보드는 왼쪽에 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21358,6 +25678,12 @@
"value" : "Session · ↓ %1$@ · ↑ %2$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "세션 · ↓ %1$@ · ↑ %2$@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21371,6 +25697,12 @@
}
}
}
+ },
+ "Session Avg" : {
+
+ },
+ "Session Totals" : {
+
},
"Set" : {
"localizations" : {
@@ -21380,6 +25712,12 @@
"value" : "Définir"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21487,11 +25825,20 @@
}
}
}
+ },
+ "Settings icon in notch" : {
+
},
"Settings…" : {
"comment" : "A command that shows the settings window.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21601,11 +25948,26 @@
}
},
"Shell" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "셸"
+ }
+ }
+ }
},
"Shell path" : {
"comment" : "A setting option for the path to the shell to use in the terminal",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Shell 경로"
+ }
+ }
+ }
},
"Shortcuts" : {
"localizations" : {
@@ -21706,9 +26068,14 @@
}
}
}
+ },
+ "Show All Color Formats" : {
+
+ },
+ "Show AQI widget" : {
+
},
"Show battery indicator" : {
- "extractionState" : "stale",
"localizations" : {
"ar" : {
"stringUnit" : {
@@ -21807,6 +26174,30 @@
}
}
}
+ },
+ "Show battery percentage" : {
+
+ },
+ "Show battery percentage text in HUD" : {
+
+ },
+ "Show Bluetooth battery" : {
+
+ },
+ "Show Bluetooth device connections" : {
+
+ },
+ "Show calendar" : {
+
+ },
+ "Show Caps Lock Indicator" : {
+
+ },
+ "Show Caps Lock label" : {
+
+ },
+ "Show Character Count" : {
+
},
"Show charging indicator" : {
"extractionState" : "stale",
@@ -21823,6 +26214,12 @@
"value" : "Afficher l’indicateur de charge"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "충전 표시기 보기"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -21830,6 +26227,15 @@
}
}
}
+ },
+ "Show charging percentage" : {
+
+ },
+ "Show charging status" : {
+
+ },
+ "Show Clipboard Icon" : {
+
},
"Show Color History" : {
"localizations" : {
@@ -21839,6 +26245,12 @@
"value" : "Afficher l’historique de couleur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 기록 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21846,9 +26258,18 @@
}
}
}
+ },
+ "Show Color Picker Icon" : {
+
},
"Show Color Picker Panel" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택기 패널 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21960,6 +26381,12 @@
},
"Show countdown" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "카운트다운 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21983,6 +26410,12 @@
"value" : "Afficher la vitesse de téléchargement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다운로드 진행도 보기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -21998,20 +26431,58 @@
}
},
"Show event after it starts" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시작된 후의 일정 표시"
+ }
+ }
+ }
+ },
+ "Show event for entire duration" : {
},
"Show events from all calendars" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모든 캘린더의 일정 표시"
+ }
+ }
+ }
},
"Show events within the next" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다음 기간 내의 일정 표시"
+ }
+ }
+ }
},
"Show extension tabs" : {
"comment" : "Label for a toggle that enables or disables the display of tabs in notch experiences.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "확장 탭 표시"
+ }
+ }
+ }
},
"Show floating pause/stop controls" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "플로팅 일시 정지/중단 제어기 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22025,11 +26496,29 @@
}
}
}
+ },
+ "Show Focus as brief toast" : {
+
+ },
+ "Show Focus Indicator" : {
+
+ },
+ "Show Focus Label" : {
+
+ },
+ "Show focus widget" : {
+
},
"Show full event titles" : {
"comment" : "A toggle that shows or hides the full event titles in the calendar view",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체 이벤트 제목 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22037,6 +26526,33 @@
}
}
}
+ },
+ "Show location label" : {
+
+ },
+ "Show lock screen media panel" : {
+
+ },
+ "Show lock screen reminder" : {
+
+ },
+ "Show lock screen timer" : {
+
+ },
+ "Show lock screen timer widget" : {
+
+ },
+ "Show lock screen weather" : {
+
+ },
+ "Show media app icon" : {
+
+ },
+ "Show media controls in Dynamic Island" : {
+
+ },
+ "Show next calendar event" : {
+
},
"Show on a specific display" : {
"localizations" : {
@@ -22237,9 +26753,18 @@
}
}
}
+ },
+ "Show panel border" : {
+
},
"Show Percentage" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "퍼센트 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22247,11 +26772,26 @@
}
}
}
+ },
+ "Show percentages beside progress bars" : {
+
+ },
+ "Show power status icons" : {
+
+ },
+ "Show power status notifications" : {
+
},
"Show preset list in timer tab" : {
"comment" : "A toggle that lets users decide whether to show a list of presets in the timer tab.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 탭에 프리셋 목록 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22262,6 +26802,12 @@
},
"Show progress" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "진행도 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22269,6 +26815,9 @@
}
}
}
+ },
+ "Show Recording Indicator" : {
+
},
"Show shuffle and repeat buttons" : {
"extractionState" : "stale",
@@ -22375,6 +26924,12 @@
"comment" : "A toggle that enables showing sneak peek when the currently playing track changes.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "재생 상태 변경 시 미리보기 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22382,11 +26937,23 @@
}
}
}
+ },
+ "Show start time after event begins" : {
+
+ },
+ "Show sunrise time" : {
+
},
"Show the active Focus name inside the indicator." : {
"comment" : "A description of why the \"Show Focus Label\" toggle is disabled when the \"Show Focus as brief toast\" toggle is enabled.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "표시기 내부에 집중 모드 이름 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22394,9 +26961,18 @@
}
}
}
+ },
+ "Show time remaining" : {
+
},
"Show timer name" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 이름 표시"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22407,6 +26983,12 @@
},
"Shows green camera icon and yellow microphone icon when in use. Uses event-driven CoreAudio and CoreMediaIO APIs." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용 중일 때 초록색 카메라 아이콘과 노란색 마이크 아이콘을 표시합니다. 이벤트 기반 CoreAudio 및 CoreMediaIO API를 사용합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22415,6 +26997,14 @@
}
}
},
+ "Shows screen assistant as a dropdown attached to the AI button" : {
+ "comment" : "Description of the screen assistant display mode option that shows the screen assistant as a dropdown attached to the AI button.",
+ "isCommentAutoGenerated" : true
+ },
+ "Shows screen assistant in a floating panel near the notch" : {
+ "comment" : "Description of the screen assistant display mode option that shows the screen assistant in a floating panel near the notch.",
+ "isCommentAutoGenerated" : true
+ },
"Shows the model's reasoning process before the final answer" : {
"localizations" : {
"fr" : {
@@ -22423,6 +27013,12 @@
"value" : "Afficher le processus de réflexion du modèle avant la réponse."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "최종 답변을 제공하기 전 모델의 추론 과정을 표시합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22439,6 +27035,12 @@
},
"Shows the system Clock timer in the notch when available. Requires Accessibility permission to read the status item." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용 가능한 경우 시스템 '시계' 앱의 타이머를 노치에 표시합니다. 상태 항목을 읽으려면 접근성 권한이 필요합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22448,7 +27050,14 @@
}
},
"Simple and minimal interface with just the essentials for everyday tasks." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "일상적인 작업에 꼭 필요한 핵심 기능만 갖춘 심플하고 미니멀한 인터페이스입니다."
+ }
+ }
+ }
},
"Size & Scale" : {
"extractionState" : "stale",
@@ -22459,6 +27068,12 @@
"value" : "Taille et échelle"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "크기 및 배율"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -22469,6 +27084,12 @@
},
"Size: %lldpx" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "크기: %lldpx"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22481,6 +27102,12 @@
"comment" : "A section header that lists the skip behaviour options.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "건너뛰기 버튼"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22489,6 +27116,10 @@
}
}
},
+ "Skip forward or backward by ten seconds" : {
+ "comment" : "Description of a music skip behavior option.",
+ "isCommentAutoGenerated" : true
+ },
"Slider color" : {
"localizations" : {
"ar" : {
@@ -22588,11 +27219,20 @@
}
}
}
+ },
+ "Smooth color transitions" : {
+
},
"Smooth transitions blend Green (0–60%), Yellow (60–85%), and Red (85–100%) through the entire fill." : {
"comment" : "A description of how the color-coding feature works.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체 채우기 영역에서 초록색(0~60%), 노란색(60~85%), 빨간색(85~100%)이 부드럽게 혼합되어 표시됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22603,6 +27243,12 @@
},
"Smooth transitions blend Green (0–60%), Yellow (60–85%), and Red (85–100%) through the entire fill. Adjust gradient behavior from Controls › Dynamic Island." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전체 채우기 영역에서 초록색(0~60%), 노란색(60~85%), 빨간색(85~100%)이 부드럽게 혼합되어 표시됩니다. '제어기 › Dynamic Island'에서 그라데이션 동작을 조정할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22615,6 +27261,12 @@
"comment" : "A label describing the duration of the \"sneak peek\" feature in the calendar settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "살짝 보기 시간"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22828,6 +27480,12 @@
"extractionState" : "stale",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미니멀리즘 모드에서는 '살짝 보기' 스타일이 '표준'으로 고정됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -22938,6 +27596,12 @@
},
"Solid colour" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "든삭"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23054,9 +27718,19 @@
"state" : "translated",
"value" : "Vitesse:"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "속도:"
+ }
}
}
},
+ "Spotify" : {
+ "comment" : "Spotify media controller type.",
+ "isCommentAutoGenerated" : true
+ },
"Square" : {
"localizations" : {
"ar" : {
@@ -23157,18 +27831,54 @@
}
}
},
- "Standard" : {
+ "SS" : {
+ },
+ "Standard" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "표준"
+ }
+ }
+ }
},
"Standard Notch" : {
"comment" : "Text for the \"Standard Notch\" option in the external display style picker.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "표준 노치"
+ }
+ }
+ }
},
"Standard notch media controls are hidden while this toggle is off." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 토글이 꺼져 있는 동안에는 표준 노치 미디어 제어기가 숨겨집니다."
+ }
+ }
+ }
},
"Standard notch media controls are hidden. Re-enable the toggle above to restore them." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "표준 노치 미디어 제어기가 숨겨져 있습니다. 다시 표시하려면 위의 토글을 다시 활성화하세요."
+ }
+ }
+ }
+ },
+ "Standard previous/next track controls" : {
+ "comment" : "Description of the music skip behavior option to use standard previous/next track controls.",
+ "isCommentAutoGenerated" : true
},
"Start" : {
"localizations" : {
@@ -23178,6 +27888,12 @@
"value" : "Démarrer"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23200,6 +27916,12 @@
"value" : "Commencez une conversation pour voir votre historique"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "대화를 시작하면 여기에서 대화 기록을 확인할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23216,6 +27938,12 @@
"value" : "Commencer à "
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23228,6 +27956,12 @@
"comment" : "A button label that starts a custom timer.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자 지정 타이머 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23244,6 +27978,12 @@
"value" : "Lancer le minuteur de démo"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "데모 타이머 시작:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23260,6 +28000,12 @@
"value" : "Commencer le suivi"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23270,6 +28016,12 @@
},
"Start picking colors to build your history" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "색상 선택을 시작하여 기록을 쌓아보세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23286,6 +28038,12 @@
"value" : "Commencer l’enregistrement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화 시작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23298,6 +28056,12 @@
"comment" : "A placeholder text shown when a note's content is empty.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이핑 시작..."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23308,6 +28072,12 @@
},
"Starts a 5-minute demo timer to test the timer live activity feature. Only works when timer feature is enabled." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 실시간 현황 기능을 테스트하기 위한 5분 데모 타이머를 시작합니다. 이 기능은 타이머 기능이 활성화된 경우에만 작동합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23324,6 +28094,12 @@
"value" : "Statistiques"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23340,6 +28116,12 @@
"value" : "Statistiques désactivées"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23356,6 +28138,12 @@
"state" : "translated",
"value" : "La fonctionnalité de statistiques est désactivée"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 기능 비활성화됨"
+ }
}
}
},
@@ -23367,6 +28155,12 @@
"state" : "translated",
"value" : "La fonctionnalité de statistiques est désactivée"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 기능 비활성화됨"
+ }
}
}
},
@@ -23379,6 +28173,12 @@
"value" : "Le panneau des statistiques est désactivé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 패널 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23396,6 +28196,12 @@
"value" : "Panneau des statistiques"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 패널:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23406,6 +28212,12 @@
},
"Stats update interval" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 업데이트 주기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23414,9 +28226,28 @@
}
}
},
+ "stats_resource_active" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Active"
+ }
+ }
+ }
+ },
"Status" : {
"comment" : "A label displayed next to the status indicator in the \"Third-party DDC provider\" section of the External Display Integrations settings.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태"
+ }
+ }
+ }
},
"Status & Actions" : {
"localizations" : {
@@ -23426,6 +28257,12 @@
"value" : "Actions et statut"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "상태 및 동작"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23440,7 +28277,14 @@
"shouldTranslate" : false
},
"Stay organized with calendar, timer, and battery monitoring." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더, 타이머 및 배터리 모니터링 기능으로 일정을 체계적으로 관리하세요."
+ }
+ }
+ }
},
"Stop" : {
"localizations" : {
@@ -23450,6 +28294,12 @@
"value" : "Arrêter"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "중지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23472,6 +28322,12 @@
"value" : "Mettre fin à le suivi"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "모니터링 중지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23479,6 +28335,9 @@
}
}
}
+ },
+ "Stop monitoring after closing the notch" : {
+
},
"Stop recording" : {
"localizations" : {
@@ -23488,6 +28347,12 @@
"value" : "Mettre fin à l’enregisterement"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "녹화 중지"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23554,8 +28419,8 @@
},
"ko" : {
"stringUnit" : {
- "state" : "needs_review",
- "value" : "중지 됨"
+ "state" : "translated",
+ "value" : "중지됨"
}
},
"pl" : {
@@ -23595,13 +28460,30 @@
}
}
}
+ },
+ "Storage Devices" : {
+
},
"Student" : {
"comment" : "Name of a user profile for a student.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "학생"
+ }
+ }
+ }
},
"Style" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "스타일"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23620,6 +28502,12 @@
"comment" : "A view representing the sunrise time, displayed in a horizontal stack with an icon and the time itself.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "일출 시간: %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23737,6 +28625,12 @@
"value" : "Supporte la réfléxion"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "추론 모드 지원"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23768,6 +28662,12 @@
"value" : "L’espace d’échange est désactivé sur ce système."
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Swap이 시스템에 의해 비활성화됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23786,6 +28686,12 @@
"value" : "Système"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시스템"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23894,8 +28800,18 @@
}
}
},
- "System Monospaced" : {
+ "System memory pressure is nominal." : {
+ },
+ "System Monospaced" : {
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시스템 고정폭"
+ }
+ }
+ }
},
"System Performance Monitor" : {
"extractionState" : "stale",
@@ -23905,12 +28821,26 @@
"state" : "translated",
"value" : "Suivi des Performances Système"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시스템 성능 모니터"
+ }
}
}
},
"Tab" : {
"comment" : "Name of the \"Tab\" display mode.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "탭"
+ }
+ }
+ }
},
"Take area screenshot" : {
"localizations" : {
@@ -23920,6 +28850,12 @@
"value" : "Prendre une capture d’écran de zone"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "선택 부분 캡처"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23933,9 +28869,18 @@
}
}
}
+ },
+ "Temperature" : {
+
},
"Temperature unit" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "온도 단위"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23946,31 +28891,76 @@
},
"Terminal" : {
"comment" : "The title of the settings view related to the terminal.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "shouldTranslate" : false
},
"Terminal feature is disabled" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Terminal 기능 비활성화됨"
+ }
+ }
+ }
},
"Terminal is disabled" : {
"comment" : "A message displayed when the terminal feature is disabled.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Terminal 비활성화됨"
+ }
+ }
+ }
},
"Terminal opacity" : {
"comment" : "A label displayed above a slider that controls the opacity of the terminal view",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "터미널 투명도"
+ }
+ }
+ }
},
"Text" : {
"comment" : "Name of a clipboard item type that contains plain text.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "텍스트"
+ }
+ }
+ }
},
"TheDynamicIsland" : {
"shouldTranslate" : false
},
"These controls mirror the Lock Screen tab so you can tune the media overlay while focusing on playback settings." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 제어기는 '잠금 화면' 탭과 연동되어 있어, 재생 설정에 집중하면서도 미디어 오버레이를 세밀하게 조정할 수 있습니다."
+ }
+ }
+ }
},
"These controls sit beside the notch while a timer runs. They require the timer name to stay hidden for spacing." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 제어기는 타이머가 작동하는 동안 노치 옆에 표시됩니다. 공간 확보를 위해 타이머 이름은 표시되지 않습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23987,6 +28977,12 @@
},
"These indicators appear in the notch when apps are using your camera or microphone, matching macOS's native privacy indicators." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "앱이 카메라 또는 마이크를 사용 중일 때 노치에 표시기가 나타나며, 이는 macOS의 기본 개인정보 보호 표시기와 동일하게 작동합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -23999,6 +28995,12 @@
"comment" : "A footer text that explains the purpose of the \"Global Settings\" section in the Extensions settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AtollExtensionKit을 사용하는 서드파티 앱은 실시간 현황, 잠금 화면 위젯 및 전용 노치 경험을 표시할 수 있습니다. 위에서 기능을 켜거나 끄고, 아래에서 개별 앱 권한을 관리하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24011,6 +29013,12 @@
"comment" : "A footer description for the custom timer settings, explaining their purpose.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "설정한 시간은 빠른 실행을 위해 타이머 팝오버의 '사용자 지정' 옵션에 적용됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24020,10 +29028,23 @@
}
},
"This is optional. You can change it any time from the menu bar." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이 설정은 선택 사항입니다. 언제든지 메뉴 막대에서 변경할 수 있습니다."
+ }
+ }
+ }
},
"This permanently removes every saved note and its attachments." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "저장된 모든 메모와 첨부 파일이 영구적으로 삭제됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24042,6 +29063,12 @@
"comment" : "A message displayed when they clear their clipboard history.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 탭에 저장된 모든 클립보드 항목을 삭제합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24049,6 +29076,9 @@
}
}
}
+ },
+ "Tiler" : {
+
},
"Time Range" : {
"extractionState" : "stale",
@@ -24058,6 +29088,12 @@
"state" : "translated",
"value" : "Période de temps"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시간 범위"
+ }
}
}
},
@@ -24169,6 +29205,12 @@
"value" : "Minuteur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24181,6 +29223,12 @@
"comment" : "A picker that lets the user choose how the timer controls are displayed.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 제어기 표시 방식"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24197,6 +29245,12 @@
"value" : "Minuteur désactivé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 비활성화"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24213,6 +29267,12 @@
"value" : "Fonctionnalité du Minuteur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 기능"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24229,6 +29289,12 @@
"value" : "La fonctionnalité du minuteur est désactivée"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 비활성화 됨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24241,6 +29307,12 @@
"comment" : "A label displayed above a picker for selecting the material of the timer glass.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 글래스 Material"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -24253,6 +29325,12 @@
"comment" : "A segment control that lets the user choose between different customization modes for the timer glass.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 리퀴드 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -24265,6 +29343,12 @@
"comment" : "A section header in the timer settings view, describing timer presets.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 프리셋"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24281,6 +29365,12 @@
"value" : "Son du Minuteur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 소리"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24293,6 +29383,12 @@
"comment" : "A label displayed above the user's timer surface.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 표면"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24303,6 +29399,12 @@
},
"Timer tint" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 틴트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24315,6 +29417,12 @@
"comment" : "A section header for the timer widget settings.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24325,6 +29433,12 @@
},
"Timer widget variant" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "타이머 위젯 유형"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24337,6 +29451,12 @@
"comment" : "A label for the title input field in the note editor.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "제목"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24403,8 +29523,8 @@
},
"ko" : {
"stringUnit" : {
- "state" : "needs_review",
- "value" : "노치 열기 토글:"
+ "state" : "translated",
+ "value" : "노치 토글:"
}
},
"pl" : {
@@ -24547,12 +29667,26 @@
},
"Toggle Terminal Tab:" : {
"comment" : "Name for a keyboard shortcut that toggles the terminal tab in the notch.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "토글 Terminal 탭:"
+ }
+ }
+ }
},
"Toggle the Dynamic Island open or closed from anywhere." : {
"comment" : "A description of the \"Toggle Navigation\" keyboard shortcut.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "어디서나 Dynamic Island를 열거나 닫을 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24560,6 +29694,12 @@
}
}
}
+ },
+ "Top Processes" : {
+
+ },
+ "Total" : {
+
},
"Total · %@" : {
"comment" : "A label displaying the total storage capacity of a disk device. The argument is the total storage capacity of the disk device.",
@@ -24580,6 +29720,10 @@
},
"shouldTranslate" : false
},
+ "Track Skip" : {
+ "comment" : "Display name for the \"Track Skip\" music skip behavior.",
+ "isCommentAutoGenerated" : true
+ },
"Transform" : {
"extractionState" : "stale",
"localizations" : {
@@ -24589,6 +29733,12 @@
"value" : "Transformez"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "변형"
+ }
+ },
"ru" : {
"stringUnit" : {
"state" : "translated",
@@ -24605,6 +29755,12 @@
"state" : "translated",
"value" : "Reprenez le contrôle sur votre encoche"
}
+ },
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치를 나만의 스타일로 완성해 보세요."
+ }
}
}
},
@@ -24616,6 +29772,12 @@
"value" : "Essayez d’ajuster vos termes de recherche"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "검색어를 변경해 보세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24632,6 +29794,12 @@
"value" : "Essayez d’autres termes de recherche"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "다른 검색어로 시도해 보세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24641,12 +29809,25 @@
}
},
"Turn off 'Show event for entire duration' to use the post-start duration option." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "시작 후 시간 옵션을 사용하려면 '전체 시간 동안 일정 표시'를 끄세요."
+ }
+ }
+ }
},
"Turn on customizable controls to rearrange media buttons." : {
"comment" : "A description of the feature that allows users to rearrange the order of media buttons.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 버튼을 재배열하려면 사용자 지정 제어기를 켜세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24665,6 +29846,12 @@
"comment" : "A description of why the user can disable the \"Hide all-day events\" toggle.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "노치 캘린더 및 미리 알림 실시간 현황에 종일 일정을 포함하려면 이 기능을 끄세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24783,6 +29970,12 @@
"value" : "Mode UI"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "UI 모드"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -24894,7 +30087,15 @@
},
"Unknown" : {
"comment" : "Description of a calendar authorization status that is not explicitly listed.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "알수없음"
+ }
+ }
+ }
},
"Unlock advanced features and improve your experience. Upgrade now for more customizations!" : {
"localizations" : {
@@ -25098,10 +30299,27 @@
},
"Unplugged" : {
"comment" : "Text displayed in a notification when the device is plugged in.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "전원 분리됨"
+ }
+ }
+ }
+ },
+ "Up" : {
+
},
"Update interval" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "업데이트 간격"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25125,6 +30343,12 @@
"value" : "Modifier le minuteur"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "업데이트 타이머"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25251,10 +30475,24 @@
}
},
"shouldTranslate" : false
+ },
+ "Uploaded" : {
+
+ },
+ "Uptime" : {
+
},
"URL" : {
"comment" : "Name of a clipboard item type that represents a URL.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "URL"
+ }
+ }
+ }
},
"Usage" : {
"comment" : "A label displayed above the CPU usage statistics.",
@@ -25266,6 +30504,12 @@
"value" : "Utilisation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용량"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25290,6 +30534,12 @@
"value" : "Répartition de l’utilisation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용량 분석"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25297,9 +30547,18 @@
}
}
}
+ },
+ "Use accent color" : {
+
},
"Use Accent Color" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "강조 색상 사용"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25307,10 +30566,27 @@
}
}
}
+ },
+ "Use circular battery indicator" : {
+
+ },
+ "Use colored gauges" : {
+
},
"Use DevTools" : {
"comment" : "One option in the confirmation dialog in the `OnboardingView` that lets the user choose to use the developer tools for focus monitoring.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개발도구 사용"
+ }
+ }
+ }
+ },
+ "Use MacBook icon when on battery" : {
+
},
"Use music visualizer spectrogram" : {
"localizations" : {
@@ -25411,11 +30687,20 @@
}
}
}
+ },
+ "Use simpler close animation" : {
+
},
"Use the Media tab to configure sneak peek, lyrics, and floating media controls." : {
"comment" : "A footer for the \"Media Live Activity\" section, explaining how to configure the media controls.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "미디어 탭에서 미리보기, 가사 및 플로팅 미디어 제어기를 설정할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25426,6 +30711,12 @@
},
"Use the sliders below to pick unique Apple liquid-glass variants for each widget." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "아래의 슬라이더를 사용하여 각 위젯의 고유한 Apple 리퀴드 글래스 스타일을 선택하세요."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25436,7 +30727,15 @@
},
"Use without DevTools" : {
"comment" : "An option in the onboarding flow that lets users choose to use focus detection without the option provided by the developer tools.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "개발도구 없이 사용"
+ }
+ }
+ }
},
"Used" : {
"comment" : "A label describing the percentage of memory that is currently in use.",
@@ -25448,6 +30747,12 @@
"value" : "Utilisé"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용 중"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25472,6 +30777,12 @@
"value" : "Utilisé · %@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용 중 · %@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25479,9 +30790,18 @@
}
}
}
+ },
+ "User" : {
+
},
"Uses event-driven private API for real-time screen recording detection" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "이벤트 기반 프라이빗 API를 사용하여 실시간으로 화면 기록 상태를 감지합니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25494,6 +30814,12 @@
"comment" : "A description of the frosted blur treatment when glass mode is enabled.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "글래스 모드가 활성화되어 있는 동안에는 프로스티드 블러 효과가 적용됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
@@ -25502,6 +30828,10 @@
}
}
},
+ "Utilities" : {
+ "comment" : "Display name for the Utilities settings tab group.",
+ "isCommentAutoGenerated" : true
+ },
"Utilization" : {
"comment" : "A label displayed alongside the utilization percentage in the GPU detail view.",
"isCommentAutoGenerated" : true,
@@ -25512,6 +30842,12 @@
"value" : "Utilisation"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "점유율"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25732,7 +31068,14 @@
}
},
"Vertical offset" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "수직 오프셋"
+ }
+ }
+ }
},
"Vertical:" : {
"extractionState" : "stale",
@@ -25757,6 +31100,9 @@
}
},
"shouldTranslate" : false
+ },
+ "Video" : {
+
},
"View on GitHub: th-ch/youtube-music" : {
"localizations" : {
@@ -25862,6 +31208,12 @@
"comment" : "A button that sets the preview to show a volume OSD.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "음량"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25878,6 +31230,12 @@
"value" : "ATH du volume"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "음량 HUD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25890,6 +31248,12 @@
"comment" : "A toggle that enables or disables the volume OSD",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "음량 OSD"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25900,12 +31264,29 @@
},
"W " : {
"comment" : "Label for the write data point in the disk usage graph.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "W"
+ }
+ }
+ }
+ },
+ "Warning" : {
+
},
"Weather" : {
"comment" : "A label and its accompanying text displayed in a lock screen panel.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25922,6 +31303,12 @@
},
"Weather data provider" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨 데이터 공급자"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25934,6 +31321,12 @@
"comment" : "A section header in the Lock Screen Settings view.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨 위젯"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25951,6 +31344,12 @@
"value" : "Weather: %1$@ %2$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "날씨: %1$@ %2$@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -25974,6 +31373,12 @@
"value" : "Weather: %1$@ %2$@ in %3$@"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%3$@ 날씨: %1$@ %2$@"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26189,10 +31594,23 @@
}
},
"When bold-as-bright is off, bold text uses a heavier font weight instead of bright ANSI colors." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "'볼드체를 밝은 색으로 표시'가 꺼져 있으면, 볼드체 텍스트에 밝은 ANSI 색상 대신 더 두꺼운 폰트 굵기가 사용됩니다."
+ }
+ }
+ }
},
"When disabled, all keyboard shortcuts will be inactive. You can still use the UI controls." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "비활성화하면 모든 키보드 단축키를 사용할 수 없습니다. UI 제어기는 계속 사용할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26208,12 +31626,25 @@
}
},
"When disabled, the notch music player stays visible with placeholder metadata even when playback is inactive." : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "비활성화시, 재생 중이 아닐 때도 기본 정보가 표시된 노치 음악 플레이어가 계속 유지됩니다."
+ }
+ }
+ }
},
"When enabled, Focus appears briefly (on/off) and then collapses instead of staying visible." : {
"comment" : "A help text for the setting that allows the focus indicator to collapse instead of staying visible.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화 시, 집중 모드가 계속 표시되는 대신 잠깐 나타났다가(켜짐/꺼짐) 축소됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26230,6 +31661,12 @@
},
"When enabled, stats monitoring stops a few seconds after the notch closes." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화 시, 노치가 닫히고 몇 초 후에 상태 모니터링이 중지됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26240,10 +31677,24 @@
},
"When enabled, the notch slides up and hides on external (non-notch) displays until you hover over it." : {
"comment" : "A description of the feature that hides the notch on non-notch displays.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화 시, 노치가 없는 외부 디스플레이에서는 마우스를 올릴 때까지 노치가 위로 슬라이드되어 숨겨집니다."
+ }
+ }
+ }
},
"When enabled, the Stats tab will display real-time system performance graphs. This feature requires system permissions and may use additional battery." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "활성화 시, 통계 탭에 실시간 시스템 성능 그래프가 표시됩니다. 이 기능은 시스템 권한이 필요하며 배터리를 추가로 소모할 수 있습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26259,12 +31710,25 @@
}
},
"White" : {
-
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "흰색"
+ }
+ }
+ }
},
"Widget Updates" : {
"comment" : "A label describing the number of times the extension has updated its widget.",
"isCommentAutoGenerated" : true,
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "위젯 업데이트"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26288,6 +31752,12 @@
"value" : "Largueur :"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "너비:"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26298,6 +31768,12 @@
},
"Width: %lldpx" : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "너비: %lldpx"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26305,9 +31781,18 @@
}
}
}
+ },
+ "Wired" : {
+
},
"With %lld graphs enabled, the Dynamic Island will expand horizontally to accommodate all graphs in a single row." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "그래프 %lld개가 활성화되면 모든 그래프를 한 줄에 표시할 수 있도록 Dynamic Island가 가로로 확장됩니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26318,7 +31803,15 @@
},
"Works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version." : {
"comment" : "Description of a media controller type when it works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version.",
- "isCommentAutoGenerated" : true
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "브라우저를 포함한 대부분의 미디어 앱에서 재생 중인 항목을 감지합니다. 참고: 이 기능은 향후 macOS 버전에서 제거될 수 있습니다."
+ }
+ }
+ }
},
"Write" : {
"comment" : "A label for the write section of the disk overview.",
@@ -26330,6 +31823,12 @@
"value" : "Écriture"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "쓰기"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26343,6 +31842,9 @@
}
}
}
+ },
+ "Written" : {
+
},
"You" : {
"localizations" : {
@@ -26352,6 +31854,12 @@
"value" : "Vous"
}
},
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "당신"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26562,6 +32070,12 @@
},
"Your calendar data is only used to show your events and is never shared." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "캘린더 데이터는 오직 일정을 표시하는 용도로만 사용되며 절대로 외부와 공유되지 않습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26572,6 +32086,12 @@
},
"Your camera is never used without your consent, and nothing is recorded or stored." : {
"localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "사용자의 동의 없이는 카메라를 절대로 사용하지 않으며, 어떠한 내용도 녹화하거나 저장하지 않습니다."
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
@@ -26582,6 +32102,18 @@
},
"Your support funds software development learning for students in 9th–12th grade." : {
"comment" : "A footer note explaining the app's funding.",
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "ko" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "여러분의 후원금은 9~12학년 학생들의 소프트웨어 개발 교육을 지원하는 데 사용됩니다."
+ }
+ }
+ }
+ },
+ "Youtube Music" : {
+ "comment" : "Spotify music service.",
"isCommentAutoGenerated" : true
},
"YouTube Music requires this third-party app to be installed: " : {
diff --git a/DynamicIsland/MediaControllers/AppleMusicController.swift b/DynamicIsland/MediaControllers/AppleMusicController.swift
index f832199..554b3ef 100644
--- a/DynamicIsland/MediaControllers/AppleMusicController.swift
+++ b/DynamicIsland/MediaControllers/AppleMusicController.swift
@@ -20,9 +20,19 @@
* along with this program. If not, see .
*/
-import Foundation
+import AppKit
import Combine
-import SwiftUI
+import Foundation
+
+private struct ITunesSearchResponse: Decodable {
+ let results: [ITunesTrack]
+}
+
+private struct ITunesTrack: Decodable {
+ let trackName: String?
+ let collectionName: String?
+ let artworkUrl100: String?
+}
class AppleMusicController: MediaControllerProtocol {
// MARK: - Properties
@@ -30,17 +40,23 @@ class AppleMusicController: MediaControllerProtocol {
bundleIdentifier: "com.apple.Music",
playbackRate: 1
)
-
+
var playbackStatePublisher: AnyPublisher {
$playbackState.eraseToAnyPublisher()
}
-
+
var isWorking: Bool {
return true // AppleMusic controller always works
}
-
+
+ /// Minimum byte count for artwork data to be considered valid. Anything
+ /// smaller is likely an empty descriptor or error string, not image data.
+ private static let minimumArtworkSize = 16
+
private var notificationTask: Task?
-
+ private var lastCatalogArtworkKey: String?
+ private var cachedCatalogArtwork: Data?
+
// MARK: - Initialization
init() {
setupPlaybackStateChangeObserver()
@@ -122,7 +138,7 @@ class AppleMusicController: MediaControllerProtocol {
guard let descriptor = try? await fetchPlaybackInfoAsync() else { return }
guard descriptor.numberOfItems >= 8 else { return }
var updatedState = self.playbackState
-
+
updatedState.isPlaying = descriptor.atIndex(1)?.booleanValue ?? false
updatedState.title = descriptor.atIndex(2)?.stringValue ?? "Unknown"
updatedState.artist = descriptor.atIndex(3)?.stringValue ?? "Unknown"
@@ -132,91 +148,108 @@ class AppleMusicController: MediaControllerProtocol {
updatedState.isShuffled = descriptor.atIndex(7)?.booleanValue ?? false
let repeatModeValue = descriptor.atIndex(8)?.int32Value ?? 0
updatedState.repeatMode = RepeatMode(rawValue: Int(repeatModeValue)) ?? .off
- updatedState.artwork = descriptor.atIndex(9)?.data as Data?
+
+ // AppleScript returns artwork data for library tracks. For streamed
+ // content not in the library it returns an empty descriptor, so we
+ // fall back to the iTunes Search API to fetch artwork by metadata.
+ if let artworkData = descriptor.atIndex(9)?.data as Data?,
+ artworkData.count > Self.minimumArtworkSize {
+ updatedState.artwork = artworkData
+ } else {
+ updatedState.artwork = await fetchArtworkFromCatalog(
+ title: updatedState.title, artist: updatedState.artist, album: updatedState.album
+ )
+ }
+
updatedState.lastUpdated = Date()
self.playbackState = updatedState
}
-
+
// MARK: - Private Methods
-
+
+ private func fetchArtworkFromCatalog(title: String, artist: String, album: String) async -> Data? {
+ let key = "\(title)|\(artist)|\(album)"
+
+ if key == lastCatalogArtworkKey, let cached = cachedCatalogArtwork {
+ return cached
+ }
+
+ // Search with title + artist only; including album in the query can
+ // confuse the free-text search when names overlap. We validate the
+ // album from the structured response fields instead.
+ let query = "\(title) \(artist)"
+ guard !query.trimmingCharacters(in: .whitespaces).isEmpty,
+ let encoded = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
+ let url = URL(string: "https://itunes.apple.com/search?term=\(encoded)&media=music&entity=song&limit=10")
+ else { return nil }
+
+ do {
+ let (data, _) = try await URLSession.shared.data(from: url)
+ let response = try JSONDecoder().decode(ITunesSearchResponse.self, from: data)
+ guard !response.results.isEmpty else { return nil }
+
+ let normalizedAlbum = album.lowercased()
+ let normalizedTitle = title.lowercased()
+
+ let match = response.results.first(where: {
+ $0.trackName?.lowercased() == normalizedTitle &&
+ $0.collectionName?.lowercased() == normalizedAlbum
+ }) ?? response.results.first(where: {
+ $0.collectionName?.lowercased() == normalizedAlbum
+ }) ?? response.results.first(where: {
+ $0.trackName?.lowercased() == normalizedTitle
+ }) ?? response.results.first
+
+ guard let artworkURLString = match?.artworkUrl100 else { return nil }
+
+ let highResURL = artworkURLString.replacingOccurrences(of: "100x100", with: "600x600")
+ guard let imageURL = URL(string: highResURL) else { return nil }
+
+ let (imageData, _) = try await URLSession.shared.data(from: imageURL)
+ lastCatalogArtworkKey = key
+ cachedCatalogArtwork = imageData
+ return imageData
+ } catch {
+ return nil
+ }
+ }
+
private func executeCommand(_ command: String) async {
let script = "tell application \"Music\" to \(command)"
try? await AppleScriptHelper.executeVoid(script)
}
private func fetchPlaybackInfoAsync() async throws -> NSAppleEventDescriptor? {
- if #available(macOS 26.0, *) {
- let script = """
- tell application "Music"
+ let script = """
+ tell application "Music"
+ try
+ set playerState to player state is playing
+ set currentTrackName to name of current track
+ set currentTrackArtist to artist of current track
+ set currentTrackAlbum to album of current track
+ set trackPosition to player position
+ set trackDuration to duration of current track
+ set shuffleState to shuffle enabled
+ set repeatState to song repeat
+ if repeatState is off then
+ set repeatValue to 1
+ else if repeatState is one then
+ set repeatValue to 2
+ else if repeatState is all then
+ set repeatValue to 3
+ end if
+
+ set artData to ""
try
- set playerState to player state is playing
- set currentTrackName to name of current track
- set currentTrackArtist to artist of current track
- set currentTrackAlbum to album of current track
- set trackPosition to player position
- set trackDuration to duration of current track
- set shuffleState to shuffle enabled
- set repeatState to song repeat
- if repeatState is off then
- set repeatValue to 1
- else if repeatState is one then
- set repeatValue to 2
- else if repeatState is all then
- set repeatValue to 3
- end if
-
- set artData to ""
- try
- set libraryTrack to first track of playlist "Library" whose name is currentTrackName and artist is currentTrackArtist
- set artData to data of artwork 1 of libraryTrack
- on error
- try
- set artData to data of artwork 1 of current track
- on error
- set artData to ""
- end try
- end try
-
- return {playerState, currentTrackName, currentTrackArtist, currentTrackAlbum, trackPosition, trackDuration, shuffleState, repeatValue, artData}
- on error
- return {false, "Not Playing", "Unknown", "Unknown", 0, 0, false, 0, ""}
+ set artData to raw data of artwork 1 of current track
end try
- end tell
- """
- return try await AppleScriptHelper.execute(script)
- } else {
- let script = """
- tell application "Music"
- set isRunning to true
- try
- set playerState to player state is playing
- set currentTrackName to name of current track
- set currentTrackArtist to artist of current track
- set currentTrackAlbum to album of current track
- set trackPosition to player position
- set trackDuration to duration of current track
- set shuffleState to shuffle enabled
- set repeatState to song repeat
- if repeatState is off then
- set repeatValue to 1
- else if repeatState is one then
- set repeatValue to 2
- else if repeatState is all then
- set repeatValue to 3
- end if
- try
- set artData to data of artwork 1 of current track
- on error
- set artData to ""
- end try
- return {playerState, currentTrackName, currentTrackArtist, currentTrackAlbum, trackPosition, trackDuration, shuffleState, repeatValue, artData}
- on error
- return {false, "Not Playing", "Unknown", "Unknown", 0, 0, false, 0, ""}
- end try
- end tell
- """
- return try await AppleScriptHelper.execute(script)
- }
+ return {playerState, currentTrackName, currentTrackArtist, currentTrackAlbum, trackPosition, trackDuration, shuffleState, repeatValue, artData}
+ on error
+ return {false, "Not Playing", "Unknown", "Unknown", 0, 0, false, 0, ""}
+ end try
+ end tell
+ """
+ return try await AppleScriptHelper.execute(script)
}
}
diff --git a/DynamicIsland/Providers/CalendarServiceProviding.swift b/DynamicIsland/Providers/CalendarServiceProviding.swift
index b33ae40..055de25 100644
--- a/DynamicIsland/Providers/CalendarServiceProviding.swift
+++ b/DynamicIsland/Providers/CalendarServiceProviding.swift
@@ -146,6 +146,7 @@ class CalendarService: CalendarServiceProviding {
extension CalendarModel {
init(from calendar: EKCalendar) {
self.init(
+ accountName: calendar.accountTitle,
id: calendar.calendarIdentifier,
title: calendar.title,
color: calendar.color,
@@ -267,7 +268,7 @@ extension Priority {
// MARK: - Helper Extensions
-private extension EKCalendar {
+extension EKCalendar {
var accountTitle: String {
switch source.sourceType {
case .local, .subscribed, .birthdays:
diff --git a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift
index 2b32047..4dc6eae 100644
--- a/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift
+++ b/DynamicIsland/components/LockScreen/LockScreenMusicPanel.swift
@@ -37,6 +37,7 @@ struct LockScreenMusicPanel: View {
@ObservedObject var musicManager = MusicManager.shared
@ObservedObject private var routeManager = AudioRouteManager.shared
@StateObject private var volumeModel = MediaOutputVolumeViewModel()
+ @ObservedObject private var airPlayManager = AppleMusicAirPlayManager.shared
@ObservedObject private var animator: LockScreenPanelAnimator
@State private var sliderValue: Double = 0
@State private var dragging: Bool = false
@@ -44,6 +45,8 @@ struct LockScreenMusicPanel: View {
@State private var isActive = true
@State private var isExpanded = false
@State private var isVolumeSliderVisible = false
+ @State private var isAirPlayPopoverPresented = false
+
@State private var collapseWorkItem: DispatchWorkItem?
@State private var parallaxResumeWorkItem: DispatchWorkItem?
@State private var isParallaxSuspended = false
@@ -58,6 +61,7 @@ struct LockScreenMusicPanel: View {
@Default(.showShuffleAndRepeat) private var showShuffleAndRepeat
@Default(.musicControlSlots) private var slotConfig
@Default(.musicSkipBehavior) private var musicSkipBehavior
+ @Default(.lockScreenMusicMergedAirPlayOutput) private var mergedAirPlayOutput
@Default(.enableLyrics) private var enableLyrics
@Default(.lockScreenMusicAlbumParallaxEnabled) private var lockScreenParallaxEnabled
@Default(.lockScreenMusicPanelWidth) private var collapsedPanelWidth
@@ -134,14 +138,17 @@ struct LockScreenMusicPanel: View {
}
.shadow(color: Color.black.opacity(0.3), radius: 20, x: 0, y: 10)
.contentShape(RoundedRectangle(cornerRadius: panelCornerRadius, style: .continuous))
- .animation(.spring(response: 0.48, dampingFraction: 0.82, blendDuration: 0.18), value: isExpanded)
- .animation(.spring(response: 0.45, dampingFraction: 0.85, blendDuration: 0.18), value: shouldShowVolumeSlider)
+ .animation(.easeInOut(duration: 0.28), value: isExpanded)
+ .animation(.easeInOut(duration: 0.24), value: shouldShowVolumeSlider)
.onAppear {
sliderValue = musicManager.elapsedTime
isActive = true
logPanelAppearance()
updatePanelSize(animated: false)
routeManager.refreshDevices()
+ if isAppleMusicActive {
+ Task { await airPlayManager.refreshDevices() }
+ }
logGlassState(reason: "Panel appeared")
}
.onDisappear {
@@ -163,6 +170,24 @@ struct LockScreenMusicPanel: View {
}
updatePanelSize()
}
+ .onChange(of: isVolumeSliderVisible) { _, visible in
+ if useMergedAirPlayOutput {
+ if visible && isAppleMusicActive {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ updatePanelSize()
+ }
+ .onChange(of: airPlayManager.devices) { _, _ in
+ if useMergedAirPlayOutput {
+ updatePanelSize()
+ }
+ }
+ .onChange(of: routeManager.devices) { _, _ in
+ if !useMergedAirPlayOutput {
+ updatePanelSize()
+ }
+ }
.onChange(of: enableLyrics) { _, _ in
withAnimation(.spring(response: 0.45, dampingFraction: 0.85)) {
updatePanelSize()
@@ -311,7 +336,7 @@ struct LockScreenMusicPanel: View {
private func toggleExpanded() {
let newState = !isExpanded
suspendParallaxInteraction()
- withAnimation(.spring(response: 0.5, dampingFraction: 0.82)) {
+ withAnimation(.easeInOut(duration: 0.28)) {
isExpanded = newState
}
@@ -330,7 +355,7 @@ struct LockScreenMusicPanel: View {
let workItem = DispatchWorkItem {
suspendParallaxInteraction()
- withAnimation(.spring(response: 0.5, dampingFraction: 0.85)) {
+ withAnimation(.easeInOut(duration: 0.28)) {
isExpanded = false
}
logPanelAppearance(event: "⏱️ Auto-collapsed")
@@ -433,6 +458,16 @@ struct LockScreenMusicPanel: View {
volumeSlider
.frame(maxWidth: .infinity, alignment: alignment)
.transition(.scale(scale: 0.98, anchor: .top).combined(with: .opacity))
+
+ if shouldShowAirPlay {
+ airPlaySection
+ .frame(maxWidth: .infinity, alignment: alignment)
+ .transition(.scale(scale: 0.98, anchor: .top).combined(with: .opacity))
+ } else if shouldShowRouteSelector {
+ mediaOutputDevicesSection
+ .frame(maxWidth: .infinity, alignment: alignment)
+ .transition(.scale(scale: 0.98, anchor: .top).combined(with: .opacity))
+ }
}
if enableLyrics {
@@ -442,8 +477,10 @@ struct LockScreenMusicPanel: View {
}
.frame(maxWidth: .infinity, alignment: alignment)
.padding(.top, isExpanded ? 6 : 2)
- .animation(.spring(response: 0.45, dampingFraction: 0.82), value: shouldShowVolumeSlider)
- .animation(.spring(response: 0.45, dampingFraction: 0.82), value: enableLyrics)
+ .animation(.easeInOut(duration: 0.24), value: shouldShowVolumeSlider)
+ .animation(.easeInOut(duration: 0.24), value: shouldShowAirPlay)
+ .animation(.easeInOut(duration: 0.24), value: shouldShowRouteSelector)
+ .animation(.easeInOut(duration: 0.24), value: enableLyrics)
}
private func controlsRow(alignment: Alignment, spacing: CGFloat) -> some View {
@@ -462,7 +499,7 @@ struct LockScreenMusicPanel: View {
return fallbackSlots
}
- let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl)
+ let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl, isAppleMusicActive: isAppleMusicActive)
return normalized.contains(where: { $0 != .none }) ? normalized : MusicControlButton.defaultLayout
}
@@ -541,6 +578,12 @@ struct LockScreenMusicPanel: View {
}
case .mediaOutput:
mediaOutputControlButton
+ case .airPlay:
+ if useMergedAirPlayOutput {
+ mediaOutputControlButton
+ } else {
+ standaloneAirPlayButton
+ }
case .lyrics:
controlButton(
icon: enableLyrics ? "quote.bubble.fill" : "quote.bubble",
@@ -618,6 +661,35 @@ struct LockScreenMusicPanel: View {
.accessibilityLabel("Media output")
}
+ private var standaloneAirPlayButton: some View {
+ let frameSize: CGFloat = isExpanded ? 56 : 32
+ let iconSize: CGFloat = isExpanded ? 26 : 18
+
+ return PanelControlButton(
+ icon: "airplayaudio",
+ frameSize: frameSize,
+ iconSize: iconSize,
+ iconColor: isAirPlayPopoverPresented ? .accentColor : .white.opacity(0.8),
+ backgroundOpacity: isAirPlayPopoverPresented ? 0.22 : 0.0,
+ interaction: .none,
+ symbolEffect: .replace
+ ) {
+ registerInteraction()
+ isAirPlayPopoverPresented.toggle()
+ if isAirPlayPopoverPresented {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .accessibilityLabel("AirPlay")
+ .popover(isPresented: $isAirPlayPopoverPresented, arrowEdge: .bottom) {
+ AirPlaySelectorPopover(
+ airPlayManager: airPlayManager,
+ onHoverChanged: { _ in },
+ dismiss: { isAirPlayPopoverPresented = false }
+ )
+ }
+ }
+
private func lyricsSection(alignment: Alignment) -> some View {
let line = musicManager.currentLyrics.trimmingCharacters(in: .whitespacesAndNewlines)
let transition: AnyTransition = .asymmetric(
@@ -692,6 +764,116 @@ struct LockScreenMusicPanel: View {
)
}
+ private var airPlaySection: some View {
+ accessorySectionContainer {
+ if airPlayManager.devices.isEmpty {
+ Text("No AirPlay outputs available")
+ .font(.system(size: isExpanded ? 13 : 11, weight: .medium))
+ .foregroundColor(.white.opacity(0.68))
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .padding(.vertical, 8)
+ .padding(.horizontal, 12)
+ } else {
+ ScrollView(.vertical, showsIndicators: true) {
+ VStack(spacing: 6) {
+ ForEach(airPlayManager.devices) { device in
+ VStack(spacing: 4) {
+ Button {
+ registerInteraction()
+ Task { await airPlayManager.toggleDevice(device) }
+ } label: {
+ HStack(spacing: 8) {
+ Image(systemName: device.iconName)
+ .font(.system(size: isExpanded ? 14 : 12, weight: .medium))
+ .foregroundColor(.white.opacity(0.8))
+ Text(device.name)
+ .font(.system(size: isExpanded ? 13 : 11, weight: .medium))
+ .foregroundColor(.white)
+ .lineLimit(1)
+ Spacer()
+ if device.isSelected {
+ Image(systemName: "checkmark")
+ .font(.system(size: isExpanded ? 12 : 10, weight: .bold))
+ .foregroundColor(.accentColor)
+ }
+ }
+ .padding(.vertical, 4)
+ .padding(.horizontal, 12)
+ }
+ .buttonStyle(.plain)
+
+ if device.isSelected {
+ AirPlayVolumeSlider(
+ airPlayManager: airPlayManager,
+ deviceID: device.id
+ )
+ .padding(.horizontal, 12)
+ }
+ }
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+ }
+ .frame(maxHeight: accessorySectionScrollMaxHeight)
+ }
+ }
+ .padding(.vertical, 8)
+ }
+
+ private var mediaOutputDevicesSection: some View {
+ accessorySectionContainer {
+ if routeManager.devices.isEmpty {
+ Text("No audio outputs available")
+ .font(.system(size: isExpanded ? 13 : 11, weight: .medium))
+ .foregroundColor(.white.opacity(0.68))
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .padding(.vertical, 8)
+ .padding(.horizontal, 12)
+ } else {
+ ScrollView(.vertical, showsIndicators: true) {
+ VStack(alignment: .leading, spacing: 6) {
+ ForEach(routeManager.devices) { device in
+ Button {
+ registerInteraction()
+ routeManager.select(device: device)
+ } label: {
+ HStack(spacing: 8) {
+ Image(systemName: device.iconName)
+ .font(.system(size: isExpanded ? 14 : 12, weight: .medium))
+ .foregroundColor(.white.opacity(0.82))
+ Text(device.name)
+ .font(.system(size: isExpanded ? 13 : 11, weight: .medium))
+ .foregroundColor(.white)
+ .lineLimit(1)
+ Spacer()
+ if device.id == routeManager.activeDeviceID {
+ Image(systemName: "checkmark")
+ .font(.system(size: isExpanded ? 12 : 10, weight: .bold))
+ .foregroundColor(.accentColor)
+ }
+ }
+ .padding(.vertical, 5)
+ .padding(.horizontal, 12)
+ }
+ .buttonStyle(.plain)
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+ }
+ .frame(maxHeight: accessorySectionScrollMaxHeight)
+ }
+ }
+ .padding(.vertical, 8)
+ }
+
+ private func accessorySectionContainer(@ViewBuilder content: () -> Content) -> some View {
+ content()
+ .background(
+ RoundedRectangle(cornerRadius: isExpanded ? 16 : 12, style: .continuous)
+ .fill(sliderBackgroundFill)
+ )
+ }
+
private var sliderBackgroundFill: Color {
if usesLiquidGlass {
return Color.white.opacity(0.05)
@@ -699,6 +881,26 @@ struct LockScreenMusicPanel: View {
return Color.white.opacity(0.08)
}
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
+ private var useMergedAirPlayOutput: Bool {
+ mergedAirPlayOutput && isAppleMusicActive && slotConfig.contains(where: { $0 == .mediaOutput || $0 == .airPlay })
+ }
+
+ private var shouldShowAirPlay: Bool {
+ useMergedAirPlayOutput && shouldShowVolumeSlider && !airPlayManager.devices.isEmpty
+ }
+
+ private var shouldShowRouteSelector: Bool {
+ !useMergedAirPlayOutput && shouldShowVolumeSlider
+ }
+
+ private var shouldShowAccessorySection: Bool {
+ shouldShowAirPlay || shouldShowRouteSelector
+ }
+
private var shouldShowVolumeSlider: Bool {
showMediaOutputControl && isVolumeSliderVisible
}
@@ -707,12 +909,31 @@ struct LockScreenMusicPanel: View {
sliderHeight(forExpanded: isExpanded, visible: shouldShowVolumeSlider)
}
+ private var accessorySectionScrollMaxHeight: CGFloat {
+ isExpanded ? 170 : 130
+ }
+
private var lyricsExtraHeight: CGFloat {
lyricsHeight(forExpanded: isExpanded, enabled: enableLyrics)
}
+ private var accessorySectionExtraHeight: CGFloat {
+ guard shouldShowAccessorySection else { return 0 }
+ if shouldShowAirPlay {
+ let selectedCount = airPlayManager.devices.filter(\.isSelected).count
+ let totalCount = airPlayManager.devices.count
+ let deviceRows: CGFloat = CGFloat(totalCount) * 30 + CGFloat(max(totalCount - 1, 0)) * 6
+ let sliders: CGFloat = CGFloat(selectedCount) * 34
+ return min(deviceRows + sliders + 24, accessorySectionScrollMaxHeight + 16)
+ }
+
+ let totalCount = max(routeManager.devices.count, 1)
+ let deviceRows: CGFloat = CGFloat(totalCount) * 30 + CGFloat(max(totalCount - 1, 0)) * 6
+ return min(deviceRows + 24, accessorySectionScrollMaxHeight + 16)
+ }
+
private var totalExtraHeight: CGFloat {
- sliderExtraHeight + lyricsExtraHeight
+ sliderExtraHeight + accessorySectionExtraHeight + lyricsExtraHeight
}
private func lyricsHeight(forExpanded expanded: Bool, enabled: Bool) -> CGFloat {
@@ -722,6 +943,7 @@ struct LockScreenMusicPanel: View {
private func panelAdditionalHeight(forExpanded expanded: Bool) -> CGFloat {
sliderHeight(forExpanded: expanded, visible: shouldShowVolumeSlider) +
+ accessorySectionExtraHeight +
lyricsHeight(forExpanded: expanded, enabled: enableLyrics)
}
@@ -758,9 +980,12 @@ struct LockScreenMusicPanel: View {
let newState = !isVolumeSliderVisible
if newState {
routeManager.refreshDevices()
+ if useMergedAirPlayOutput {
+ Task { await airPlayManager.refreshDevices() }
+ }
}
- withAnimation(.spring(response: 0.45, dampingFraction: 0.85)) {
+ withAnimation(.easeInOut(duration: 0.24)) {
isVolumeSliderVisible = newState
}
diff --git a/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift b/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
index c306ce3..fc57c91 100644
--- a/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
+++ b/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
@@ -876,9 +876,13 @@ private struct MinimalisticReminderDetailsView: View {
)
}
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
private var displayedSlots: [MusicControlButton] {
if showCustomControls {
- let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl)
+ let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl, isAppleMusicActive: isAppleMusicActive)
return normalized.contains(where: { $0 != .none }) ? normalized : MusicControlButton.defaultLayout
}
@@ -943,6 +947,8 @@ private struct MinimalisticReminderDetailsView: View {
}
case .mediaOutput:
MinimalisticMediaOutputButton()
+ case .airPlay:
+ MinimalisticAirPlayButton()
case .lyrics:
controlButton(
icon: enableLyrics ? "quote.bubble.fill" : "quote.bubble",
@@ -1027,6 +1033,70 @@ private struct MinimalisticReminderDetailsView: View {
}
}
+ private struct MinimalisticAirPlayButton: View {
+ @ObservedObject private var musicManager = MusicManager.shared
+ @ObservedObject private var airPlayManager = AppleMusicAirPlayManager.shared
+ @EnvironmentObject private var vm: DynamicIslandViewModel
+ @State private var isPopoverPresented = false
+ @State private var isHoveringPopover = false
+
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
+ var body: some View {
+ MinimalisticSquircircleButton(
+ icon: "airplayaudio",
+ fontSize: 18,
+ fontWeight: .medium,
+ frameSize: CGSize(width: 40, height: 40),
+ cornerRadius: 16,
+ foregroundColor: .white.opacity(0.85),
+ symbolEffectStyle: .replace
+ ) {
+ isPopoverPresented.toggle()
+ if isPopoverPresented {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .accessibilityLabel("AirPlay")
+ .popover(isPresented: $isPopoverPresented, arrowEdge: .bottom) {
+ AirPlaySelectorPopover(
+ airPlayManager: airPlayManager,
+ onHoverChanged: { hovering in
+ isHoveringPopover = hovering
+ updateActivity()
+ }
+ ) {
+ isPopoverPresented = false
+ isHoveringPopover = false
+ updateActivity()
+ }
+ }
+ .onChange(of: isPopoverPresented) { _, presented in
+ if !presented { isHoveringPopover = false }
+ updateActivity()
+ }
+ .onAppear {
+ if isAppleMusicActive {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .onChange(of: musicManager.bundleIdentifier) { _, newBundle in
+ if newBundle == "com.apple.Music" {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .onDisappear {
+ vm.isMediaOutputPopoverActive = false
+ }
+ }
+
+ private func updateActivity() {
+ vm.isMediaOutputPopoverActive = isPopoverPresented && isHoveringPopover
+ }
+ }
+
private var repeatIcon: String {
switch musicManager.repeatMode {
case .off: return "repeat"
diff --git a/DynamicIsland/components/Notch/NotchHomeView.swift b/DynamicIsland/components/Notch/NotchHomeView.swift
index 37deed7..09d60e5 100644
--- a/DynamicIsland/components/Notch/NotchHomeView.swift
+++ b/DynamicIsland/components/Notch/NotchHomeView.swift
@@ -398,9 +398,13 @@ struct MusicControlsView: View {
}
}
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
private var displayedSlots: [MusicControlButton] {
if showCustomControls {
- let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl)
+ let normalized = slotConfig.normalized(allowingMediaOutput: showMediaOutputControl, isAppleMusicActive: isAppleMusicActive)
return normalized.contains(where: { $0 != .none }) ? normalized : MusicControlButton.defaultLayout
}
@@ -474,6 +478,8 @@ struct MusicControlsView: View {
}
case .mediaOutput:
MediaOutputPickerButton()
+ case .airPlay:
+ AirPlayPickerButton()
case .lyrics:
HoverButton(
icon: enableLyrics ? "quote.bubble.fill" : "quote.bubble",
@@ -899,6 +905,62 @@ private struct MediaOutputPickerButton: View {
}
}
+private struct AirPlayPickerButton: View {
+ @ObservedObject private var musicManager = MusicManager.shared
+ @ObservedObject private var airPlayManager = AppleMusicAirPlayManager.shared
+ @State private var isPopoverPresented = false
+ @State private var isHoveringPopover = false
+ @EnvironmentObject private var vm: DynamicIslandViewModel
+
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
+ var body: some View {
+ HoverButton(icon: "airplayaudio", iconColor: .white, scale: .medium) {
+ isPopoverPresented.toggle()
+ if isPopoverPresented {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .accessibilityLabel("AirPlay")
+ .popover(isPresented: $isPopoverPresented, arrowEdge: .bottom) {
+ AirPlaySelectorPopover(
+ airPlayManager: airPlayManager,
+ onHoverChanged: { hovering in
+ isHoveringPopover = hovering
+ updatePopoverActivity()
+ }
+ ) {
+ isPopoverPresented = false
+ isHoveringPopover = false
+ updatePopoverActivity()
+ }
+ }
+ .onAppear {
+ if isAppleMusicActive {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .onChange(of: isPopoverPresented) { _, presented in
+ if !presented { isHoveringPopover = false }
+ updatePopoverActivity()
+ }
+ .onChange(of: musicManager.bundleIdentifier) { _, newBundle in
+ if newBundle == "com.apple.Music" {
+ Task { await airPlayManager.refreshDevices() }
+ }
+ }
+ .onDisappear {
+ vm.isMediaOutputPopoverActive = false
+ }
+ }
+
+ private func updatePopoverActivity() {
+ vm.isMediaOutputPopoverActive = isPopoverPresented && isHoveringPopover
+ }
+}
+
struct MediaOutputSelectorPopover: View {
@ObservedObject var routeManager: AudioRouteManager
@ObservedObject var volumeModel: MediaOutputVolumeViewModel
@@ -1008,7 +1070,7 @@ struct MediaOutputSelectorPopover: View {
}
.frame(maxWidth: .infinity, alignment: .leading)
}
- .frame(maxHeight: 180)
+ .frame(maxHeight: 240)
}
}
}
@@ -1029,6 +1091,104 @@ struct MediaOutputSelectorPopover: View {
}
}
+struct AirPlaySelectorPopover: View {
+ @ObservedObject var airPlayManager: AppleMusicAirPlayManager
+ var onHoverChanged: (Bool) -> Void
+ var dismiss: () -> Void
+
+ var body: some View {
+ VStack(alignment: .leading, spacing: 8) {
+ Text("AirPlay")
+ .font(.caption)
+ .foregroundColor(.secondary)
+
+ if airPlayManager.devices.isEmpty {
+ Text("No AirPlay devices found")
+ .font(.callout)
+ .foregroundColor(.secondary)
+ .padding(.vertical, 12)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ } else {
+ ScrollView {
+ VStack(spacing: 6) {
+ ForEach(airPlayManager.devices) { device in
+ VStack(spacing: 4) {
+ Button {
+ Task { await airPlayManager.toggleDevice(device) }
+ } label: {
+ HStack(spacing: 8) {
+ Image(systemName: device.iconName)
+ .font(.system(size: 14, weight: .medium))
+ Text(device.name)
+ .foregroundColor(.primary)
+ .lineLimit(1)
+ Spacer()
+ if device.isSelected {
+ Image(systemName: "checkmark")
+ .font(.system(size: 12, weight: .bold))
+ }
+ }
+ .padding(.vertical, 6)
+ .padding(.horizontal, 8)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .background(
+ RoundedRectangle(cornerRadius: 8, style: .continuous)
+ .fill(device.isSelected ? Color.primary.opacity(0.12) : .clear)
+ )
+ }
+ .buttonStyle(.plain)
+
+ if device.isSelected {
+ AirPlayVolumeSlider(
+ airPlayManager: airPlayManager,
+ deviceID: device.id
+ )
+ .padding(.horizontal, 8)
+ }
+ }
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+ }
+ .frame(maxHeight: 300)
+ }
+ }
+ .frame(width: 240)
+ .padding(16)
+ .onHover { hovering in
+ onHoverChanged(hovering)
+ }
+ .onDisappear {
+ onHoverChanged(false)
+ }
+ }
+}
+
+/// Local @State slider decoupled from the manager's @Published state.
+/// This prevents SwiftUI from resetting the slider position when other
+/// published properties on the manager change during a drag.
+struct AirPlayVolumeSlider: View {
+ @ObservedObject var airPlayManager: AppleMusicAirPlayManager
+ let deviceID: String
+
+ @State private var sliderValue: Double = 0
+ @State private var isSyncing = false
+
+ var body: some View {
+ Slider(value: $sliderValue, in: 0...100)
+ .tint(.accentColor)
+ .onAppear {
+ isSyncing = true
+ sliderValue = Double(airPlayManager.currentVolume(for: deviceID))
+ isSyncing = false
+ }
+ .onChange(of: sliderValue) { _, newValue in
+ guard !isSyncing else { return }
+ airPlayManager.setVolume(Int(newValue), for: deviceID)
+ }
+ }
+}
+
final class MediaOutputVolumeViewModel: ObservableObject {
@Published var level: Float
@Published var isMuted: Bool
diff --git a/DynamicIsland/components/Notch/NotchTimerView.swift b/DynamicIsland/components/Notch/NotchTimerView.swift
index c64606e..15dfe29 100644
--- a/DynamicIsland/components/Notch/NotchTimerView.swift
+++ b/DynamicIsland/components/Notch/NotchTimerView.swift
@@ -615,11 +615,11 @@ private struct DurationInputRow: View {
var body: some View {
HStack(alignment: .center, spacing: 8) {
- DurationField(label: "HH", value: $hours, range: 0...23, width: fieldWidth)
+ DurationField(label: String(localized: "HH"), value: $hours, range: 0...23, width: fieldWidth)
colon
- DurationField(label: "MM", value: $minutes, range: 0...59, width: fieldWidth)
+ DurationField(label: String(localized: "MM"), value: $minutes, range: 0...59, width: fieldWidth)
colon
- DurationField(label: "SS", value: $seconds, range: 0...59, width: fieldWidth)
+ DurationField(label: String(localized: "SS"), value: $seconds, range: 0...59, width: fieldWidth)
}
}
diff --git a/DynamicIsland/components/Settings/MusicSlotConfigurationView.swift b/DynamicIsland/components/Settings/MusicSlotConfigurationView.swift
index 663f42a..3457604 100644
--- a/DynamicIsland/components/Settings/MusicSlotConfigurationView.swift
+++ b/DynamicIsland/components/Settings/MusicSlotConfigurationView.swift
@@ -34,6 +34,10 @@ struct MusicSlotConfigurationView: View {
private let slotCount = MusicControlButton.slotCount
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
+
var body: some View {
VStack(alignment: .leading, spacing: 12) {
header
@@ -195,15 +199,23 @@ private struct ScrollHintIndicator: View {
}
}
+ private func isControlDisabled(_ control: MusicControlButton) -> Bool {
+ if control == .mediaOutput && !showMediaOutputControl { return true }
+ if control.isAppleMusicExclusive && !isAppleMusicActive { return true }
+ return false
+ }
+
private func paletteItem(for control: MusicControlButton) -> some View {
- VStack(spacing: 6) {
+ let disabled = isControlDisabled(control)
+
+ return VStack(spacing: 6) {
RoundedRectangle(cornerRadius: 8)
.fill(Color(nsColor: .controlBackgroundColor))
.frame(width: 44, height: 44)
.overlay {
Image(systemName: control.iconName)
.font(.system(size: control.prefersLargeScale ? 18 : 15, weight: .medium))
- .foregroundStyle(control == .mediaOutput && !showMediaOutputControl ? .secondary : .primary)
+ .foregroundStyle(disabled ? .secondary : .primary)
}
.onDrag {
NSItemProvider(object: NSString(string: "control:\(control.rawValue)"))
@@ -220,8 +232,8 @@ private struct ScrollHintIndicator: View {
.minimumScaleFactor(0.8)
.multilineTextAlignment(.center)
}
- .opacity(control == .mediaOutput && !showMediaOutputControl ? 0.4 : 1)
- .disabled(control == .mediaOutput && !showMediaOutputControl)
+ .opacity(disabled ? 0.4 : 1)
+ .disabled(disabled)
}
private func place(_ control: MusicControlButton) {
@@ -233,17 +245,20 @@ private struct ScrollHintIndicator: View {
}
private func slotValue(at index: Int) -> MusicControlButton {
- let normalized = musicControlSlots.normalized(allowingMediaOutput: showMediaOutputControl)
+ let normalized = musicControlSlots.normalized(allowingMediaOutput: showMediaOutputControl, isAppleMusicActive: isAppleMusicActive)
guard normalized.indices.contains(index) else { return .none }
return normalized[index]
}
private var pickerOptions: [MusicControlButton] {
- let base = MusicControlButton.pickerOptions
- if showMediaOutputControl {
- return base
+ var base = MusicControlButton.pickerOptions
+ if !showMediaOutputControl {
+ base = base.filter { $0 != .mediaOutput }
}
- return base.filter { $0 != .mediaOutput }
+ if !isAppleMusicActive {
+ base = base.filter { !$0.isAppleMusicExclusive }
+ }
+ return base
}
private func previewIconColor(for slot: MusicControlButton) -> Color {
diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift
index ae7a5ec..624d355 100644
--- a/DynamicIsland/components/Settings/SettingsView.swift
+++ b/DynamicIsland/components/Settings/SettingsView.swift
@@ -34,12 +34,12 @@ private enum SettingsTabGroup: String, CaseIterable, Identifiable {
var title: String? {
switch self {
case .core: return nil
- case .mediaAndDisplay: return "Media & Display"
- case .system: return "System"
- case .productivity: return "Productivity"
- case .utilities: return "Utilities"
- case .developer: return "Developer"
- case .integrations: return "Integrations"
+ case .mediaAndDisplay: return String(localized: "Media & Display")
+ case .system: return String(localized: "System")
+ case .productivity: return String(localized: "Productivity")
+ case .utilities: return String(localized: "Utilities")
+ case .developer: return String(localized: "Developer")
+ case .integrations: return String(localized: "Integrations")
case .info: return nil
}
}
@@ -87,27 +87,27 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
var title: String {
switch self {
- case .general: return "General"
- case .liveActivities: return "Live Activities"
- case .appearance: return "Appearance"
- case .lockScreen: return "Lock Screen"
- case .media: return "Media"
- case .devices: return "Devices"
- case .extensions: return "Extensions"
- case .timer: return "Timer"
- case .calendar: return "Calendar"
- case .hudAndOSD: return "Controls"
- case .battery: return "Battery"
- case .stats: return "Stats"
- case .clipboard: return "Clipboard"
- case .screenAssistant: return "Screen Assistant"
- case .colorPicker: return "Color Picker"
- case .downloads: return "Downloads"
- case .shelf: return "Shelf"
- case .shortcuts: return "Shortcuts"
- case .notes: return "Notes"
- case .terminal: return "Terminal"
- case .about: return "About"
+ case .general: return String(localized: "General")
+ case .liveActivities: return String(localized: "Live Activities")
+ case .appearance: return String(localized: "Appearance")
+ case .lockScreen: return String(localized: "Lock Screen")
+ case .media: return String(localized: "Media")
+ case .devices: return String(localized: "Devices")
+ case .extensions: return String(localized: "Extensions")
+ case .timer: return String(localized: "Timer")
+ case .calendar: return String(localized: "Calendar")
+ case .hudAndOSD: return String(localized: "Controls")
+ case .battery: return String(localized: "Battery")
+ case .stats: return String(localized: "Stats")
+ case .clipboard: return String(localized: "Clipboard")
+ case .screenAssistant: return String(localized: "Screen Assistant")
+ case .colorPicker: return String(localized: "Color Picker")
+ case .downloads: return String(localized: "Downloads")
+ case .shelf: return String(localized: "Shelf")
+ case .shortcuts: return String(localized: "Shortcuts")
+ case .notes: return String(localized: "Notes")
+ case .terminal: return String(localized: "Terminal")
+ case .about: return String(localized: "About")
}
}
@@ -1046,25 +1046,31 @@ struct GeneralSettings: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Minimalistic UI", key: .enableMinimalisticUI)
- .onChange(of: enableMinimalisticUI) { _, newValue in
- if newValue {
- // Auto-enable simpler animation mode
- Defaults[.useModernCloseAnimation] = true
- }
+ Defaults.Toggle(key: .enableMinimalisticUI) {
+ Text("Enable Minimalistic UI")
+ }
+ .onChange(of: enableMinimalisticUI) { _, newValue in
+ if newValue {
+ // Auto-enable simpler animation mode
+ Defaults[.useModernCloseAnimation] = true
}
- .settingsHighlight(id: highlightID("Enable Minimalistic UI"))
+ }
+ .settingsHighlight(id: highlightID("Enable Minimalistic UI"))
} header: {
Text("UI Mode")
} footer: {
Text("Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations.")
}
-
+
Section {
- Defaults.Toggle("Menubar icon", key: .menubarIcon)
- .settingsHighlight(id: highlightID("Menubar icon"))
- LaunchAtLogin.Toggle("Launch at login")
- .settingsHighlight(id: highlightID("Launch at login"))
+ Defaults.Toggle(key: .menubarIcon) {
+ Text("Menubar icon")
+ }
+ .settingsHighlight(id: highlightID("Menubar icon"))
+ LaunchAtLogin.Toggle {
+ Text("Launch at login")
+ }
+ .settingsHighlight(id: highlightID("Launch at login"))
Defaults.Toggle(key: .showOnAllDisplays) {
Text("Show on all displays")
}
@@ -1082,40 +1088,44 @@ struct GeneralSettings: View {
}
.disabled(showOnAllDisplays)
.settingsHighlight(id: highlightID("Show on a specific display"))
- Defaults.Toggle("Automatically switch displays", key: .automaticallySwitchDisplay)
+ Defaults.Toggle(key: .automaticallySwitchDisplay) {
+ Text("Automatically switch displays")
+ }
.onChange(of: automaticallySwitchDisplay) {
NotificationCenter.default.post(name: Notification.Name.automaticallySwitchDisplayChanged, object: nil)
}
.disabled(showOnAllDisplays)
.settingsHighlight(id: highlightID("Automatically switch displays"))
- Defaults.Toggle("Hide Dynamic Island during screenshots & recordings", key: .hideDynamicIslandFromScreenCapture)
- .settingsHighlight(id: highlightID("Hide Dynamic Island during screenshots & recordings"))
+ Defaults.Toggle(key: .hideDynamicIslandFromScreenCapture) {
+ Text("Hide Dynamic Island during screenshots & recordings")
+ }
+ .settingsHighlight(id: highlightID("Hide Dynamic Island during screenshots & recordings"))
} header: {
Text("System features")
}
-
+
Section {
Picker(selection: $notchHeightMode, label:
- Text("Notch display height")) {
- Text("Match real notch size")
- .tag(WindowHeightMode.matchRealNotchSize)
- Text("Match menubar height")
- .tag(WindowHeightMode.matchMenuBar)
- Text("Custom height")
- .tag(WindowHeightMode.custom)
- }
- .onChange(of: notchHeightMode) {
- switch notchHeightMode {
- case .matchRealNotchSize:
- notchHeight = 38
- case .matchMenuBar:
- notchHeight = 44
- case .custom:
- notchHeight = 38
+ Text("Notch display height")) {
+ Text("Match real notch size")
+ .tag(WindowHeightMode.matchRealNotchSize)
+ Text("Match menubar height")
+ .tag(WindowHeightMode.matchMenuBar)
+ Text("Custom height")
+ .tag(WindowHeightMode.custom)
+ }
+ .onChange(of: notchHeightMode) {
+ switch notchHeightMode {
+ case .matchRealNotchSize:
+ notchHeight = 38
+ case .matchMenuBar:
+ notchHeight = 44
+ case .custom:
+ notchHeight = 38
+ }
+ NotificationCenter.default.post(name: Notification.Name.notchHeightChanged, object: nil)
}
- NotificationCenter.default.post(name: Notification.Name.notchHeightChanged, object: nil)
- }
- .settingsHighlight(id: highlightID("Notch display height"))
+ .settingsHighlight(id: highlightID("Notch display height"))
if notchHeightMode == .custom {
Slider(value: $notchHeight, in: 15...45, step: 1) {
Text("Custom notch size - \(notchHeight, specifier: "%.0f")")
@@ -1172,16 +1182,20 @@ struct GeneralSettings: View {
}
}
}
-
+
@ViewBuilder
func gestureControls() -> some View {
Section {
- Defaults.Toggle("Enable gestures", key: .enableGestures)
- .disabled(!openNotchOnHover)
- .settingsHighlight(id: highlightID("Enable gestures"))
+ Defaults.Toggle(key: .enableGestures) {
+ Text("Enable gestures")
+ }
+ .disabled(!openNotchOnHover)
+ .settingsHighlight(id: highlightID("Enable gestures"))
if enableGestures {
- Defaults.Toggle("Media change with horizontal gestures", key: .enableHorizontalMusicGestures)
- .settingsHighlight(id: highlightID("Horizontal media gestures"))
+ Defaults.Toggle(key: .enableHorizontalMusicGestures) {
+ Text("Media change with horizontal gestures")
+ }
+ .settingsHighlight(id: highlightID("Horizontal media gestures"))
if enableHorizontalMusicGestures {
Picker("Gesture skip behavior", selection: $musicGestureBehavior) {
@@ -1197,12 +1211,16 @@ struct GeneralSettings: View {
.font(.caption)
.foregroundStyle(.secondary)
- Defaults.Toggle("Reverse swipe gestures", key: .reverseSwipeGestures)
- .settingsHighlight(id: highlightID("Reverse swipe gestures"))
+ Defaults.Toggle(key: .reverseSwipeGestures) {
+ Text("Reverse swipe gestures")
+ }
+ .settingsHighlight(id: highlightID("Reverse swipe gestures"))
}
- Defaults.Toggle("Close gesture", key: .closeGestureEnabled)
- .settingsHighlight(id: highlightID("Close gesture"))
+ Defaults.Toggle(key: .closeGestureEnabled) {
+ Text("Close gesture")
+ }
+ .settingsHighlight(id: highlightID("Close gesture"))
Slider(value: $gestureSensitivity, in: 100...300, step: 100) {
HStack {
Text("Gesture sensitivity")
@@ -1212,8 +1230,10 @@ struct GeneralSettings: View {
}
}
- Defaults.Toggle("Reverse open/close scroll gestures", key: .reverseScrollGestures)
- .settingsHighlight(id: highlightID("Reverse scroll gestures"))
+ Defaults.Toggle(key: .reverseScrollGestures) {
+ Text("Reverse open/close scroll gestures")
+ }
+ .settingsHighlight(id: highlightID("Reverse scroll gestures"))
}
} header: {
HStack {
@@ -1231,12 +1251,18 @@ struct GeneralSettings: View {
@ViewBuilder
func NotchBehaviour() -> some View {
Section {
- Defaults.Toggle("Extend hover area", key: .extendHoverArea)
- .settingsHighlight(id: highlightID("Extend hover area"))
- Defaults.Toggle("Enable haptics", key: .enableHaptics)
- .settingsHighlight(id: highlightID("Enable haptics"))
- Defaults.Toggle("Open notch on hover", key: .openNotchOnHover)
- .settingsHighlight(id: highlightID("Open notch on hover"))
+ Defaults.Toggle(key: .extendHoverArea) {
+ Text("Extend hover area")
+ }
+ .settingsHighlight(id: highlightID("Extend hover area"))
+ Defaults.Toggle(key: .enableHaptics) {
+ Text("Enable haptics")
+ }
+ .settingsHighlight(id: highlightID("Enable haptics"))
+ Defaults.Toggle(key: .openNotchOnHover) {
+ Text("Open notch on hover")
+ }
+ .settingsHighlight(id: highlightID("Open notch on hover"))
Toggle("Remember last tab", isOn: $coordinator.openLastTabByDefault)
if openNotchOnHover {
Slider(value: $minimumHoverDuration, in: 0...1, step: 0.1) {
@@ -1264,8 +1290,10 @@ struct GeneralSettings: View {
Text(externalDisplayStyle.description)
.font(.caption)
.foregroundStyle(.secondary)
- Defaults.Toggle("Hide until hovered on non-notch displays", key: .hideNonNotchUntilHover)
- .settingsHighlight(id: highlightID("Hide until hovered"))
+ Defaults.Toggle(key: .hideNonNotchUntilHover) {
+ Text("Hide until hovered on non-notch displays")
+ }
+ .settingsHighlight(id: highlightID("Hide until hovered"))
Text("When enabled, the notch slides up and hides on external (non-notch) displays until you hover over it.")
.font(.caption)
.foregroundStyle(.secondary)
@@ -1284,20 +1312,30 @@ struct Charge: View {
Form {
if BatteryActivityManager.shared.hasBattery() {
Section {
- Defaults.Toggle("Show battery indicator", key: .showBatteryIndicator)
- .settingsHighlight(id: highlightID("Show battery indicator"))
- Defaults.Toggle("Show power status notifications", key: .showPowerStatusNotifications)
- .settingsHighlight(id: highlightID("Show power status notifications"))
- Defaults.Toggle("Play low battery alert sound", key: .playLowBatteryAlertSound)
- .settingsHighlight(id: highlightID("Play low battery alert sound"))
+ Defaults.Toggle(key: .showBatteryIndicator) {
+ Text("Show battery indicator")
+ }
+ .settingsHighlight(id: highlightID("Show battery indicator"))
+ Defaults.Toggle(key: .showPowerStatusNotifications) {
+ Text("Show power status notifications")
+ }
+ .settingsHighlight(id: highlightID("Show power status notifications"))
+ Defaults.Toggle(key: .playLowBatteryAlertSound) {
+ Text("Play low battery alert sound")
+ }
+ .settingsHighlight(id: highlightID("Play low battery alert sound"))
} header: {
Text("General")
}
Section {
- Defaults.Toggle("Show battery percentage", key: .showBatteryPercentage)
- .settingsHighlight(id: highlightID("Show battery percentage"))
- Defaults.Toggle("Show power status icons", key: .showPowerStatusIcons)
- .settingsHighlight(id: highlightID("Show power status icons"))
+ Defaults.Toggle(key: .showBatteryPercentage) {
+ Text("Show battery percentage")
+ }
+ .settingsHighlight(id: highlightID("Show battery percentage"))
+ Defaults.Toggle(key: .showPowerStatusIcons) {
+ Text("Show power status icons")
+ }
+ .settingsHighlight(id: highlightID("Show power status icons"))
} header: {
Text("Battery Information")
}
@@ -1327,13 +1365,15 @@ struct Downloads: View {
var body: some View {
SwiftUI.Form {
Section {
- Defaults.Toggle("Enable download detection", key: .enableDownloadListener)
- .settingsHighlight(id: highlightID("Enable download detection"))
+ Defaults.Toggle(key: .enableDownloadListener) {
+ Text("Enable download detection")
+ }
+ .settingsHighlight(id: highlightID("Enable download detection"))
VStack(alignment: .leading, spacing: 12) {
Text("Download indicator style")
.font(.system(size: 13, weight: .semibold))
.foregroundStyle(.white)
-
+
HStack(spacing: 16) {
DownloadStyleButton(
style: .progress,
@@ -1342,7 +1382,7 @@ struct Downloads: View {
) {
selectedDownloadIndicatorStyle = .progress
}
-
+
DownloadStyleButton(
style: .circle,
isSelected: selectedDownloadIndicatorStyle == .circle,
@@ -1361,15 +1401,15 @@ struct Downloads: View {
}
.navigationTitle("Downloads")
}
-
+
struct DownloadStyleButton: View {
let style: DownloadIndicatorStyle
let isSelected: Bool
let disabled: Bool
let action: () -> Void
-
+
@State private var isHovering = false
-
+
var body: some View {
VStack(spacing: 8) {
ZStack {
@@ -1379,7 +1419,7 @@ struct Downloads: View {
RoundedRectangle(cornerRadius: 12)
.strokeBorder(borderColor, lineWidth: isSelected ? 2 : 1)
)
-
+
if style == .progress {
ProgressView()
.progressViewStyle(.linear)
@@ -1397,7 +1437,7 @@ struct Downloads: View {
}
}
}
-
+
Text(style.rawValue)
.font(.caption)
.fontWeight(.medium)
@@ -1414,14 +1454,14 @@ struct Downloads: View {
}
.opacity(disabled ? 0.5 : 1.0)
}
-
+
private var backgroundColor: Color {
if disabled { return Color(nsColor: .controlBackgroundColor) }
if isSelected { return Color.accentColor.opacity(0.1) }
if isHovering { return Color.primary.opacity(0.05) }
return Color(nsColor: .controlBackgroundColor)
}
-
+
private var borderColor: Color {
if isSelected { return Color.accentColor }
if isHovering { return Color.primary.opacity(0.1) }
@@ -1433,19 +1473,19 @@ struct Downloads: View {
final class HUDPreviewViewModel: ObservableObject {
@Published var level: Float = 0
@Published var iconName: String = "speaker.wave.3.fill"
-
+
private var cancellables = Set()
-
+
init() {
setup()
}
-
+
private func setup() {
// Ensure controllers are active
SystemVolumeController.shared.start()
SystemBrightnessController.shared.start()
SystemKeyboardBacklightController.shared.start()
-
+
// Initial state from volume
let vol = SystemVolumeController.shared.currentVolume
self.level = vol
@@ -1453,7 +1493,7 @@ final class HUDPreviewViewModel: ObservableObject {
else if vol < 0.33 { self.iconName = "speaker.wave.1.fill" }
else if vol < 0.66 { self.iconName = "speaker.wave.2.fill" }
else { self.iconName = "speaker.wave.3.fill" }
-
+
// Listeners
NotificationCenter.default.publisher(for: .systemVolumeDidChange)
.compactMap { $0.userInfo }
@@ -1469,7 +1509,7 @@ final class HUDPreviewViewModel: ObservableObject {
}
}
.store(in: &cancellables)
-
+
NotificationCenter.default.publisher(for: .systemBrightnessDidChange)
.compactMap { $0.userInfo }
.receive(on: DispatchQueue.main)
@@ -1481,7 +1521,7 @@ final class HUDPreviewViewModel: ObservableObject {
}
}
.store(in: &cancellables)
-
+
NotificationCenter.default.publisher(for: .keyboardBacklightDidChange)
.compactMap { $0.userInfo }
.receive(on: DispatchQueue.main)
@@ -1522,7 +1562,7 @@ private struct HUDAndOSDSettingsView: View {
@Default(.verticalHUDMaterial) var verticalHUDMaterial
@Default(.verticalHUDLiquidGlassCustomizationMode) var verticalHUDLiquidGlassCustomizationMode
@Default(.verticalHUDLiquidGlassVariant) var verticalHUDLiquidGlassVariant
-
+
// Circular HUD Props
@Default(.circularHUDShowValue) var circularHUDShowValue
@Default(.circularHUDSize) var circularHUDSize
@@ -1536,7 +1576,7 @@ private struct HUDAndOSDSettingsView: View {
case osd = "Custom OSD"
case vertical = "Vertical Bar"
case circular = "Circular"
-
+
var id: String { rawValue }
}
@@ -1590,7 +1630,7 @@ private struct HUDAndOSDSettingsView: View {
.font(.system(size: 9, weight: .semibold))
.foregroundStyle(.white)
.frame(width: 12)
-
+
GeometryReader { geo in
Capsule()
.fill(Color.white.opacity(0.2))
@@ -1607,7 +1647,7 @@ private struct HUDAndOSDSettingsView: View {
}
}
}
-
+
HUDSelectionCard(
title: "Custom OSD",
isSelected: selectedTab == .osd,
@@ -1619,7 +1659,7 @@ private struct HUDAndOSDSettingsView: View {
enableCircularHUD = false
}
) {
- RoundedRectangle(cornerRadius: 12)
+ RoundedRectangle(cornerRadius: 12)
.fill(.ultraThinMaterial)
.overlay {
RoundedRectangle(cornerRadius: 12)
@@ -1633,7 +1673,7 @@ private struct HUDAndOSDSettingsView: View {
.foregroundStyle(.secondary)
.symbolRenderingMode(.hierarchical)
.contentTransition(.symbolEffect(.replace))
-
+
GeometryReader { geo in
Capsule()
.fill(Color.secondary.opacity(0.2))
@@ -1649,7 +1689,7 @@ private struct HUDAndOSDSettingsView: View {
}
.frame(width: 44, height: 44)
}
-
+
HUDSelectionCard(
title: "Vertical Bar",
isSelected: selectedTab == .vertical,
@@ -1662,35 +1702,35 @@ private struct HUDAndOSDSettingsView: View {
}
) {
RoundedRectangle(cornerRadius: 8)
- .fill(.ultraThinMaterial)
- .overlay {
- RoundedRectangle(cornerRadius: 8)
- .stroke(.white.opacity(0.1), lineWidth: 1)
- }
- .shadow(color: .black.opacity(0.1), radius: 3, y: 1)
- .overlay {
- VStack {
- GeometryReader { geo in
- VStack {
- Spacer()
- RoundedRectangle(cornerRadius: 6, style: .continuous)
- .fill(Color.white)
- .frame(height: max(0, geo.size.height * CGFloat(previewModel.level)))
- .animation(.spring(response: 0.3), value: previewModel.level)
- }
- }
- .mask(RoundedRectangle(cornerRadius: 6, style: .continuous))
- .padding(.bottom, 2)
-
- Image(systemName: previewModel.iconName)
- .font(.system(size: 9))
- .foregroundStyle(previewModel.level > 0.15 ? .black : .secondary)
- .symbolRenderingMode(.hierarchical)
- .contentTransition(.symbolEffect(.replace))
- }
- .padding(4)
- }
- .frame(width: 22, height: 54)
+ .fill(.ultraThinMaterial)
+ .overlay {
+ RoundedRectangle(cornerRadius: 8)
+ .stroke(.white.opacity(0.1), lineWidth: 1)
+ }
+ .shadow(color: .black.opacity(0.1), radius: 3, y: 1)
+ .overlay {
+ VStack {
+ GeometryReader { geo in
+ VStack {
+ Spacer()
+ RoundedRectangle(cornerRadius: 6, style: .continuous)
+ .fill(Color.white)
+ .frame(height: max(0, geo.size.height * CGFloat(previewModel.level)))
+ .animation(.spring(response: 0.3), value: previewModel.level)
+ }
+ }
+ .mask(RoundedRectangle(cornerRadius: 6, style: .continuous))
+ .padding(.bottom, 2)
+
+ Image(systemName: previewModel.iconName)
+ .font(.system(size: 9))
+ .foregroundStyle(previewModel.level > 0.15 ? .black : .secondary)
+ .symbolRenderingMode(.hierarchical)
+ .contentTransition(.symbolEffect(.replace))
+ }
+ .padding(4)
+ }
+ .frame(width: 22, height: 54)
}
HUDSelectionCard(
@@ -1727,17 +1767,17 @@ private struct HUDAndOSDSettingsView: View {
case .hud:
HUD()
case .osd:
- if #available(macOS 15.0, *) {
+ if #available(macOS 15.0, *) {
CustomOSDSettings()
} else {
- VStack(spacing: 16) {
+ VStack(spacing: 16) {
Image(systemName: "exclamationmark.triangle.fill")
.font(.system(size: 48))
.foregroundStyle(.orange)
-
+
Text("macOS 15 or later required")
.font(.headline)
-
+
Text("Custom OSD feature requires macOS 15 or later.")
.font(.subheadline)
.foregroundStyle(.secondary)
@@ -1779,7 +1819,7 @@ private struct HUDAndOSDSettingsView: View {
.font(.caption)
}
}
-
+
Section {
Toggle("Show Percentage", isOn: $verticalHUDShowValue)
Toggle("Use Accent Color", isOn: $verticalHUDUseAccentColor)
@@ -1817,21 +1857,25 @@ private struct HUDAndOSDSettingsView: View {
.foregroundStyle(.secondary)
}
}
- Defaults.Toggle("Color-coded Volume", key: .useColorCodedVolumeDisplay)
+ Defaults.Toggle(key: .useColorCodedVolumeDisplay) {
+ Text("Color-coded Volume")
+ }
if Defaults[.useColorCodedVolumeDisplay] {
- Defaults.Toggle("Smooth color transitions", key: .useSmoothColorGradient)
+ Defaults.Toggle(key: .useSmoothColorGradient) {
+ Text("Smooth color transitions")
+ }
}
} header: {
Text("Behavior & Style")
}
-
+
Section {
Picker("HUD Position", selection: $verticalHUDPosition) {
Text("Left").tag("left")
Text("Right").tag("right")
}
.pickerStyle(.menu)
-
+
VStack(alignment: .leading) {
Text("Screen Padding: \(Int(verticalHUDPadding))px")
Slider(value: $verticalHUDPadding, in: 0...100, step: 4)
@@ -1843,7 +1887,7 @@ private struct HUDAndOSDSettingsView: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
VStack(alignment: .leading) {
Text("Width: \(Int(verticalHUDWidth))px")
@@ -1896,18 +1940,22 @@ private struct HUDAndOSDSettingsView: View {
.font(.caption)
}
}
-
+
Section {
Toggle("Show Percentage", isOn: $circularHUDShowValue)
Toggle("Use Accent Color", isOn: $circularHUDUseAccentColor)
- Defaults.Toggle("Color-coded Volume", key: .useColorCodedVolumeDisplay)
+ Defaults.Toggle(key: .useColorCodedVolumeDisplay) {
+ Text("Color-coded Volume")
+ }
if Defaults[.useColorCodedVolumeDisplay] {
- Defaults.Toggle("Smooth color transitions", key: .useSmoothColorGradient)
+ Defaults.Toggle(key: .useSmoothColorGradient) {
+ Text("Smooth color transitions")
+ }
}
} header: {
Text("Style")
}
-
+
Section {
VStack(alignment: .leading) {
Text("Size: \(Int(circularHUDSize))px")
@@ -2081,9 +2129,9 @@ private struct HUDSelectionCard: View {
let isSelected: Bool
let action: () -> Void
@ViewBuilder let preview: Preview
-
+
@State private var isHovering = false
-
+
var body: some View {
Button(action: action) {
VStack(spacing: 12) {
@@ -2098,16 +2146,16 @@ private struct HUDSelectionCard: View {
)
)
.shadow(color: .black.opacity(0.05), radius: 2, y: 1)
-
+
preview
}
.frame(width: 110, height: 80)
-
+
VStack(spacing: 4) {
Text(title)
.font(.system(size: 13, weight: .medium))
.foregroundStyle(isSelected ? .primary : .secondary)
-
+
if isSelected {
Circle()
.fill(Color.accentColor)
@@ -2144,14 +2192,22 @@ private struct DevicesSettingsView: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Show Bluetooth device connections", key: .showBluetoothDeviceConnections)
- .settingsHighlight(id: highlightID("Show Bluetooth device connections"))
- Defaults.Toggle("Use circular battery indicator", key: .useCircularBluetoothBatteryIndicator)
- .settingsHighlight(id: highlightID("Use circular battery indicator"))
- Defaults.Toggle("Show battery percentage text in HUD", key: .showBluetoothBatteryPercentageText)
- .settingsHighlight(id: highlightID("Show battery percentage text in HUD"))
- Defaults.Toggle("Scroll device name in HUD", key: .showBluetoothDeviceNameMarquee)
- .settingsHighlight(id: highlightID("Scroll device name in HUD"))
+ Defaults.Toggle(key: .showBluetoothDeviceConnections) {
+ Text("Show Bluetooth device connections")
+ }
+ .settingsHighlight(id: highlightID("Show Bluetooth device connections"))
+ Defaults.Toggle(key: .useCircularBluetoothBatteryIndicator) {
+ Text("Use circular battery indicator")
+ }
+ .settingsHighlight(id: highlightID("Use circular battery indicator"))
+ Defaults.Toggle(key: .showBluetoothBatteryPercentageText) {
+ Text("Show battery percentage text in HUD")
+ }
+ .settingsHighlight(id: highlightID("Show battery percentage text in HUD"))
+ Defaults.Toggle(key: .showBluetoothDeviceNameMarquee) {
+ Text("Scroll device name in HUD")
+ }
+ .settingsHighlight(id: highlightID("Scroll device name in HUD"))
VStack(alignment: .leading, spacing: 12) {
Text("HUD icon style")
.font(.system(size: 13, weight: .semibold))
@@ -2184,9 +2240,11 @@ private struct DevicesSettingsView: View {
}
Section {
- Defaults.Toggle("Color-coded battery display", key: .useColorCodedBatteryDisplay)
- .disabled(colorCodingDisabled)
- .settingsHighlight(id: highlightID("Color-coded battery display"))
+ Defaults.Toggle(key: .useColorCodedBatteryDisplay) {
+ Text("Color-coded battery display")
+ }
+ .disabled(colorCodingDisabled)
+ .settingsHighlight(id: highlightID("Color-coded battery display"))
} header: {
Text("Battery Indicator Styling")
} footer: {
@@ -2233,7 +2291,7 @@ struct HUD: View {
private var colorCodingDisabled: Bool {
progressBarStyle == .segmented
}
-
+
var body: some View {
Form {
if !hasAccessibilityPermission && !enableThirdPartyDDCIntegration {
@@ -2249,7 +2307,7 @@ struct HUD: View {
}
-
+
if enableSystemHUD && !Defaults[.enableCustomOSD] && (hasAccessibilityPermission || enableThirdPartyDDCIntegration) {
Section {
Toggle("Volume HUD", isOn: $enableVolumeHUD)
@@ -2267,9 +2325,11 @@ struct HUD: View {
}
Section {
- Defaults.Toggle("Play feedback when volume is changed", key: .playVolumeChangeFeedback)
- .settingsHighlight(id: highlightID("Play feedback when volume is changed"))
- .help("Plays the supplied feedback clip whenever you press the hardware volume keys.")
+ Defaults.Toggle(key: .playVolumeChangeFeedback) {
+ Text("Play feedback when volume is changed")
+ }
+ .settingsHighlight(id: highlightID("Play feedback when volume is changed"))
+ .help("Plays the supplied feedback clip whenever you press the hardware volume keys.")
} header: {
Text("Audio feedback")
} footer: {
@@ -2279,17 +2339,23 @@ struct HUD: View {
}
Section {
- Defaults.Toggle("Color-coded volume display", key: .useColorCodedVolumeDisplay)
- .disabled(colorCodingDisabled)
- .settingsHighlight(id: highlightID("Color-coded volume display"))
+ Defaults.Toggle(key: .useColorCodedVolumeDisplay) {
+ Text("Color-coded volume display")
+ }
+ .disabled(colorCodingDisabled)
+ .settingsHighlight(id: highlightID("Color-coded volume display"))
if !colorCodingDisabled && (Defaults[.useColorCodedBatteryDisplay] || Defaults[.useColorCodedVolumeDisplay]) {
- Defaults.Toggle("Smooth color transitions", key: .useSmoothColorGradient)
- .settingsHighlight(id: highlightID("Smooth color transitions"))
+ Defaults.Toggle(key: .useSmoothColorGradient) {
+ Text("Smooth color transitions")
+ }
+ .settingsHighlight(id: highlightID("Smooth color transitions"))
}
- Defaults.Toggle("Show percentages beside progress bars", key: .showProgressPercentages)
- .settingsHighlight(id: highlightID("Show percentages beside progress bars"))
+ Defaults.Toggle(key: .showProgressPercentages) {
+ Text("Show percentages beside progress bars")
+ }
+ .settingsHighlight(id: highlightID("Show percentages beside progress bars"))
} header: {
Text("Dynamic Island Progress Bars")
} footer: {
@@ -2307,7 +2373,7 @@ struct HUD: View {
.font(.caption)
}
}
-
+
Section {
Picker("HUD style", selection: $inlineHUD) {
Text("Default")
@@ -2333,10 +2399,14 @@ struct HUD: View {
.tag(ProgressBarStyle.segmented)
}
.settingsHighlight(id: highlightID("Progressbar style"))
- Defaults.Toggle("Enable glowing effect", key: .systemEventIndicatorShadow)
- .settingsHighlight(id: highlightID("Enable glowing effect"))
- Defaults.Toggle("Use accent color", key: .systemEventIndicatorUseAccent)
- .settingsHighlight(id: highlightID("Use accent color"))
+ Defaults.Toggle(key: .systemEventIndicatorShadow) {
+ Text("Enable glowing effect")
+ }
+ .settingsHighlight(id: highlightID("Enable glowing effect"))
+ Defaults.Toggle(key: .systemEventIndicatorUseAccent) {
+ Text("Use accent color")
+ }
+ .settingsHighlight(id: highlightID("Use accent color"))
} header: {
HStack {
Text("Appearance")
@@ -2373,6 +2443,11 @@ struct Media: View {
@Default(.lockScreenMusicAlbumParallaxEnabled) private var lockScreenMusicAlbumParallaxEnabled
@Default(.showStandardMediaControls) private var showStandardMediaControls
@Default(.autoHideInactiveNotchMediaPlayer) private var autoHideInactiveNotchMediaPlayer
+ @ObservedObject private var musicManager = MusicManager.shared
+
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
private func highlightID(_ title: String) -> String {
SettingsTab.media.highlightID(for: title)
@@ -2416,13 +2491,17 @@ struct Media: View {
}
}
Section {
- Defaults.Toggle("Show media controls in Dynamic Island", key: .showStandardMediaControls)
- .disabled(enableMinimalisticUI)
- .settingsHighlight(id: highlightID("Show media controls in Dynamic Island"))
+ Defaults.Toggle(key: .showStandardMediaControls) {
+ Text("Show media controls in Dynamic Island")
+ }
+ .disabled(enableMinimalisticUI)
+ .settingsHighlight(id: highlightID("Show media controls in Dynamic Island"))
- Defaults.Toggle("Auto-hide inactive notch media player", key: .autoHideInactiveNotchMediaPlayer)
- .disabled(enableMinimalisticUI || !showStandardMediaControls)
- .settingsHighlight(id: highlightID("Auto-hide inactive notch media player"))
+ Defaults.Toggle(key: .autoHideInactiveNotchMediaPlayer) {
+ Text("Auto-hide inactive notch media player")
+ }
+ .disabled(enableMinimalisticUI || !showStandardMediaControls)
+ .settingsHighlight(id: highlightID("Auto-hide inactive notch media player"))
if enableMinimalisticUI {
Text("Disable Minimalistic UI to configure the standard notch media controls.")
@@ -2463,8 +2542,10 @@ struct Media: View {
}
Section(header: Text("Lock Screen Media")) {
- Defaults.Toggle("Enable album art parallax", key: .lockScreenMusicAlbumParallaxEnabled)
- .settingsHighlight(id: highlightID("Enable album art parallax"))
+ Defaults.Toggle(key: .lockScreenMusicAlbumParallaxEnabled) {
+ Text("Enable album art parallax")
+ }
+ .settingsHighlight(id: highlightID("Enable album art parallax"))
Text("Applies the notch-style parallax effect to the lock screen media widget album art.")
.font(.caption)
.foregroundStyle(.secondary)
@@ -2502,10 +2583,14 @@ struct Media: View {
Toggle("Enable sneak peek", isOn: $enableSneakPeek)
Toggle("Show sneak peek on playback changes", isOn: $showSneakPeekOnTrackChange)
.disabled(!enableSneakPeek)
- Defaults.Toggle("Enable lyrics", key: .enableLyrics)
- .settingsHighlight(id: highlightID("Enable lyrics"))
- Defaults.Toggle("Enable album art parallax effect", key: .enableParallaxEffect)
- .settingsHighlight(id: highlightID("Enable album art parallax effect"))
+ Defaults.Toggle(key: .enableLyrics) {
+ Text("Enable lyrics")
+ }
+ .settingsHighlight(id: highlightID("Enable lyrics"))
+ Defaults.Toggle(key: .enableParallaxEffect) {
+ Text("Enable album art parallax effect")
+ }
+ .settingsHighlight(id: highlightID("Enable album art parallax effect"))
Picker("Sneak Peek Style", selection: $sneakPeekStyles){
ForEach(SneakPeekStyle.allCases) { style in
Text(style.rawValue).tag(style)
@@ -2513,7 +2598,7 @@ struct Media: View {
}
.disabled(!enableSneakPeek)
.settingsHighlight(id: highlightID("Sneak Peek Style"))
-
+
HStack {
Stepper(value: $waitInterval, in: 0...10, step: 1) {
HStack {
@@ -2529,19 +2614,32 @@ struct Media: View {
}
Section {
- Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget)
- Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon)
- .disabled(!enableLockScreenMediaWidget)
- Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder)
- .disabled(!enableLockScreenMediaWidget)
+ Defaults.Toggle(key: .enableLockScreenMediaWidget) {
+ Text("Show lock screen media panel")
+ }
+ Defaults.Toggle(key: .lockScreenShowAppIcon) {
+ Text("Show media app icon")
+ }
+ .disabled(!enableLockScreenMediaWidget)
+ if isAppleMusicActive {
+ Defaults.Toggle("Show merged AirPlay and output devices", key: .lockScreenMusicMergedAirPlayOutput)
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Show merged AirPlay and output devices"))
+ }
+ Defaults.Toggle(key: .lockScreenPanelShowsBorder) {
+ Text("Show panel border")
+ }
+ .disabled(!enableLockScreenMediaWidget)
if lockScreenGlassCustomizationMode == .customLiquid {
customLiquidBlurRow
.opacity(enableLockScreenMediaWidget ? 1 : 0.5)
.settingsHighlight(id: highlightID("Enable media panel blur"))
} else if lockScreenGlassStyle == .frosted {
- Defaults.Toggle("Enable media panel blur", key: .lockScreenPanelUsesBlur)
- .disabled(!enableLockScreenMediaWidget)
- .settingsHighlight(id: highlightID("Enable media panel blur"))
+ Defaults.Toggle(key: .lockScreenPanelUsesBlur) {
+ Text("Enable media panel blur")
+ }
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Enable media panel blur"))
} else {
unavailableBlurRow
.opacity(enableLockScreenMediaWidget ? 1 : 0.5)
@@ -2556,17 +2654,17 @@ struct Media: View {
.opacity(showStandardMediaControls ? 1 : 0.5)
Picker(selection: $hideNotchOption, label:
- HStack {
- Text("Hide DynamicIsland Options")
- customBadge(text: "Beta")
- }) {
- Text("Always hide in fullscreen").tag(HideNotchOption.always)
- Text("Hide only when NowPlaying app is in fullscreen").tag(HideNotchOption.nowPlayingOnly)
- Text("Never hide").tag(HideNotchOption.never)
- }
- .onChange(of: hideNotchOption) {
- Defaults[.enableFullscreenMediaDetection] = hideNotchOption != .never
- }
+ HStack {
+ Text("Hide DynamicIsland Options")
+ customBadge(text: "Beta")
+ }) {
+ Text("Always hide in fullscreen").tag(HideNotchOption.always)
+ Text("Hide only when NowPlaying app is in fullscreen").tag(HideNotchOption.nowPlayingOnly)
+ Text("Never hide").tag(HideNotchOption.never)
+ }
+ .onChange(of: hideNotchOption) {
+ Defaults[.enableFullscreenMediaDetection] = hideNotchOption != .never
+ }
}
.navigationTitle("Media")
}
@@ -2663,7 +2761,7 @@ struct CalendarSettings: View {
.foregroundColor(.red)
.multilineTextAlignment(.center)
.padding()
-
+
HStack {
Button("Request Access") {
Task {
@@ -2672,7 +2770,7 @@ struct CalendarSettings: View {
}
}
.buttonStyle(.borderedProminent)
-
+
Button("Open System Settings") {
if let settingsURL = URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Calendars") {
NSWorkspace.shared.open(settingsURL)
@@ -2695,9 +2793,11 @@ struct CalendarSettings: View {
.foregroundColor(color(for: calendarManager.reminderAuthorizationStatus))
}
}
-
- Defaults.Toggle("Show calendar", key: .showCalendar)
- .settingsHighlight(id: highlightID("Show calendar"))
+
+ Defaults.Toggle(key: .showCalendar) {
+ Text("Show calendar")
+ }
+ .settingsHighlight(id: highlightID("Show calendar"))
Section(header: Text("Event List")) {
Toggle("Hide completed reminders", isOn: $hideCompletedReminders)
@@ -2718,10 +2818,12 @@ struct CalendarSettings: View {
.foregroundStyle(.secondary)
.fixedSize(horizontal: false, vertical: true)
}
-
+
Section(header: Text("Reminder Live Activity")) {
- Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity)
- .settingsHighlight(id: highlightID("Enable reminder live activity"))
+ Defaults.Toggle(key: .enableReminderLiveActivity) {
+ Text("Enable reminder live activity")
+ }
+ .settingsHighlight(id: highlightID("Enable reminder live activity"))
Picker("Countdown style", selection: $reminderPresentationStyle) {
ForEach(ReminderPresentationStyle.allCases) { style in
@@ -2763,8 +2865,10 @@ struct CalendarSettings: View {
}
Section(header: Text("Lock Screen Reminder Widget")) {
- Defaults.Toggle("Show lock screen reminder", key: .enableLockScreenReminderWidget)
- .settingsHighlight(id: highlightID("Show lock screen reminder"))
+ Defaults.Toggle(key: .enableLockScreenReminderWidget) {
+ Text("Show lock screen reminder")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen reminder"))
Picker("Chip color", selection: $lockScreenReminderChipStyle) {
ForEach(LockScreenReminderChipStyle.allCases) { style in
@@ -2782,8 +2886,10 @@ struct CalendarSettings: View {
.foregroundStyle(.secondary)
.font(.caption)
) {
- Defaults.Toggle("Show next calendar event", key: .lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show next calendar event"))
+ Defaults.Toggle(key: .lockScreenShowCalendarEvent) {
+ Text("Show next calendar event")
+ }
+ .settingsHighlight(id: highlightID("Show next calendar event"))
LabeledContent("Show events within the next") {
HStack {
@@ -2851,18 +2957,22 @@ struct CalendarSettings: View {
.disabled(!lockScreenShowCalendarEvent)
}
- Defaults.Toggle("Show countdown", key: .lockScreenShowCalendarCountdown)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show countdown"))
+ Defaults.Toggle(key: .lockScreenShowCalendarCountdown) {
+ Text("Show countdown")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show countdown"))
- Defaults.Toggle("Show event for entire duration", key: .lockScreenShowCalendarEventEntireDuration)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show event for entire duration"))
- .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in
- if newValue {
- Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false
- }
+ Defaults.Toggle(key: .lockScreenShowCalendarEventEntireDuration) {
+ Text("Show event for entire duration")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show event for entire duration"))
+ .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in
+ if newValue {
+ Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false
}
+ }
Defaults.Toggle(
"Hide active event and show next upcoming event",
@@ -2895,28 +3005,62 @@ struct CalendarSettings: View {
.font(.caption)
.foregroundStyle(.secondary)
- Defaults.Toggle("Show time remaining", key: .lockScreenShowCalendarTimeRemaining)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show time remaining"))
+ Defaults.Toggle(key: .lockScreenShowCalendarTimeRemaining) {
+ Text("Show time remaining")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show time remaining"))
- Defaults.Toggle("Show start time after event begins", key: .lockScreenShowCalendarStartTimeAfterBegins)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show start time after event begins"))
+ Defaults.Toggle(key: .lockScreenShowCalendarStartTimeAfterBegins) {
+ Text("Show start time after event begins")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show start time after event begins"))
}
Section(header: Text("Select Calendars")) {
- ForEach(calendarManager.allCalendars, id: \.id) { calendar in
- Toggle(isOn: Binding(
- get: { calendarManager.getCalendarSelected(calendar) },
- set: { isSelected in
- Task {
- await calendarManager.setCalendarSelected(calendar, isSelected: isSelected)
+ let grouped = Dictionary(grouping: calendarManager.allCalendars, by: \.accountName)
+ let sortedAccounts = grouped.keys.sorted()
+
+ ForEach(sortedAccounts, id: \.self) { account in
+ let accountCalendars = grouped[account] ?? []
+ let allAccountSelected = accountCalendars.allSatisfy { calendarManager.getCalendarSelected($0) }
+
+ Section(header: HStack {
+ Text(account)
+ Spacer()
+ Toggle("", isOn: Binding(
+ get: { allAccountSelected },
+ set: { isSelected in
+ Task {
+ await calendarManager.setCalendarsSelected(accountCalendars, isSelected: isSelected)
+ }
}
+ ))
+ .labelsHidden()
+ .toggleStyle(.switch)
+ .controlSize(.mini)
+ .disabled(!showCalendar)
+ }) {
+ ForEach(accountCalendars, id: \.id) { calendar in
+ Toggle(isOn: Binding(
+ get: { calendarManager.getCalendarSelected(calendar) },
+ set: { isSelected in
+ Task {
+ await calendarManager.setCalendarSelected(calendar, isSelected: isSelected)
+ }
+ }
+ )) {
+ HStack(spacing: 8) {
+ Circle()
+ .fill(Color(calendar.color))
+ .frame(width: 8, height: 8)
+ Text(calendar.title)
+ }
+ }
+ .disabled(!showCalendar)
}
- )) {
- Text(calendar.title)
}
- .disabled(!showCalendar)
}
}
}
@@ -2929,7 +3073,7 @@ struct CalendarSettings: View {
}
.navigationTitle("Calendar")
}
-
+
private func statusText(for status: EKAuthorizationStatus) -> String {
switch status {
case .fullAccess, .authorized: return "Full Access"
@@ -2940,7 +3084,7 @@ struct CalendarSettings: View {
@unknown default: return "Unknown"
}
}
-
+
private func color(for status: EKAuthorizationStatus) -> Color {
switch status {
case .fullAccess, .authorized: return .green
@@ -3036,10 +3180,10 @@ struct About: View {
.background(.regularMaterial)
}
.toolbar {
-// Button("Welcome window") {
-// openWindow(id: "onboarding")
-// }
-// .controlSize(.extraLarge)
+ // Button("Welcome window") {
+ // openWindow(id: "onboarding")
+ // }
+ // .controlSize(.extraLarge)
CheckForUpdatesView(updater: updaterController.updater)
}
.navigationTitle("About")
@@ -3255,12 +3399,16 @@ struct Shelf: View {
}
Section {
- Defaults.Toggle("Enable shelf", key: .dynamicShelf)
- .disabled(!canEnableShelf)
- .settingsHighlight(id: highlightID("Enable shelf"))
+ Defaults.Toggle(key: .dynamicShelf) {
+ Text("Enable shelf")
+ }
+ .disabled(!canEnableShelf)
+ .settingsHighlight(id: highlightID("Enable shelf"))
- Defaults.Toggle("Open shelf tab by default if items added", key: .openShelfByDefault)
- .settingsHighlight(id: highlightID("Open shelf tab by default if items added"))
+ Defaults.Toggle(key: .openShelfByDefault) {
+ Text("Open shelf tab by default if items added")
+ }
+ .settingsHighlight(id: highlightID("Open shelf tab by default if items added"))
Defaults.Toggle(key: .expandedDragDetection) {
Text("Expanded drag detection area")
@@ -3367,12 +3515,16 @@ struct LiveActivitiesSettings: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Screen Recording Detection", key: .enableScreenRecordingDetection)
- .settingsHighlight(id: highlightID("Enable Screen Recording Detection"))
+ Defaults.Toggle(key: .enableScreenRecordingDetection) {
+ Text("Enable Screen Recording Detection")
+ }
+ .settingsHighlight(id: highlightID("Enable Screen Recording Detection"))
- Defaults.Toggle("Show Recording Indicator", key: .showRecordingIndicator)
- .disabled(!enableScreenRecordingDetection)
- .settingsHighlight(id: highlightID("Show Recording Indicator"))
+ Defaults.Toggle(key: .showRecordingIndicator) {
+ Text("Show Recording Indicator")
+ }
+ .disabled(!enableScreenRecordingDetection)
+ .settingsHighlight(id: highlightID("Show Recording Indicator"))
if recordingManager.isMonitoring {
HStack {
@@ -3412,22 +3564,30 @@ struct LiveActivitiesSettings: View {
)
}
- Defaults.Toggle("Enable Focus Detection", key: .enableDoNotDisturbDetection)
- .settingsHighlight(id: highlightID("Enable Focus Detection"))
+ Defaults.Toggle(key: .enableDoNotDisturbDetection) {
+ Text("Enable Focus Detection")
+ }
+ .settingsHighlight(id: highlightID("Enable Focus Detection"))
- Defaults.Toggle("Show Focus Indicator", key: .showDoNotDisturbIndicator)
- .disabled(!enableDoNotDisturbDetection)
- .settingsHighlight(id: highlightID("Show Focus Indicator"))
+ Defaults.Toggle(key: .showDoNotDisturbIndicator) {
+ Text("Show Focus Indicator")
+ }
+ .disabled(!enableDoNotDisturbDetection)
+ .settingsHighlight(id: highlightID("Show Focus Indicator"))
- Defaults.Toggle("Show Focus Label", key: .showDoNotDisturbLabel)
- .disabled(!enableDoNotDisturbDetection || focusIndicatorNonPersistent)
- .help(focusIndicatorNonPersistent ? "Labels are forced to compact on/off text while brief toast mode is enabled." : "Show the active Focus name inside the indicator.")
- .settingsHighlight(id: highlightID("Show Focus Label"))
+ Defaults.Toggle(key: .showDoNotDisturbLabel) {
+ Text("Show Focus Label")
+ }
+ .disabled(!enableDoNotDisturbDetection || focusIndicatorNonPersistent)
+ .help(focusIndicatorNonPersistent ? "Labels are forced to compact on/off text while brief toast mode is enabled." : "Show the active Focus name inside the indicator.")
+ .settingsHighlight(id: highlightID("Show Focus Label"))
- Defaults.Toggle("Show Focus as brief toast", key: .focusIndicatorNonPersistent)
- .disabled(!enableDoNotDisturbDetection)
- .settingsHighlight(id: highlightID("Show Focus as brief toast"))
- .help("When enabled, Focus appears briefly (on/off) and then collapses instead of staying visible.")
+ Defaults.Toggle(key: .focusIndicatorNonPersistent) {
+ Text("Show Focus as brief toast")
+ }
+ .disabled(!enableDoNotDisturbDetection)
+ .settingsHighlight(id: highlightID("Show Focus as brief toast"))
+ .help("When enabled, Focus appears briefly (on/off) and then collapses instead of staying visible.")
if doNotDisturbManager.isMonitoring {
HStack {
@@ -3461,12 +3621,16 @@ struct LiveActivitiesSettings: View {
}
Section {
- Defaults.Toggle("Show Caps Lock Indicator", key: .enableCapsLockIndicator)
- .settingsHighlight(id: highlightID("Show Caps Lock Indicator"))
+ Defaults.Toggle(key: .enableCapsLockIndicator) {
+ Text("Show Caps Lock Indicator")
+ }
+ .settingsHighlight(id: highlightID("Show Caps Lock Indicator"))
- Defaults.Toggle("Show Caps Lock label", key: .showCapsLockLabel)
- .disabled(!Defaults[.enableCapsLockIndicator])
- .settingsHighlight(id: highlightID("Show Caps Lock label"))
+ Defaults.Toggle(key: .showCapsLockLabel) {
+ Text("Show Caps Lock label")
+ }
+ .disabled(!Defaults[.enableCapsLockIndicator])
+ .settingsHighlight(id: highlightID("Show Caps Lock label"))
Picker("Caps Lock color", selection: $capsLockTintMode) {
ForEach(CapsLockIndicatorTintMode.allCases) { mode in
@@ -3483,10 +3647,14 @@ struct LiveActivitiesSettings: View {
}
Section {
- Defaults.Toggle("Enable Camera Detection", key: .enableCameraDetection)
- .settingsHighlight(id: highlightID("Enable Camera Detection"))
- Defaults.Toggle("Enable Microphone Detection", key: .enableMicrophoneDetection)
- .settingsHighlight(id: highlightID("Enable Microphone Detection"))
+ Defaults.Toggle(key: .enableCameraDetection) {
+ Text("Enable Camera Detection")
+ }
+ .settingsHighlight(id: highlightID("Enable Camera Detection"))
+ Defaults.Toggle(key: .enableMicrophoneDetection) {
+ Text("Enable Microphone Detection")
+ }
+ .settingsHighlight(id: highlightID("Enable Microphone Detection"))
if privacyManager.isMonitoring {
HStack {
@@ -3542,8 +3710,10 @@ struct LiveActivitiesSettings: View {
}
Section {
- Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity)
- .settingsHighlight(id: highlightID("Enable reminder live activity"))
+ Defaults.Toggle(key: .enableReminderLiveActivity) {
+ Text("Enable reminder live activity")
+ }
+ .settingsHighlight(id: highlightID("Enable reminder live activity"))
} header: {
Text("Reminder Live Activity")
} footer: {
@@ -3643,14 +3813,22 @@ struct Appearance: View {
Form {
Section {
Toggle("Always show tabs", isOn: $coordinator.alwaysShowTabs)
- Defaults.Toggle("Settings icon in notch", key: .settingsIconInNotch)
- .settingsHighlight(id: highlightID("Settings icon in notch"))
- Defaults.Toggle("Enable window shadow", key: .enableShadow)
- .settingsHighlight(id: highlightID("Enable window shadow"))
- Defaults.Toggle("Corner radius scaling", key: .cornerRadiusScaling)
- .settingsHighlight(id: highlightID("Corner radius scaling"))
- Defaults.Toggle("Use simpler close animation", key: .useModernCloseAnimation)
- .settingsHighlight(id: highlightID("Use simpler close animation"))
+ Defaults.Toggle(key: .settingsIconInNotch) {
+ Text("Settings icon in notch")
+ }
+ .settingsHighlight(id: highlightID("Settings icon in notch"))
+ Defaults.Toggle(key: .enableShadow) {
+ Text("Enable window shadow")
+ }
+ .settingsHighlight(id: highlightID("Enable window shadow"))
+ Defaults.Toggle(key: .cornerRadiusScaling) {
+ Text("Corner radius scaling")
+ }
+ .settingsHighlight(id: highlightID("Corner radius scaling"))
+ Defaults.Toggle(key: .useModernCloseAnimation) {
+ Text("Use simpler close animation")
+ }
+ .settingsHighlight(id: highlightID("Use simpler close animation"))
} header: {
Text("General")
}
@@ -3756,12 +3934,16 @@ struct Appearance: View {
}
Section {
- Defaults.Toggle("Enable colored spectrograms", key: .coloredSpectrogram)
- .settingsHighlight(id: highlightID("Enable colored spectrograms"))
+ Defaults.Toggle(key: .coloredSpectrogram) {
+ Text("Enable colored spectrograms")
+ }
+ .settingsHighlight(id: highlightID("Enable colored spectrograms"))
Defaults
.Toggle("Player tinting", key: .playerColorTinting)
- Defaults.Toggle("Enable blur effect behind album art", key: .lightingEffect)
- .settingsHighlight(id: highlightID("Enable blur effect behind album art"))
+ Defaults.Toggle(key: .lightingEffect) {
+ Text("Enable blur effect behind album art")
+ }
+ .settingsHighlight(id: highlightID("Enable blur effect behind album art"))
Picker("Slider color", selection: $sliderColor) {
ForEach(SliderColorEnum.allCases, id: \.self) { option in
Text(option.rawValue)
@@ -3941,9 +4123,11 @@ struct Appearance: View {
}
Section {
- Defaults.Toggle("Enable Dynamic mirror", key: .showMirror)
- .disabled(!checkVideoInput())
- .settingsHighlight(id: highlightID("Enable Dynamic mirror"))
+ Defaults.Toggle(key: .showMirror) {
+ Text("Enable Dynamic mirror")
+ }
+ .disabled(!checkVideoInput())
+ .settingsHighlight(id: highlightID("Enable Dynamic mirror"))
Picker("Mirror shape", selection: $mirrorShape) {
Text("Circle")
.tag(MirrorShapeEnum.circle)
@@ -3951,14 +4135,16 @@ struct Appearance: View {
.tag(MirrorShapeEnum.rectangle)
}
.settingsHighlight(id: highlightID("Mirror shape"))
- Defaults.Toggle("Idle Animation", key: .showNotHumanFace)
- .settingsHighlight(id: highlightID("Idle Animation"))
+ Defaults.Toggle(key: .showNotHumanFace) {
+ Text("Idle Animation")
+ }
+ .settingsHighlight(id: highlightID("Idle Animation"))
} header: {
HStack {
Text("Additional features")
}
}
-
+
// MARK: - Custom Idle Animations Section
IdleAnimationsSettingsSection()
@@ -4217,8 +4403,8 @@ struct Appearance: View {
}
let description = enableMinimalisticUI
- ? "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value."
- : "Recommended minimum width adjusts automatically based on the number of enabled tabs."
+ ? "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value."
+ : "Recommended minimum width adjusts automatically based on the number of enabled tabs."
Text(description)
.font(.caption)
@@ -4282,6 +4468,12 @@ struct LockScreenSettings: View {
@Default(.lockScreenCalendarSelectionMode) private var lockScreenCalendarSelectionMode
@Default(.lockScreenSelectedCalendarIDs) private var lockScreenSelectedCalendarIDs
@Default(.lockScreenShowCalendarEventAfterStartEnabled) private var lockScreenShowCalendarEventAfterStartEnabled
+ @Default(.lockScreenMusicMergedAirPlayOutput) private var lockScreenMusicMergedAirPlayOutput
+ @ObservedObject private var musicManager = MusicManager.shared
+
+ private var isAppleMusicActive: Bool {
+ musicManager.bundleIdentifier == "com.apple.Music"
+ }
private func highlightID(_ title: String) -> String {
SettingsTab.lockScreen.highlightID(for: title)
@@ -4363,10 +4555,14 @@ struct LockScreenSettings: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable lock screen live activity", key: .enableLockScreenLiveActivity)
- .settingsHighlight(id: highlightID("Enable lock screen live activity"))
- Defaults.Toggle("Play lock/unlock sounds", key: .enableLockSounds)
- .settingsHighlight(id: highlightID("Play lock/unlock sounds"))
+ Defaults.Toggle(key: .enableLockScreenLiveActivity) {
+ Text("Enable lock screen live activity")
+ }
+ .settingsHighlight(id: highlightID("Enable lock screen live activity"))
+ Defaults.Toggle(key: .enableLockSounds) {
+ Text("Play lock/unlock sounds")
+ }
+ .settingsHighlight(id: highlightID("Play lock/unlock sounds"))
} header: {
Text("Live Activity & Feedback")
} footer: {
@@ -4432,14 +4628,25 @@ struct LockScreenSettings: View {
}
Section {
- Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget)
- .settingsHighlight(id: highlightID("Show lock screen media panel"))
- Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon)
- .disabled(!enableLockScreenMediaWidget)
- .settingsHighlight(id: highlightID("Show media app icon"))
- Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder)
- .disabled(!enableLockScreenMediaWidget)
- .settingsHighlight(id: highlightID("Show panel border"))
+ Defaults.Toggle(key: .enableLockScreenMediaWidget) {
+ Text("Show lock screen media panel")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen media panel"))
+ Defaults.Toggle(key: .lockScreenShowAppIcon) {
+ Text("Show media app icon")
+ }
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Show media app icon"))
+ if isAppleMusicActive {
+ Defaults.Toggle("Show merged AirPlay and output devices", key: .lockScreenMusicMergedAirPlayOutput)
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Show merged AirPlay and output devices"))
+ }
+ Defaults.Toggle(key: .lockScreenPanelShowsBorder) {
+ Text("Show panel border")
+ }
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Show panel border"))
if lockScreenGlassCustomizationMode == .customLiquid {
variantSlider(
title: "Music panel variant",
@@ -4449,9 +4656,11 @@ struct LockScreenSettings: View {
highlight: highlightID("Music panel variant")
)
} else if lockScreenGlassStyle == .frosted {
- Defaults.Toggle("Enable media panel blur", key: .lockScreenPanelUsesBlur)
- .disabled(!enableLockScreenMediaWidget)
- .settingsHighlight(id: highlightID("Enable media panel blur"))
+ Defaults.Toggle(key: .lockScreenPanelUsesBlur) {
+ Text("Enable media panel blur")
+ }
+ .disabled(!enableLockScreenMediaWidget)
+ .settingsHighlight(id: highlightID("Enable media panel blur"))
} else {
blurSettingUnavailableRow
.opacity(enableLockScreenMediaWidget ? 1 : 0.5)
@@ -4473,8 +4682,10 @@ struct LockScreenSettings: View {
.opacity(showStandardMediaControls ? 1 : 0.5)
Section {
- Defaults.Toggle("Show lock screen timer", key: .enableLockScreenTimerWidget)
- .settingsHighlight(id: highlightID("Show lock screen timer"))
+ Defaults.Toggle(key: .enableLockScreenTimerWidget) {
+ Text("Show lock screen timer")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen timer"))
Picker("Timer surface", selection: timerSurfaceBinding) {
ForEach(LockScreenTimerSurfaceMode.allCases) { mode in
Text(mode.rawValue).tag(mode)
@@ -4535,8 +4746,10 @@ struct LockScreenSettings: View {
}
Section {
- Defaults.Toggle("Show lock screen weather", key: .enableLockScreenWeatherWidget)
- .settingsHighlight(id: highlightID("Show lock screen weather"))
+ Defaults.Toggle(key: .enableLockScreenWeatherWidget) {
+ Text("Show lock screen weather")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen weather"))
if enableLockScreenWeatherWidget {
Picker("Layout", selection: $lockScreenWeatherWidgetStyle) {
@@ -4563,17 +4776,23 @@ struct LockScreenSettings: View {
.pickerStyle(.segmented)
.settingsHighlight(id: highlightID("Temperature unit"))
- Defaults.Toggle("Show location label", key: .lockScreenWeatherShowsLocation)
- .disabled(lockScreenWeatherWidgetStyle == .circular)
- .settingsHighlight(id: highlightID("Show location label"))
+ Defaults.Toggle(key: .lockScreenWeatherShowsLocation) {
+ Text("Show location label")
+ }
+ .disabled(lockScreenWeatherWidgetStyle == .circular)
+ .settingsHighlight(id: highlightID("Show location label"))
- Defaults.Toggle("Show sunrise time", key: .lockScreenWeatherShowsSunrise)
- .disabled(lockScreenWeatherWidgetStyle != .inline)
- .settingsHighlight(id: highlightID("Show sunrise time"))
+ Defaults.Toggle(key: .lockScreenWeatherShowsSunrise) {
+ Text("Show sunrise time")
+ }
+ .disabled(lockScreenWeatherWidgetStyle != .inline)
+ .settingsHighlight(id: highlightID("Show sunrise time"))
- Defaults.Toggle("Show AQI widget", key: .lockScreenWeatherShowsAQI)
- .disabled(!lockScreenWeatherProviderSource.supportsAirQuality)
- .settingsHighlight(id: highlightID("Show AQI widget"))
+ Defaults.Toggle(key: .lockScreenWeatherShowsAQI) {
+ Text("Show AQI widget")
+ }
+ .disabled(!lockScreenWeatherProviderSource.supportsAirQuality)
+ .settingsHighlight(id: highlightID("Show AQI widget"))
if lockScreenWeatherShowsAQI && lockScreenWeatherProviderSource.supportsAirQuality {
Picker("Air quality scale", selection: $lockScreenWeatherAQIScale) {
@@ -4591,8 +4810,10 @@ struct LockScreenSettings: View {
.foregroundStyle(.secondary)
}
- Defaults.Toggle("Use colored gauges", key: .lockScreenWeatherUsesGaugeTint)
- .settingsHighlight(id: highlightID("Use colored gauges"))
+ Defaults.Toggle(key: .lockScreenWeatherUsesGaugeTint) {
+ Text("Use colored gauges")
+ }
+ .settingsHighlight(id: highlightID("Use colored gauges"))
}
} header: {
Text("Weather Widget")
@@ -4601,8 +4822,10 @@ struct LockScreenSettings: View {
}
Section {
- Defaults.Toggle("Show lock screen reminder", key: .enableLockScreenReminderWidget)
- .settingsHighlight(id: highlightID("Show lock screen reminder"))
+ Defaults.Toggle(key: .enableLockScreenReminderWidget) {
+ Text("Show lock screen reminder")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen reminder"))
Picker("Chip color", selection: $lockScreenReminderChipStyle) {
ForEach(LockScreenReminderChipStyle.allCases) { style in
@@ -4640,26 +4863,36 @@ struct LockScreenSettings: View {
} footer: {
Text("Controls the lock screen reminder chip and its positioning.")
}
-
+
if BatteryActivityManager.shared.hasBattery() {
Section {
- Defaults.Toggle("Show battery indicator", key: .lockScreenBatteryShowsBatteryGauge)
- .settingsHighlight(id: highlightID("Show battery indicator"))
-
+ Defaults.Toggle(key: .lockScreenBatteryShowsBatteryGauge) {
+ Text("Show battery indicator")
+ }
+ .settingsHighlight(id: highlightID("Show battery indicator"))
+
if lockScreenWeatherShowsBatteryGauge {
- Defaults.Toggle("Use MacBook icon when on battery", key: .lockScreenBatteryUsesLaptopSymbol)
- .settingsHighlight(id: highlightID("Use MacBook icon when on battery"))
-
- Defaults.Toggle("Show charging status", key: .lockScreenBatteryShowsCharging)
- .settingsHighlight(id: highlightID("Show charging status"))
-
- if lockScreenWeatherShowsCharging {
- Defaults.Toggle("Show charging percentage", key: .lockScreenBatteryShowsChargingPercentage)
- .settingsHighlight(id: highlightID("Show charging percentage"))
+ Defaults.Toggle(key: .lockScreenBatteryUsesLaptopSymbol) {
+ Text("Use MacBook icon when on battery")
}
-
- Defaults.Toggle("Show Bluetooth battery", key: .lockScreenBatteryShowsBluetooth)
- .settingsHighlight(id: highlightID("Show Bluetooth battery"))
+ .settingsHighlight(id: highlightID("Use MacBook icon when on battery"))
+
+ Defaults.Toggle(key: .lockScreenBatteryShowsCharging) {
+ Text("Show charging status")
+ }
+ .settingsHighlight(id: highlightID("Show charging status"))
+
+ if lockScreenWeatherShowsCharging {
+ Defaults.Toggle(key: .lockScreenBatteryShowsChargingPercentage) {
+ Text("Show charging percentage")
+ }
+ .settingsHighlight(id: highlightID("Show charging percentage"))
+ }
+
+ Defaults.Toggle(key: .lockScreenBatteryShowsBluetooth) {
+ Text("Show Bluetooth battery")
+ }
+ .settingsHighlight(id: highlightID("Show Bluetooth battery"))
}
} header: {
Text("Battery Widget")
@@ -4669,8 +4902,10 @@ struct LockScreenSettings: View {
}
Section {
- Defaults.Toggle("Show focus widget", key: .enableLockScreenFocusWidget)
- .settingsHighlight(id: highlightID("Show focus widget"))
+ Defaults.Toggle(key: .enableLockScreenFocusWidget) {
+ Text("Show focus widget")
+ }
+ .settingsHighlight(id: highlightID("Show focus widget"))
} header: {
Text("Focus Widget")
} footer: {
@@ -4678,8 +4913,10 @@ struct LockScreenSettings: View {
}
Section {
- Defaults.Toggle("Show next calendar event", key: .lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show next calendar event"))
+ Defaults.Toggle(key: .lockScreenShowCalendarEvent) {
+ Text("Show next calendar event")
+ }
+ .settingsHighlight(id: highlightID("Show next calendar event"))
LabeledContent("Show events within the next") {
HStack {
@@ -4747,18 +4984,22 @@ struct LockScreenSettings: View {
.disabled(!lockScreenShowCalendarEvent)
}
- Defaults.Toggle("Show countdown", key: .lockScreenShowCalendarCountdown)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show countdown"))
+ Defaults.Toggle(key: .lockScreenShowCalendarCountdown) {
+ Text("Show countdown")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show countdown"))
- Defaults.Toggle("Show event for entire duration", key: .lockScreenShowCalendarEventEntireDuration)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show event for entire duration"))
- .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in
- if newValue {
- Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false
- }
+ Defaults.Toggle(key: .lockScreenShowCalendarEventEntireDuration) {
+ Text("Show event for entire duration")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show event for entire duration"))
+ .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in
+ if newValue {
+ Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false
}
+ }
Defaults.Toggle(
"Hide active event and show next upcoming event",
@@ -4791,13 +5032,17 @@ struct LockScreenSettings: View {
.font(.caption)
.foregroundStyle(.secondary)
- Defaults.Toggle("Show time remaining", key: .lockScreenShowCalendarTimeRemaining)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show time remaining"))
+ Defaults.Toggle(key: .lockScreenShowCalendarTimeRemaining) {
+ Text("Show time remaining")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show time remaining"))
- Defaults.Toggle("Show start time after event begins", key: .lockScreenShowCalendarStartTimeAfterBegins)
- .disabled(!lockScreenShowCalendarEvent)
- .settingsHighlight(id: highlightID("Show start time after event begins"))
+ Defaults.Toggle(key: .lockScreenShowCalendarStartTimeAfterBegins) {
+ Text("Show start time after event begins")
+ }
+ .disabled(!lockScreenShowCalendarEvent)
+ .settingsHighlight(id: highlightID("Show start time after event begins"))
} header: {
Text("Calendar Widget")
} footer: {
@@ -4998,8 +5243,8 @@ private struct LockScreenPositioningControls: View {
musicWidth: musicWidthBinding,
timerWidth: timerWidthBinding
)
- .frame(height: 260)
- .padding(.vertical, 8)
+ .frame(height: 260)
+ .padding(.vertical, 8)
HStack(alignment: .top, spacing: 24) {
offsetColumn(
@@ -5454,16 +5699,18 @@ struct Shortcuts: View {
@Default(.enableShortcuts) var enableShortcuts
@Default(.enableStatsFeature) var enableStatsFeature
@Default(.enableColorPickerFeature) var enableColorPickerFeature
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.shortcuts.highlightID(for: title)
}
-
+
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable global keyboard shortcuts", key: .enableShortcuts)
- .settingsHighlight(id: highlightID("Enable global keyboard shortcuts"))
+ Defaults.Toggle(key: .enableShortcuts) {
+ Text("Enable global keyboard shortcuts")
+ }
+ .settingsHighlight(id: highlightID("Enable global keyboard shortcuts"))
} header: {
Text("General")
} footer: {
@@ -5472,7 +5719,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
if enableShortcuts {
Section {
KeyboardShortcuts.Recorder("Toggle Sneak Peek:", name: .toggleSneakPeek)
@@ -5485,7 +5732,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
KeyboardShortcuts.Recorder("Toggle Notch Open:", name: .toggleNotchOpen)
.disabled(!enableShortcuts)
@@ -5497,7 +5744,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
VStack(alignment: .leading) {
@@ -5520,7 +5767,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
VStack(alignment: .leading) {
@@ -5543,7 +5790,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
VStack(alignment: .leading) {
@@ -5566,7 +5813,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
VStack(alignment: .leading) {
@@ -5589,7 +5836,7 @@ struct Shortcuts: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
VStack(alignment: .leading) {
@@ -5618,7 +5865,7 @@ struct Shortcuts: View {
Text("Keyboard shortcuts are disabled")
.font(.headline)
.foregroundStyle(.secondary)
-
+
Text("Enable global keyboard shortcuts above to customize your shortcuts.")
.font(.caption)
.foregroundStyle(.secondary)
@@ -5713,7 +5960,7 @@ struct TimerSettings: View {
@State private var customMinutes: Int = 10
@State private var customSeconds: Int = 0
@State private var showingResetConfirmation = false
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.timer.highlightID(for: title)
}
@@ -5738,7 +5985,7 @@ struct TimerSettings: View {
set: { mode in timerGlassModeIsGlass = (mode == .glass) }
)
}
-
+
var body: some View {
Form {
timerFeatureSection
@@ -5755,8 +6002,10 @@ struct TimerSettings: View {
@ViewBuilder
private var timerFeatureSection: some View {
Section {
- Defaults.Toggle("Enable timer feature", key: .enableTimerFeature)
- .settingsHighlight(id: highlightID("Enable timer feature"))
+ Defaults.Toggle(key: .enableTimerFeature) {
+ Text("Enable timer feature")
+ }
+ .settingsHighlight(id: highlightID("Enable timer feature"))
if enableTimerFeature {
Toggle("Enable timer live activity", isOn: $coordinator.timerLiveActivityEnabled)
@@ -5767,8 +6016,8 @@ struct TimerSettings: View {
alphaBadge()
}
}
- .help("Shows the system Clock timer in the notch when available. Requires Accessibility permission to read the status item.")
- .settingsHighlight(id: highlightID("Mirror macOS Clock timers"))
+ .help("Shows the system Clock timer in the notch when available. Requires Accessibility permission to read the status item.")
+ .settingsHighlight(id: highlightID("Mirror macOS Clock timers"))
Picker("Timer controls appear as", selection: $timerDisplayMode) {
ForEach(TimerDisplayMode.allCases) { mode in
@@ -5810,8 +6059,10 @@ struct TimerSettings: View {
@ViewBuilder
private var lockScreenIntegrationSection: some View {
Section {
- Defaults.Toggle("Show lock screen timer widget", key: .enableLockScreenTimerWidget)
- .settingsHighlight(id: highlightID("Show lock screen timer widget"))
+ Defaults.Toggle(key: .enableLockScreenTimerWidget) {
+ Text("Show lock screen timer widget")
+ }
+ .settingsHighlight(id: highlightID("Show lock screen timer widget"))
Picker("Timer surface", selection: timerSurfaceBinding) {
ForEach(LockScreenTimerSurfaceMode.allCases) { mode in
Text(mode.rawValue).tag(mode)
@@ -6025,14 +6276,14 @@ struct TimerSettings: View {
Text("Select a custom sound to play when a timer ends. Supported formats include MP3, M4A, WAV, and AIFF.")
}
}
-
+
private var customDurationDisplay: String {
let formatter = DateComponentsFormatter()
formatter.allowedUnits = customTimerDuration >= 3600 ? [.hour, .minute, .second] : [.minute, .second]
formatter.zeroFormattingBehavior = [.pad]
return formatter.string(from: customTimerDuration) ?? "0:00"
}
-
+
private func syncCustomDuration(_ value: Double? = nil) {
let baseValue = value ?? customTimerDuration
let components = TimerPreset.components(for: baseValue)
@@ -6040,12 +6291,12 @@ struct TimerSettings: View {
customMinutes = components.minutes
customSeconds = components.seconds
}
-
+
private func updateCustomDuration() {
let duration = TimeInterval(customHours * 3600 + customMinutes * 60 + customSeconds)
customTimerDuration = duration
}
-
+
private func addPreset() {
let nextIndex = timerPresets.count + 1
let defaultColor = Defaults[.accentColor]
@@ -6054,34 +6305,34 @@ struct TimerSettings: View {
timerPresets.append(newPreset)
}
}
-
+
private func movePresetUp(_ index: Int) {
guard index > timerPresets.startIndex else { return }
_ = withAnimation(.smooth) {
timerPresets.swapAt(index, index - 1)
}
}
-
+
private func movePresetDown(_ index: Int) {
guard index < timerPresets.index(before: timerPresets.endIndex) else { return }
_ = withAnimation(.smooth) {
timerPresets.swapAt(index, index + 1)
}
}
-
+
private func removePreset(_ index: Int) {
guard timerPresets.indices.contains(index) else { return }
_ = withAnimation(.smooth) {
timerPresets.remove(at: index)
}
}
-
+
private func resetPresets() {
_ = withAnimation(.smooth) {
timerPresets = TimerPreset.defaultPresets
}
}
-
+
private func selectCustomTimerSound() {
let panel = NSOpenPanel()
panel.title = "Select Timer Sound"
@@ -6089,7 +6340,7 @@ struct TimerSettings: View {
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
-
+
if panel.runModal() == .OK {
if let url = panel.url {
UserDefaults.standard.set(url.path, forKey: "customTimerSoundPath")
@@ -6102,7 +6353,7 @@ private struct TimerDurationStepperRow: View {
let title: String
@Binding var value: Int
let range: ClosedRange
-
+
var body: some View {
Stepper(value: $value, in: range) {
HStack {
@@ -6172,39 +6423,39 @@ private struct TimerPresetEditorRow: View {
self.moveDown = moveDown
self.remove = remove
}
-
+
private var components: TimerPreset.DurationComponents {
TimerPreset.components(for: preset.duration)
}
-
+
private var hoursBinding: Binding {
Binding(
get: { components.hours },
set: { updateDuration(hours: $0) }
)
}
-
+
private var minutesBinding: Binding {
Binding(
get: { components.minutes },
set: { updateDuration(minutes: $0) }
)
}
-
+
private var secondsBinding: Binding {
Binding(
get: { components.seconds },
set: { updateDuration(seconds: $0) }
)
}
-
+
private var colorBinding: Binding {
Binding(
get: { preset.color },
set: { preset.updateColor($0) }
)
}
-
+
var body: some View {
VStack(alignment: .leading, spacing: 12) {
HStack(spacing: 10) {
@@ -6215,41 +6466,41 @@ private struct TimerPresetEditorRow: View {
Circle()
.stroke(Color.white.opacity(0.3), lineWidth: 1)
)
-
+
TextField("Preset name", text: $preset.name)
.textFieldStyle(.roundedBorder)
-
+
Spacer()
-
+
Text(preset.formattedDuration)
.font(.system(size: 12, weight: .medium, design: .monospaced))
.foregroundStyle(.secondary)
}
-
+
HStack(spacing: 16) {
TimerPresetComponentControl(title: "Hours", value: hoursBinding, range: 0...23)
TimerPresetComponentControl(title: "Minutes", value: minutesBinding, range: 0...59)
TimerPresetComponentControl(title: "Seconds", value: secondsBinding, range: 0...59)
}
-
+
ColorPicker("Accent colour", selection: colorBinding, supportsOpacity: false)
.frame(maxWidth: 240, alignment: .leading)
-
+
HStack(spacing: 12) {
Button(action: moveUp) {
Label("Move Up", systemImage: "chevron.up")
}
.buttonStyle(.bordered)
.disabled(isFirst)
-
+
Button(action: moveDown) {
Label("Move Down", systemImage: "chevron.down")
}
.buttonStyle(.bordered)
.disabled(isLast)
-
+
Spacer()
-
+
Button(role: .destructive, action: remove) {
Label("Delete", systemImage: "trash")
}
@@ -6260,7 +6511,7 @@ private struct TimerPresetEditorRow: View {
.padding(.vertical, 6)
.settingsHighlightIfPresent(highlightID)
}
-
+
private func updateDuration(hours: Int? = nil, minutes: Int? = nil, seconds: Int? = nil) {
var values = components
if let hours { values.hours = hours }
@@ -6274,7 +6525,7 @@ private struct TimerPresetComponentControl: View {
let title: String
@Binding var value: Int
let range: ClosedRange
-
+
var body: some View {
Stepper(value: $value, in: range) {
VStack(alignment: .leading, spacing: 4) {
@@ -6300,11 +6551,11 @@ struct StatsSettings: View {
@Default(.showNetworkGraph) var showNetworkGraph
@Default(.showDiskGraph) var showDiskGraph
@Default(.cpuTemperatureUnit) var cpuTemperatureUnit
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.stats.highlightID(for: title)
}
-
+
var enabledGraphsCount: Int {
[showCpuGraph, showMemoryGraph, showGpuGraph, showNetworkGraph, showDiskGraph].filter { $0 }.count
}
@@ -6323,19 +6574,21 @@ struct StatsSettings: View {
private var shouldShowStatsBatteryWarning: Bool {
!statsStopWhenNotchCloses && statsUpdateInterval <= 5
}
-
+
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable system stats monitoring", key: .enableStatsFeature)
- .settingsHighlight(id: highlightID("Enable system stats monitoring"))
- .onChange(of: enableStatsFeature) { _, newValue in
- if !newValue {
- statsManager.stopMonitoring()
- }
- // Note: Smart monitoring will handle starting when switching to stats tab
+ Defaults.Toggle(key: .enableStatsFeature) {
+ Text("Enable system stats monitoring")
+ }
+ .settingsHighlight(id: highlightID("Enable system stats monitoring"))
+ .onChange(of: enableStatsFeature) { _, newValue in
+ if !newValue {
+ statsManager.stopMonitoring()
}
-
+ // Note: Smart monitoring will handle starting when switching to stats tab
+ }
+
} header: {
Text("General")
} footer: {
@@ -6344,12 +6597,14 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
if enableStatsFeature {
Section {
- Defaults.Toggle("Stop monitoring after closing the notch", key: .statsStopWhenNotchCloses)
- .settingsHighlight(id: highlightID("Stop monitoring after closing the notch"))
- .help("When enabled, stats monitoring stops a few seconds after the notch closes.")
+ Defaults.Toggle(key: .statsStopWhenNotchCloses) {
+ Text("Stop monitoring after closing the notch")
+ }
+ .settingsHighlight(id: highlightID("Stop monitoring after closing the notch"))
+ .help("When enabled, stats monitoring stops a few seconds after the notch closes.")
VStack(alignment: .leading, spacing: 8) {
HStack {
@@ -6387,8 +6642,10 @@ struct StatsSettings: View {
}
Section {
- Defaults.Toggle("CPU Usage", key: .showCpuGraph)
- .settingsHighlight(id: highlightID("CPU Usage"))
+ Defaults.Toggle(key: .showCpuGraph) {
+ Text("CPU Usage")
+ }
+ .settingsHighlight(id: highlightID("CPU Usage"))
if showCpuGraph {
Picker("Temperature unit", selection: $cpuTemperatureUnit) {
@@ -6399,14 +6656,22 @@ struct StatsSettings: View {
.pickerStyle(.segmented)
.settingsHighlight(id: highlightID("Temperature unit"))
}
- Defaults.Toggle("Memory Usage", key: .showMemoryGraph)
- .settingsHighlight(id: highlightID("Memory Usage"))
- Defaults.Toggle("GPU Usage", key: .showGpuGraph)
- .settingsHighlight(id: highlightID("GPU Usage"))
- Defaults.Toggle("Network Activity", key: .showNetworkGraph)
- .settingsHighlight(id: highlightID("Network Activity"))
- Defaults.Toggle("Disk I/O", key: .showDiskGraph)
- .settingsHighlight(id: highlightID("Disk I/O"))
+ Defaults.Toggle(key: .showMemoryGraph) {
+ Text("Memory Usage")
+ }
+ .settingsHighlight(id: highlightID("Memory Usage"))
+ Defaults.Toggle(key: .showGpuGraph) {
+ Text("GPU Usage")
+ }
+ .settingsHighlight(id: highlightID("GPU Usage"))
+ Defaults.Toggle(key: .showNetworkGraph) {
+ Text("Network Activity")
+ }
+ .settingsHighlight(id: highlightID("Network Activity"))
+ Defaults.Toggle(key: .showDiskGraph) {
+ Text("Disk I/O")
+ }
+ .settingsHighlight(id: highlightID("Disk I/O"))
} header: {
Text("Graph Visibility")
} footer: {
@@ -6422,7 +6687,7 @@ struct StatsSettings: View {
.font(.caption)
}
}
-
+
Section {
HStack {
Text("Monitoring Status")
@@ -6435,7 +6700,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
if statsManager.isMonitoring {
if showCpuGraph {
HStack {
@@ -6445,7 +6710,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
if showMemoryGraph {
HStack {
Text("Memory Usage")
@@ -6454,7 +6719,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
if showGpuGraph {
HStack {
Text("GPU Usage")
@@ -6463,7 +6728,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
if showNetworkGraph {
HStack {
Text("Network Download")
@@ -6471,7 +6736,7 @@ struct StatsSettings: View {
Text(String(format: "%.1f MB/s", statsManager.networkDownload))
.foregroundStyle(.secondary)
}
-
+
HStack {
Text("Network Upload")
Spacer()
@@ -6479,7 +6744,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
if showDiskGraph {
HStack {
Text("Disk Read")
@@ -6487,7 +6752,7 @@ struct StatsSettings: View {
Text(String(format: "%.1f MB/s", statsManager.diskRead))
.foregroundStyle(.secondary)
}
-
+
HStack {
Text("Disk Write")
Spacer()
@@ -6495,7 +6760,7 @@ struct StatsSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
HStack {
Text("Last Updated")
Spacer()
@@ -6506,7 +6771,7 @@ struct StatsSettings: View {
} header: {
Text("Live Performance Data")
}
-
+
Section {
HStack {
Button(statsManager.isMonitoring ? "Stop Monitoring" : "Start Monitoring") {
@@ -6518,9 +6783,9 @@ struct StatsSettings: View {
}
.buttonStyle(.borderedProminent)
.foregroundColor(statsManager.isMonitoring ? .red : .blue)
-
+
Spacer()
-
+
Button("Clear Data") {
statsManager.clearHistory()
}
@@ -6542,34 +6807,38 @@ struct ClipboardSettings: View {
@Default(.clipboardHistorySize) var clipboardHistorySize
@Default(.showClipboardIcon) var showClipboardIcon
@Default(.clipboardDisplayMode) var clipboardDisplayMode
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.clipboard.highlightID(for: title)
}
-
+
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Clipboard Manager", key: .enableClipboardManager)
- .settingsHighlight(id: highlightID("Enable Clipboard Manager"))
- .onChange(of: enableClipboardManager) { _, enabled in
- if enabled {
- clipboardManager.startMonitoring()
- } else {
- clipboardManager.stopMonitoring()
- }
+ Defaults.Toggle(key: .enableClipboardManager) {
+ Text("Enable Clipboard Manager")
+ }
+ .settingsHighlight(id: highlightID("Enable Clipboard Manager"))
+ .onChange(of: enableClipboardManager) { _, enabled in
+ if enabled {
+ clipboardManager.startMonitoring()
+ } else {
+ clipboardManager.stopMonitoring()
}
+ }
} header: {
Text("Clipboard Manager")
} footer: {
Text("Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history.")
}
-
+
if enableClipboardManager {
Section {
- Defaults.Toggle("Show Clipboard Icon", key: .showClipboardIcon)
- .settingsHighlight(id: highlightID("Show Clipboard Icon"))
-
+ Defaults.Toggle(key: .showClipboardIcon) {
+ Text("Show Clipboard Icon")
+ }
+ .settingsHighlight(id: highlightID("Show Clipboard Icon"))
+
HStack {
Text("Display Mode")
Spacer()
@@ -6582,7 +6851,7 @@ struct ClipboardSettings: View {
.frame(minWidth: 100)
}
.settingsHighlight(id: highlightID("Display Mode"))
-
+
HStack {
Text("History Size")
Spacer()
@@ -6596,21 +6865,21 @@ struct ClipboardSettings: View {
.frame(minWidth: 100)
}
.settingsHighlight(id: highlightID("History Size"))
-
+
HStack {
Text("Current Items")
Spacer()
Text("\(clipboardManager.clipboardHistory.count)")
.foregroundColor(.secondary)
}
-
+
HStack {
Text("Pinned Items")
Spacer()
Text("\(clipboardManager.pinnedItems.count)")
.foregroundColor(.secondary)
}
-
+
HStack {
Text("Monitoring Status")
Spacer()
@@ -6629,14 +6898,14 @@ struct ClipboardSettings: View {
Text("Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left.")
}
}
-
+
Section {
Button("Clear Clipboard History") {
clipboardManager.clearHistory()
}
.foregroundColor(.red)
.disabled(clipboardManager.clipboardHistory.isEmpty)
-
+
Button("Clear Pinned Items") {
clipboardManager.pinnedItems.removeAll()
clipboardManager.savePinnedItemsToDefaults()
@@ -6648,7 +6917,7 @@ struct ClipboardSettings: View {
} footer: {
Text("Clear clipboard history removes recent copies. Clear pinned items removes your favorites. Both actions are permanent.")
}
-
+
if !clipboardManager.clipboardHistory.isEmpty {
Section {
ForEach(clipboardManager.clipboardHistory) { item in
@@ -6685,10 +6954,10 @@ struct ClipboardSettings: View {
}
}
}
-
+
private func timeAgoString(from date: Date) -> String {
let interval = Date().timeIntervalSince(date)
-
+
if interval < 60 {
return "Just now"
} else if interval < 3600 {
@@ -6711,22 +6980,24 @@ struct ScreenAssistantSettings: View {
@Default(.geminiApiKey) var geminiApiKey
@State private var apiKeyText = ""
@State private var showingApiKey = false
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.screenAssistant.highlightID(for: title)
}
-
+
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Screen Assistant", key: .enableScreenAssistant)
- .settingsHighlight(id: highlightID("Enable Screen Assistant"))
+ Defaults.Toggle(key: .enableScreenAssistant) {
+ Text("Enable Screen Assistant")
+ }
+ .settingsHighlight(id: highlightID("Enable Screen Assistant"))
} header: {
Text("AI Assistant")
} footer: {
Text("AI-powered assistant that can analyze files, images, and provide conversational help. Use Cmd+Shift+A to quickly access the assistant.")
}
-
+
if enableScreenAssistant {
Section {
HStack {
@@ -6739,7 +7010,7 @@ struct ScreenAssistantSettings: View {
Text("••••••••")
.foregroundColor(.green)
}
-
+
Button(showingApiKey ? "Hide" : (geminiApiKey.isEmpty ? "Set" : "Change")) {
if showingApiKey {
showingApiKey = false
@@ -6753,24 +7024,24 @@ struct ScreenAssistantSettings: View {
}
}
}
-
+
if showingApiKey {
VStack(alignment: .leading, spacing: 8) {
SecureField("Enter your Gemini API Key", text: $apiKeyText)
.textFieldStyle(.roundedBorder)
-
+
Text("Get your free API key from Google AI Studio")
.font(.caption)
.foregroundColor(.secondary)
-
+
HStack {
Button("Open Google AI Studio") {
NSWorkspace.shared.open(URL(string: "https://aistudio.google.com/app/apikey")!)
}
.buttonStyle(.link)
-
+
Spacer()
-
+
Button("Save") {
Defaults[.geminiApiKey] = apiKeyText
showingApiKey = false
@@ -6780,7 +7051,7 @@ struct ScreenAssistantSettings: View {
}
}
}
-
+
HStack {
Text("Display Mode")
Spacer()
@@ -6800,7 +7071,7 @@ struct ScreenAssistantSettings: View {
Text("\(screenAssistantManager.attachedFiles.count)")
.foregroundColor(.secondary)
}
-
+
HStack {
Text("Recording Status")
Spacer()
@@ -6817,7 +7088,7 @@ struct ScreenAssistantSettings: View {
Text("Panel mode shows the assistant in a floating window near the notch. Popover mode shows the assistant as a dropdown attached to the AI button.")
}
}
-
+
Section {
Button("Clear All Files") {
screenAssistantManager.clearAllFiles()
@@ -6829,7 +7100,7 @@ struct ScreenAssistantSettings: View {
} footer: {
Text("Clear all files removes all attached files and audio recordings. This action is permanent.")
}
-
+
if !screenAssistantManager.attachedFiles.isEmpty {
Section {
ForEach(screenAssistantManager.attachedFiles) { file in
@@ -6861,10 +7132,10 @@ struct ScreenAssistantSettings: View {
.formStyle(.grouped)
.navigationTitle("Screen Assistant")
}
-
+
private func timeAgoString(from date: Date) -> String {
let interval = Date().timeIntervalSince(date)
-
+
if interval < 60 {
return "Just now"
} else if interval < 3600 {
@@ -6887,27 +7158,31 @@ struct ColorPickerSettings: View {
@Default(.colorPickerDisplayMode) var colorPickerDisplayMode
@Default(.colorHistorySize) var colorHistorySize
@Default(.showColorPickerIcon) var showColorPickerIcon
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.colorPicker.highlightID(for: title)
}
-
+
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Color Picker", key: .enableColorPickerFeature)
- .settingsHighlight(id: highlightID("Enable Color Picker"))
+ Defaults.Toggle(key: .enableColorPickerFeature) {
+ Text("Enable Color Picker")
+ }
+ .settingsHighlight(id: highlightID("Enable Color Picker"))
} header: {
Text("Color Picker")
} footer: {
Text("Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker.")
}
-
+
if enableColorPickerFeature {
Section {
- Defaults.Toggle("Show Color Picker Icon", key: .showColorPickerIcon)
- .settingsHighlight(id: highlightID("Show Color Picker Icon"))
-
+ Defaults.Toggle(key: .showColorPickerIcon) {
+ Text("Show Color Picker Icon")
+ }
+ .settingsHighlight(id: highlightID("Show Color Picker Icon"))
+
HStack {
Text("Display Mode")
Spacer()
@@ -6934,10 +7209,12 @@ struct ColorPickerSettings: View {
.frame(minWidth: 100)
}
.settingsHighlight(id: highlightID("History Size"))
-
- Defaults.Toggle("Show All Color Formats", key: .showColorFormats)
- .settingsHighlight(id: highlightID("Show All Color Formats"))
-
+
+ Defaults.Toggle(key: .showColorFormats) {
+ Text("Show All Color Formats")
+ }
+ .settingsHighlight(id: highlightID("Show All Color Formats"))
+
} header: {
Text("Settings")
} footer: {
@@ -6948,7 +7225,7 @@ struct ColorPickerSettings: View {
Text("Panel mode shows color picker in a floating window. Popover mode shows color picker as a dropdown attached to the color picker button.")
}
}
-
+
Section {
HStack {
Text("Color History")
@@ -6956,35 +7233,35 @@ struct ColorPickerSettings: View {
Text("\(colorPickerManager.colorHistory.count)")
.foregroundColor(.secondary)
}
-
+
HStack {
Text("Picking Status")
Spacer()
Text(colorPickerManager.isPickingColor ? "Active" : "Ready")
.foregroundColor(colorPickerManager.isPickingColor ? .green : .secondary)
}
-
+
Button("Show Color Picker Panel") {
ColorPickerPanelManager.shared.showColorPickerPanel()
}
.disabled(!enableColorPickerFeature)
-
+
} header: {
Text("Status & Actions")
}
-
+
Section {
Button("Clear Color History") {
colorPickerManager.clearHistory()
}
.foregroundColor(.red)
.disabled(colorPickerManager.colorHistory.isEmpty)
-
+
Button("Start Color Picking") {
colorPickerManager.startColorPicking()
}
.disabled(!enableColorPickerFeature || colorPickerManager.isPickingColor)
-
+
} header: {
Text("Quick Actions")
} footer: {
@@ -7009,11 +7286,11 @@ struct CustomOSDSettings: View {
@Default(.osdIconColorStyle) var osdIconColorStyle
@Default(.enableSystemHUD) var enableSystemHUD
@ObservedObject private var accessibilityPermission = AccessibilityPermissionStore.shared
-
+
@State private var showAlphaWarning = false
@State private var previewValue: CGFloat = 0.65
@State private var previewType: SneakContentType = .volume
-
+
private func highlightID(_ title: String) -> String {
SettingsTab.hudAndOSD.highlightID(for: title)
}
@@ -7042,7 +7319,7 @@ struct CustomOSDSettings: View {
}
)
}
-
+
var body: some View {
Form {
if !hasAccessibilityPermission && !enableThirdPartyDDCIntegration {
@@ -7074,7 +7351,7 @@ struct CustomOSDSettings: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
Picker("Material", selection: $osdMaterial) {
ForEach(availableOSDMaterials, id: \.self) { material in
@@ -7113,7 +7390,7 @@ struct CustomOSDSettings: View {
.foregroundStyle(.secondary)
}
}
-
+
Picker("Icon & Progress Color", selection: $osdIconColorStyle) {
ForEach(OSDIconColorStyle.allCases, id: \.self) { style in
Text(style.rawValue).tag(style)
@@ -7137,7 +7414,7 @@ struct CustomOSDSettings: View {
.foregroundStyle(.secondary)
.font(.caption)
}
-
+
Section {
HStack {
Spacer()
@@ -7145,20 +7422,20 @@ struct CustomOSDSettings: View {
Text("Live Preview")
.font(.caption)
.foregroundStyle(.secondary)
-
+
CustomOSDView(
type: .constant(previewType),
value: .constant(previewValue),
icon: .constant("")
)
.frame(width: 200, height: 200)
-
+
HStack(spacing: 8) {
Button("Volume") {
previewType = .volume
}
.buttonStyle(.bordered)
-
+
Button("Brightness") {
previewType = .brightness
}
@@ -7277,13 +7554,25 @@ struct NotesSettingsView: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable Notes", key: .enableNotes)
+ Defaults.Toggle(key: .enableNotes) {
+ Text("Enable Notes")
+ }
if Defaults[.enableNotes] {
- Defaults.Toggle("Enable Note Pinning", key: .enableNotePinning)
- Defaults.Toggle("Enable Note Search", key: .enableNoteSearch)
- Defaults.Toggle("Enable Color Filtering", key: .enableNoteColorFiltering)
- Defaults.Toggle("Enable Create from Clipboard", key: .enableCreateFromClipboard)
- Defaults.Toggle("Show Character Count", key: .enableNoteCharCount)
+ Defaults.Toggle(key: .enableNotePinning) {
+ Text("Enable Note Pinning")
+ }
+ Defaults.Toggle(key: .enableNoteSearch) {
+ Text("Enable Note Search")
+ }
+ Defaults.Toggle(key: .enableNoteColorFiltering) {
+ Text("Enable Color Filtering")
+ }
+ Defaults.Toggle(key: .enableCreateFromClipboard) {
+ Text("Enable Create from Clipboard")
+ }
+ Defaults.Toggle(key: .enableNoteCharCount) {
+ Text("Show Character Count")
+ }
}
} header: {
Text("General")
@@ -7349,8 +7638,10 @@ struct TerminalSettings: View {
var body: some View {
Form {
Section {
- Defaults.Toggle("Enable terminal", key: .enableTerminalFeature)
- .settingsHighlight(id: highlightID("Enable terminal"))
+ Defaults.Toggle(key: .enableTerminalFeature) {
+ Text("Enable terminal")
+ }
+ .settingsHighlight(id: highlightID("Enable terminal"))
if enableTerminalFeature {
Defaults.Toggle(key: .terminalStickyMode) {
diff --git a/DynamicIsland/components/Stats/CPUStatsDetailView.swift b/DynamicIsland/components/Stats/CPUStatsDetailView.swift
index 8826b79..08b1178 100644
--- a/DynamicIsland/components/Stats/CPUStatsDetailView.swift
+++ b/DynamicIsland/components/Stats/CPUStatsDetailView.swift
@@ -29,7 +29,7 @@ struct CPUStatsDetailView: View {
var body: some View {
ScrollView {
VStack(spacing: 16) {
- StatsCard(title: "CPU Overview") {
+ StatsCard(title: String(localized: "CPU Overview")) {
CPUUsageDashboard(
breakdown: statsManager.cpuBreakdown,
loadAverage: statsManager.cpuLoadAverage,
@@ -43,12 +43,12 @@ struct CPUStatsDetailView: View {
)
}
- StatsCard(title: "Top Processes") {
+ StatsCard(title: String(localized: "Top Processes")) {
CPUProcessList(processes: topProcesses, accentColor: userColor)
}
if !statsManager.cpuCoreUsage.isEmpty {
- StatsCard(title: "Per-Core Usage") {
+ StatsCard(title: String(localized: "Per-Core Usage")) {
CPUCoreUsageGrid(cores: statsManager.cpuCoreUsage, accentColor: userColor)
}
}
diff --git a/DynamicIsland/components/Stats/CPUStatsSharedViews.swift b/DynamicIsland/components/Stats/CPUStatsSharedViews.swift
index 68150c2..29b96be 100644
--- a/DynamicIsland/components/Stats/CPUStatsSharedViews.swift
+++ b/DynamicIsland/components/Stats/CPUStatsSharedViews.swift
@@ -88,12 +88,12 @@ struct CPUUsageDashboard: View {
Text("System")
.font(.caption)
.foregroundColor(.secondary)
- DetailRow(color: nil, label: "Logical cores", value: "\(max(coreCount, 1))")
- DetailRow(color: nil, label: "Uptime", value: StatsFormatting.abbreviatedDuration(uptime))
+ DetailRow(color: nil, label: String(localized: "Logical cores"), value: "\(max(coreCount, 1))")
+ DetailRow(color: nil, label: String(localized: "Uptime"), value: StatsFormatting.abbreviatedDuration(uptime))
Divider().padding(.vertical, 4)
- DetailRow(color: nil, label: "Load 1m", value: String(format: "%.2f", loadAverage.oneMinute))
- DetailRow(color: nil, label: "Load 5m", value: String(format: "%.2f", loadAverage.fiveMinutes))
- DetailRow(color: nil, label: "Load 15m", value: String(format: "%.2f", loadAverage.fifteenMinutes))
+ DetailRow(color: nil, label: String(localized: "Load 1m"), value: String(format: "%.2f", loadAverage.oneMinute))
+ DetailRow(color: nil, label: String(localized: "Load 5m"), value: String(format: "%.2f", loadAverage.fiveMinutes))
+ DetailRow(color: nil, label: String(localized: "Load 15m"), value: String(format: "%.2f", loadAverage.fifteenMinutes))
}
.frame(maxWidth: .infinity, alignment: .leading)
@@ -205,7 +205,7 @@ private struct CPUFrequencyGauge: View {
var body: some View {
CircularGaugeView(
- title: "Frequency",
+ title: String(localized: "Frequency"),
value: normalizedValue,
tint: tint,
centerPrimaryText: centerPrimary,
@@ -264,7 +264,7 @@ private struct CPUSegmentDonut: View {
VStack(spacing: 4) {
Text(StatsFormatting.percentage(breakdown.activeUsage))
.font(.system(size: 30, weight: .bold, design: .rounded))
- Text("Active")
+ Text(String(localized: "stats_resource_active", defaultValue: "Active"))
.font(.footnote)
.foregroundColor(.secondary)
}
@@ -335,9 +335,9 @@ struct LoadAverageRow: View {
.font(.caption)
.foregroundColor(.secondary)
HStack(spacing: 12) {
- LoadAverageValue(label: "1m", value: loadAverage.oneMinute)
- LoadAverageValue(label: "5m", value: loadAverage.fiveMinutes)
- LoadAverageValue(label: "15m", value: loadAverage.fifteenMinutes)
+ LoadAverageValue(label: String(localized: "1m"), value: loadAverage.oneMinute)
+ LoadAverageValue(label: String(localized: "5m"), value: loadAverage.fiveMinutes)
+ LoadAverageValue(label: String(localized: "15m"), value: loadAverage.fifteenMinutes)
}
}
}
@@ -455,10 +455,10 @@ struct CPUDetailsGrid: View {
Text("Usage Breakdown")
.font(.caption)
.foregroundColor(.secondary)
- DetailRow(color: nil, label: "Total", value: StatsFormatting.percentage(breakdown.activeUsage))
- DetailRow(color: systemColor, label: "System", value: StatsFormatting.percentage(breakdown.system))
- DetailRow(color: userColor, label: "User", value: StatsFormatting.percentage(breakdown.user))
- DetailRow(color: Color.gray.opacity(0.4), label: "Idle", value: StatsFormatting.percentage(breakdown.idle))
+ DetailRow(color: nil, label: String(localized: "Total"), value: StatsFormatting.percentage(breakdown.activeUsage))
+ DetailRow(color: systemColor, label: String(localized: "System"), value: StatsFormatting.percentage(breakdown.system))
+ DetailRow(color: userColor, label: String(localized: "User"), value: StatsFormatting.percentage(breakdown.user))
+ DetailRow(color: Color.gray.opacity(0.4), label: String(localized: "Idle"), value: StatsFormatting.percentage(breakdown.idle))
}
Divider().padding(.vertical, 4)
@@ -467,8 +467,8 @@ struct CPUDetailsGrid: View {
Text("System")
.font(.caption)
.foregroundColor(.secondary)
- DetailRow(color: nil, label: "Logical cores", value: "\(max(coreCount, 1))")
- DetailRow(color: nil, label: "Uptime", value: StatsFormatting.abbreviatedDuration(uptime))
+ DetailRow(color: nil, label: String(localized: "Logical cores"), value: "\(max(coreCount, 1))")
+ DetailRow(color: nil, label: String(localized: "Uptime"), value: StatsFormatting.abbreviatedDuration(uptime))
}
if showLoadAverage {
diff --git a/DynamicIsland/components/Stats/DiskStatsDetailView.swift b/DynamicIsland/components/Stats/DiskStatsDetailView.swift
index c455269..4edc812 100644
--- a/DynamicIsland/components/Stats/DiskStatsDetailView.swift
+++ b/DynamicIsland/components/Stats/DiskStatsDetailView.swift
@@ -28,7 +28,7 @@ struct DiskStatsDetailView: View {
var body: some View {
ScrollView {
VStack(spacing: 16) {
- StatsCard(title: "Disk Overview", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Disk Overview"), padding: 16, background: cardBackground, cornerRadius: 12) {
DiskOverview(
readSpeed: statsManager.diskRead,
writeSpeed: statsManager.diskWrite,
@@ -39,11 +39,11 @@ struct DiskStatsDetailView: View {
)
}
- StatsCard(title: "Storage Devices", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Storage Devices"), padding: 16, background: cardBackground, cornerRadius: 12) {
DiskDevicesCard(devices: statsManager.diskDevices, accentColor: readColor)
}
- StatsCard(title: "Session Totals", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Session Totals"), padding: 16, background: cardBackground, cornerRadius: 12) {
DiskTotalsView(totals: statsManager.diskTotals, readColor: readColor, writeColor: writeColor)
}
}
@@ -99,8 +99,8 @@ private struct DiskTotalsView: View {
var body: some View {
VStack(spacing: 10) {
- DetailRow(color: readColor.opacity(0.75), label: "Read", value: formattedBytes(totals.readMB))
- DetailRow(color: writeColor.opacity(0.75), label: "Written", value: formattedBytes(totals.writtenMB))
+ DetailRow(color: readColor.opacity(0.75), label: String(localized: "Read"), value: formattedBytes(totals.readMB))
+ DetailRow(color: writeColor.opacity(0.75), label: String(localized: "Written"), value: formattedBytes(totals.writtenMB))
}
}
diff --git a/DynamicIsland/components/Stats/GPUStatsDetailView.swift b/DynamicIsland/components/Stats/GPUStatsDetailView.swift
index 7bd4077..064d2b5 100644
--- a/DynamicIsland/components/Stats/GPUStatsDetailView.swift
+++ b/DynamicIsland/components/Stats/GPUStatsDetailView.swift
@@ -29,7 +29,7 @@ struct GPUStatsDetailView: View {
var body: some View {
ScrollView {
VStack(spacing: 16) {
- StatsCard(title: "GPU Overview", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "GPU Overview"), padding: 16, background: cardBackground, cornerRadius: 12) {
GPUUsageDashboard(
usage: statsManager.gpuUsage,
breakdown: statsManager.gpuBreakdown,
@@ -40,12 +40,12 @@ struct GPUStatsDetailView: View {
)
}
- StatsCard(title: "Top Processes", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Top Processes"), padding: 16, background: cardBackground, cornerRadius: 12) {
CPUProcessList(processes: topProcesses, accentColor: accentColor, displayLimit: processDisplayLimit)
}
if !statsManager.gpuDevices.isEmpty {
- StatsCard(title: "Devices", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Devices"), padding: 16, background: cardBackground, cornerRadius: 12) {
GPUDeviceList(devices: statsManager.gpuDevices, accentColor: accentColor)
}
}
@@ -119,10 +119,10 @@ private struct GPUUsageDashboard: View {
private var breakdownSection: some View {
VStack(alignment: .leading, spacing: 12) {
- DetailRow(color: accentColor.opacity(0.9), label: "Render", value: StatsFormatting.percentage(breakdown.render))
- DetailRow(color: accentColor.opacity(0.7), label: "Compute", value: StatsFormatting.percentage(breakdown.compute))
- DetailRow(color: accentColor.opacity(0.55), label: "Video", value: StatsFormatting.percentage(breakdown.video))
- DetailRow(color: accentColor.opacity(0.45), label: "Other", value: StatsFormatting.percentage(breakdown.other))
+ DetailRow(color: accentColor.opacity(0.9), label: String(localized: "Render"), value: StatsFormatting.percentage(breakdown.render))
+ DetailRow(color: accentColor.opacity(0.7), label: String(localized: "Compute"), value: StatsFormatting.percentage(breakdown.compute))
+ DetailRow(color: accentColor.opacity(0.55), label: String(localized: "Video"), value: StatsFormatting.percentage(breakdown.video))
+ DetailRow(color: accentColor.opacity(0.45), label: String(localized: "Other"), value: StatsFormatting.percentage(breakdown.other))
}
.frame(maxWidth: .infinity, alignment: .leading)
}
@@ -132,15 +132,15 @@ private struct GPUUsageDashboard: View {
Text("Averages")
.font(.caption)
.foregroundColor(.secondary)
- DetailRow(color: nil, label: "Session Avg", value: StatsFormatting.percentage(averageUsage))
- DetailRow(color: nil, label: "Last Update", value: formattedTimestamp(lastUpdated))
+ DetailRow(color: nil, label: String(localized: "Session Avg"), value: StatsFormatting.percentage(averageUsage))
+ DetailRow(color: nil, label: String("localized: Last Update"), value: formattedTimestamp(lastUpdated))
if let device = primaryDevice {
Divider().padding(.vertical, 4)
- DetailRow(color: nil, label: "Active GPU", value: device.formattedVendorModel)
- DetailRow(color: nil, label: "Status", value: device.isActive ? "Active" : "Idle")
- DetailRow(color: nil, label: "Temperature", value: device.temperatureText)
+ DetailRow(color: nil, label: String(localized: "Active GPU"), value: device.formattedVendorModel)
+ DetailRow(color: nil, label: String(localized: "Status"), value: device.isActive ? String(localized: "Active") : String(localized: "Idle"))
+ DetailRow(color: nil, label: String(localized: "Temperature"), value: device.temperatureText)
if let cores = device.cores {
- DetailRow(color: nil, label: "Cores", value: "\(cores)")
+ DetailRow(color: nil, label: String(localized: "Cores"), value: "\(cores)")
}
}
}
@@ -170,9 +170,9 @@ private struct GPUEngineGauges: View {
.font(.caption)
.foregroundColor(.secondary)
HStack(alignment: .center, spacing: 18) {
- EngineGaugeView(title: "Render", value: render, tint: accentColor, size: 72)
+ EngineGaugeView(title: String(localized: "Render"), value: render, tint: accentColor, size: 72)
GPUUsageRing(usage: usage, accentColor: accentColor, diameter: ringDiameter, lineWidth: ringLineWidth)
- EngineGaugeView(title: "Tiler", value: tiler, tint: accentColor.opacity(0.75), size: 72)
+ EngineGaugeView(title: String(localized: "Tiler"), value: tiler, tint: accentColor.opacity(0.75), size: 72)
}
.frame(maxWidth: .infinity, alignment: .center)
}
@@ -193,7 +193,7 @@ private struct GPUUsageRing: View {
VStack(spacing: 4) {
Text(StatsFormatting.percentage(usage))
.font(.system(size: 26, weight: .bold, design: .rounded))
- Text("Active")
+ Text(String(localized: "stats_resource_active", defaultValue: "Active"))
.font(.footnote)
.foregroundColor(.secondary)
}
@@ -272,7 +272,7 @@ private struct GPUDeviceRow: View {
VStack(alignment: .leading, spacing: 2) {
Text(device.formattedVendorModel)
.font(.system(size: 13, weight: .semibold))
- Text(device.isActive ? "Active" : "Idle")
+ Text(device.isActive ? String(localized: "stats_resource_active", defaultValue: "Active") : String(localized: "Idle"))
.font(.caption2)
.foregroundColor(device.isActive ? .green : .secondary)
}
@@ -288,25 +288,25 @@ private struct GPUDeviceRow: View {
}
VStack(spacing: 8) {
if let render = device.renderUtilization {
- DetailRow(color: accentColor.opacity(0.9), label: "Renderer", value: StatsFormatting.percentage(render))
+ DetailRow(color: accentColor.opacity(0.9), label: String(localized: "Renderer"), value: StatsFormatting.percentage(render))
}
if let tiler = device.tilerUtilization {
- DetailRow(color: accentColor.opacity(0.6), label: "Tiler", value: StatsFormatting.percentage(tiler))
+ DetailRow(color: accentColor.opacity(0.6), label: String(localized: "Tiler"), value: StatsFormatting.percentage(tiler))
}
if let temp = device.temperature {
- DetailRow(color: nil, label: "Temperature", value: String(format: "%.0f°C", temp))
+ DetailRow(color: nil, label: String(localized: "Temperature"), value: String(format: "%.0f°C", temp))
}
if let fan = device.fanSpeed {
- DetailRow(color: nil, label: "Fan Speed", value: "\(fan)%")
+ DetailRow(color: nil, label: String(localized: "Fan Speed"), value: "\(fan)%")
}
if let coreClock = device.coreClock {
- DetailRow(color: nil, label: "Core Clock", value: "\(coreClock) MHz")
+ DetailRow(color: nil, label: String(localized: "Core Clock"), value: "\(coreClock) MHz")
}
if let memoryClock = device.memoryClock {
- DetailRow(color: nil, label: "Memory Clock", value: "\(memoryClock) MHz")
+ DetailRow(color: nil, label: String(localized: "Memory Clock"), value: "\(memoryClock) MHz")
}
if let cores = device.cores {
- DetailRow(color: nil, label: "Cores", value: "\(cores)")
+ DetailRow(color: nil, label: String(localized: "Cores"), value: "\(cores)")
}
}
}
diff --git a/DynamicIsland/components/Stats/MemoryStatsDetailView.swift b/DynamicIsland/components/Stats/MemoryStatsDetailView.swift
index e6ed7cf..bebfb91 100644
--- a/DynamicIsland/components/Stats/MemoryStatsDetailView.swift
+++ b/DynamicIsland/components/Stats/MemoryStatsDetailView.swift
@@ -29,15 +29,15 @@ struct MemoryStatsDetailView: View {
var body: some View {
ScrollView {
VStack(spacing: 16) {
- StatsCard(title: "Memory Overview", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Memory Overview"), padding: 16, background: cardBackground, cornerRadius: 12) {
MemoryUsageDashboard(breakdown: statsManager.memoryBreakdown, accentColor: accentColor)
}
- StatsCard(title: "Top Processes", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Top Processes"), padding: 16, background: cardBackground, cornerRadius: 12) {
CPUProcessList(processes: topProcesses, accentColor: accentColor, displayLimit: processDisplayLimit)
}
- StatsCard(title: "Pressure & Swap", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Pressure & Swap"), padding: 16, background: cardBackground, cornerRadius: 12) {
MemoryHealthView(breakdown: statsManager.memoryBreakdown, accentColor: accentColor)
}
}
@@ -64,9 +64,9 @@ private struct MemoryUsageDashboard: View {
var body: some View {
let totalsSection = VStack(alignment: .leading, spacing: 12) {
- DetailRow(color: accentColor.opacity(0.8), label: "Used", value: formattedBytes(breakdown.usedBytes))
- DetailRow(color: freeColor.opacity(0.9), label: "Free", value: formattedBytes(breakdown.freeBytes))
- DetailRow(color: nil, label: "Total", value: formattedBytes(breakdown.totalBytes))
+ DetailRow(color: accentColor.opacity(0.8), label: String(localized: "Used"), value: formattedBytes(breakdown.usedBytes))
+ DetailRow(color: freeColor.opacity(0.9), label: String(localized: "Free"), value: formattedBytes(breakdown.freeBytes))
+ DetailRow(color: nil, label: String(localized: "Total"), value: formattedBytes(breakdown.totalBytes))
}
.frame(maxWidth: .infinity, alignment: .leading)
@@ -74,10 +74,10 @@ private struct MemoryUsageDashboard: View {
Text("Breakdown")
.font(.caption)
.foregroundColor(.secondary)
- MemoryBreakdownRow(label: "App", value: breakdown.appBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.85))
- MemoryBreakdownRow(label: "Cached", value: breakdown.cacheBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.65))
- MemoryBreakdownRow(label: "Wired", value: breakdown.wiredBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.45))
- MemoryBreakdownRow(label: "Compressed", value: breakdown.compressedBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.35))
+ MemoryBreakdownRow(label: String(localized: "App"), value: breakdown.appBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.85))
+ MemoryBreakdownRow(label: String(localized: "Cached"), value: breakdown.cacheBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.65))
+ MemoryBreakdownRow(label: String(localized: "Wired"), value: breakdown.wiredBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.45))
+ MemoryBreakdownRow(label: String(localized: "Compressed"), value: breakdown.compressedBytes, total: breakdown.totalBytes, color: accentColor.opacity(0.35))
}
.frame(maxWidth: .infinity, alignment: .leading)
@@ -170,11 +170,11 @@ private struct MemoryPressureIndicator: View {
private var status: (title: String, color: Color, description: String) {
switch pressure.level {
case .normal:
- return ("Normal", Color.green, "System memory pressure is nominal.")
+ return (String(localized: "Normal"), Color.green, String(localized: "System memory pressure is nominal."))
case .warning:
- return ("Warning", Color.orange, "Memory pressure is elevated. Closing apps may help.")
+ return (String(localized: "Warning"), Color.orange, String(localized: "Memory pressure is elevated. Closing apps may help."))
case .critical:
- return ("Critical", Color.red, "Memory pressure is critical; the system may purge aggressively.")
+ return (String(localized: "Critical"), Color.red, String(localized: "Memory pressure is critical; the system may purge aggressively."))
}
}
@@ -220,9 +220,9 @@ private struct SwapUsageView: View {
.foregroundColor(.secondary)
if swap.totalBytes > 0 {
- DetailRow(color: accentColor.opacity(0.85), label: "Used", value: StatsFormatting.bytes(swap.usedBytes))
- DetailRow(color: accentColor.opacity(0.55), label: "Free", value: StatsFormatting.bytes(swap.freeBytes))
- DetailRow(color: nil, label: "Total", value: StatsFormatting.bytes(swap.totalBytes))
+ DetailRow(color: accentColor.opacity(0.85), label: String(localized: "Used"), value: StatsFormatting.bytes(swap.usedBytes))
+ DetailRow(color: accentColor.opacity(0.55), label: String(localized: "Free"), value: StatsFormatting.bytes(swap.freeBytes))
+ DetailRow(color: nil, label: String(localized: "Total"), value: StatsFormatting.bytes(swap.totalBytes))
SwapUsageBar(usedBytes: swap.usedBytes, totalBytes: swap.totalBytes, tint: accentColor)
.frame(height: 8)
} else {
diff --git a/DynamicIsland/components/Stats/NetworkStatsDetailView.swift b/DynamicIsland/components/Stats/NetworkStatsDetailView.swift
index 41edc1b..1d4eee2 100644
--- a/DynamicIsland/components/Stats/NetworkStatsDetailView.swift
+++ b/DynamicIsland/components/Stats/NetworkStatsDetailView.swift
@@ -28,7 +28,7 @@ struct NetworkStatsDetailView: View {
var body: some View {
ScrollView {
VStack(spacing: 16) {
- StatsCard(title: "Network Overview", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Network Overview"), padding: 16, background: cardBackground, cornerRadius: 12) {
NetworkOverview(
download: statsManager.networkDownload,
upload: statsManager.networkUpload,
@@ -41,7 +41,7 @@ struct NetworkStatsDetailView: View {
)
}
- StatsCard(title: "Interfaces", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Interfaces"), padding: 16, background: cardBackground, cornerRadius: 12) {
NetworkInterfacesCard(
interfaces: statsManager.networkInterfaces,
downloadColor: downloadColor,
@@ -49,7 +49,7 @@ struct NetworkStatsDetailView: View {
)
}
- StatsCard(title: "Session Totals", padding: 16, background: cardBackground, cornerRadius: 12) {
+ StatsCard(title: String(localized: "Session Totals"), padding: 16, background: cardBackground, cornerRadius: 12) {
NetworkTotalsView(totals: statsManager.networkTotals, downloadColor: downloadColor, uploadColor: uploadColor)
}
}
@@ -101,8 +101,8 @@ private struct NetworkOverview: View {
Text(StatsFormatting.throughput(upload))
.font(.system(size: 26, weight: .bold, design: .rounded))
.foregroundColor(.primary)
- DetailRow(color: uploadColor.opacity(0.6), label: "Average", value: StatsFormatting.throughput(avgUpload))
- DetailRow(color: uploadColor.opacity(0.45), label: "Peak", value: StatsFormatting.throughput(peakUpload))
+ DetailRow(color: uploadColor.opacity(0.6), label: String(localized: "Average"), value: StatsFormatting.throughput(avgUpload))
+ DetailRow(color: uploadColor.opacity(0.45), label: String(localized: "Peak"), value: StatsFormatting.throughput(peakUpload))
}
.frame(maxWidth: .infinity, alignment: .leading)
}
@@ -116,8 +116,8 @@ private struct NetworkTotalsView: View {
var body: some View {
VStack(spacing: 10) {
- DetailRow(color: downloadColor.opacity(0.75), label: "Downloaded", value: formattedBytes(totals.downloadedMB))
- DetailRow(color: uploadColor.opacity(0.75), label: "Uploaded", value: formattedBytes(totals.uploadedMB))
+ DetailRow(color: downloadColor.opacity(0.75), label: String(localized: "Downloaded"), value: formattedBytes(totals.downloadedMB))
+ DetailRow(color: uploadColor.opacity(0.75), label: String(localized: "Uploaded"), value: formattedBytes(totals.uploadedMB))
}
}
@@ -193,7 +193,7 @@ private struct NetworkInterfaceRow: View {
.font(.system(size: 13, weight: .semibold))
.foregroundColor(.primary)
if interface.isActive {
- Text("Active")
+ Text(String(localized: "stats_resource_active", defaultValue: "Active"))
.font(.caption2)
.foregroundColor(downloadColor)
.padding(.horizontal, 6)
@@ -222,8 +222,8 @@ private struct NetworkInterfaceRow: View {
Spacer()
VStack(alignment: .trailing, spacing: 4) {
- metricRow(label: "Down", value: StatsFormatting.throughput(interface.currentDownload), color: downloadColor)
- metricRow(label: "Up", value: StatsFormatting.throughput(interface.currentUpload), color: uploadColor)
+ metricRow(label: String(localized: "Down"), value: StatsFormatting.throughput(interface.currentDownload), color: downloadColor)
+ metricRow(label: String(localized: "Up"), value: StatsFormatting.throughput(interface.currentUpload), color: uploadColor)
}
}
}
diff --git a/DynamicIsland/managers/AppleMusicAirPlayManager.swift b/DynamicIsland/managers/AppleMusicAirPlayManager.swift
new file mode 100644
index 0000000..75210bf
--- /dev/null
+++ b/DynamicIsland/managers/AppleMusicAirPlayManager.swift
@@ -0,0 +1,245 @@
+/*
+ * Atoll (DynamicIsland)
+ * Copyright (C) 2024-2026 Atoll Contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import Foundation
+
+struct AirPlayDevice: Identifiable, Equatable {
+ let id: String // network address or name as fallback
+ let name: String
+ let kind: String
+ var isSelected: Bool
+ var volume: Int // 0-100
+
+ var iconName: String {
+ switch kind {
+ case "HomePod":
+ return "homepodmini"
+ case "AirPort Express":
+ return "airport.express"
+ case "computer":
+ return "laptopcomputer"
+ case "AirPlay device":
+ let normalizedName = name.lowercased()
+ if normalizedName.contains("tv") || normalizedName.contains("theatre") || normalizedName.contains("theater") {
+ return "appletv"
+ }
+ return "airplayaudio"
+ default:
+ return "airplayaudio"
+ }
+ }
+}
+
+@MainActor
+final class AppleMusicAirPlayManager: ObservableObject {
+ static let shared = AppleMusicAirPlayManager()
+
+ @Published private(set) var devices: [AirPlayDevice] = []
+ @Published private(set) var isLoading = false
+
+ private var isBusy = false
+
+ // MARK: - Volume commit pipeline
+ // Slider values are written to userSetVolume (non-@Published) and drained
+ // at throttled intervals into a serialised AppleScript commit queue.
+ // This avoids triggering SwiftUI re-renders that would reset the Slider.
+
+ private var userSetVolume: [String: Int] = [:]
+ private var throttleActive: [String: Bool] = [:]
+ private var lastCommittedVolume: [String: Int] = [:]
+ private var isCommittingVolume = false
+ private var pendingVolumeCommits: [(volume: Int, deviceName: String, deviceID: String)] = []
+
+ // MARK: - Device management
+
+ func refreshDevices() async {
+ guard !isBusy else { return }
+ isBusy = true
+ defer { isBusy = false }
+
+ isLoading = true
+ defer { isLoading = false }
+
+ let script = """
+ tell application "Music"
+ try
+ set deviceList to {}
+ set allDevices to AirPlay devices
+ repeat with d in allDevices
+ set deviceName to name of d
+ set deviceKind to kind of d as string
+ set deviceActive to selected of d
+ set deviceAddr to network address of d
+ set deviceVol to sound volume of d
+ set end of deviceList to {deviceName, deviceKind, deviceActive, deviceAddr, deviceVol}
+ end repeat
+ return deviceList
+ on error
+ return {}
+ end try
+ end tell
+ """
+
+ guard let result = try? await AppleScriptHelper.execute(script) else { return }
+
+ var fetched: [AirPlayDevice] = []
+ for i in 1...result.numberOfItems {
+ guard let item = result.atIndex(i) else { continue }
+ let name = item.atIndex(1)?.stringValue ?? "Unknown"
+ let kind = item.atIndex(2)?.stringValue ?? "AirPlay device"
+ let selected = item.atIndex(3)?.booleanValue ?? false
+ let addr = item.atIndex(4)?.stringValue ?? ""
+ let volume = Int(item.atIndex(5)?.int32Value ?? 50)
+ let id = addr.isEmpty ? name : addr
+ fetched.append(AirPlayDevice(id: id, name: name, kind: kind, isSelected: selected, volume: volume))
+ }
+ devices = fetched
+ for device in fetched {
+ lastCommittedVolume[device.id] = device.volume
+ }
+ }
+
+ func toggleDevice(_ device: AirPlayDevice) async {
+ guard !isBusy else { return }
+ isBusy = true
+ defer { isBusy = false }
+
+ let newState = !device.isSelected
+ let escapedName = device.name.replacingOccurrences(of: "\"", with: "\\\"")
+ let script = """
+ tell application "Music"
+ try
+ set targetDevice to first AirPlay device whose name is "\(escapedName)"
+ set selected of targetDevice to \(newState)
+ end try
+ end tell
+ """
+ try? await AppleScriptHelper.executeVoid(script)
+ try? await Task.sleep(for: .milliseconds(200))
+
+ isBusy = false
+ await refreshDevices()
+ }
+
+ // MARK: - Volume control
+
+ /// Returns the most recent volume the user set for a device, whether it's
+ /// still pending, already committed, or (as fallback) the last fetched value.
+ func currentVolume(for deviceID: String) -> Int {
+ if let pending = userSetVolume[deviceID] { return pending }
+ if let committed = lastCommittedVolume[deviceID] { return committed }
+ return devices.first { $0.id == deviceID }?.volume ?? 0
+ }
+
+ /// Called by the slider on every drag value change.
+ /// Does NOT mutate any @Published property — this is critical to prevent
+ /// SwiftUI from recreating the slider view and resetting its @State.
+ func setVolume(_ volume: Int, for deviceID: String) {
+ let clamped = min(max(volume, 0), 100)
+ guard let device = devices.first(where: { $0.id == deviceID }) else { return }
+
+ userSetVolume[deviceID] = clamped
+ guard throttleActive[deviceID] != true else { return }
+
+ throttleActive[deviceID] = true
+ Task { [weak self] in
+ guard let self else { return }
+
+ // Commit immediately, then drain at intervals while the user keeps dragging
+ if let first = self.userSetVolume.removeValue(forKey: deviceID) {
+ await self.enqueueVolumeCommit(volume: first, deviceName: device.name, deviceID: deviceID)
+ }
+
+ var alive = true
+ while alive {
+ try? await Task.sleep(for: .milliseconds(150))
+ guard let pending = self.userSetVolume.removeValue(forKey: deviceID) else {
+ alive = false
+ break
+ }
+ await self.enqueueVolumeCommit(volume: pending, deviceName: device.name, deviceID: deviceID)
+ }
+ self.throttleActive[deviceID] = false
+ }
+ }
+
+ // MARK: - Commit queue
+
+ /// Serialises AppleScript calls — only one runs at a time.
+ /// Queued entries are deduplicated per-device (only the latest value is kept).
+ private func enqueueVolumeCommit(volume: Int, deviceName: String, deviceID: String) async {
+ if isCommittingVolume {
+ pendingVolumeCommits.removeAll { $0.deviceID == deviceID }
+ pendingVolumeCommits.append((volume: volume, deviceName: deviceName, deviceID: deviceID))
+ return
+ }
+
+ isCommittingVolume = true
+ await commitVolume(volume: volume, deviceName: deviceName, deviceID: deviceID)
+
+ while !pendingVolumeCommits.isEmpty {
+ var latestByDevice: [String: (volume: Int, deviceName: String, deviceID: String)] = [:]
+ for entry in pendingVolumeCommits {
+ latestByDevice[entry.deviceID] = entry
+ }
+ pendingVolumeCommits.removeAll()
+
+ for (_, entry) in latestByDevice {
+ await commitVolume(volume: entry.volume, deviceName: entry.deviceName, deviceID: entry.deviceID)
+ }
+ }
+ isCommittingVolume = false
+ }
+
+ /// Commits a volume change via AppleScript.
+ ///
+ /// Apple Music internally rebalances other AirPlay devices when one device's
+ /// volume drops past another device's volume in a single call. To prevent this,
+ /// when moving DOWN past the highest other selected device's volume, we first
+ /// set to that device's volume (waypoint), then to the actual target — at most
+ /// two AppleScript calls.
+ private func commitVolume(volume: Int, deviceName: String, deviceID: String) async {
+ let escapedName = deviceName.replacingOccurrences(of: "\"", with: "\\\"")
+ let current = lastCommittedVolume[deviceID] ?? volume
+
+ let otherMaxVolume = devices
+ .filter { $0.id != deviceID && $0.isSelected }
+ .map { lastCommittedVolume[$0.id] ?? $0.volume }
+ .max() ?? 0
+
+ // Waypoint needed when crossing below another device's volume
+ if current > otherMaxVolume && volume < otherMaxVolume && otherMaxVolume > 0 {
+ await sendVolumeAppleScript(escapedName: escapedName, volume: otherMaxVolume)
+ }
+
+ await sendVolumeAppleScript(escapedName: escapedName, volume: volume)
+ lastCommittedVolume[deviceID] = volume
+ }
+
+ private func sendVolumeAppleScript(escapedName: String, volume: Int) async {
+ let script = """
+ tell application "Music"
+ try
+ set targetDevice to first AirPlay device whose name is "\(escapedName)"
+ set sound volume of targetDevice to \(volume)
+ end try
+ end tell
+ """
+ try? await AppleScriptHelper.executeVoid(script)
+ }
+}
diff --git a/DynamicIsland/managers/CalendarManager.swift b/DynamicIsland/managers/CalendarManager.swift
index 1d84c0b..42c66e3 100644
--- a/DynamicIsland/managers/CalendarManager.swift
+++ b/DynamicIsland/managers/CalendarManager.swift
@@ -382,6 +382,36 @@ class CalendarManager: ObservableObject {
lastEventsFetchDate = Date()
}
+ func setCalendarsSelected(_ calendars: [CalendarModel], isSelected: Bool) async {
+ var selectionState = Defaults[.calendarSelectionState]
+ let ids = Set(calendars.map { $0.id })
+
+ switch selectionState {
+ case .all:
+ if !isSelected {
+ let identifiers = Set(allCalendars.map { $0.id }).subtracting(ids)
+ selectionState = .selected(identifiers)
+ }
+ case .selected(var identifiers):
+ if isSelected {
+ identifiers.formUnion(ids)
+ } else {
+ identifiers.subtract(ids)
+ }
+
+ if identifiers.isEmpty || identifiers.count == allCalendars.count {
+ selectionState = .all
+ } else {
+ selectionState = .selected(identifiers)
+ }
+ }
+
+ Defaults[.calendarSelectionState] = selectionState
+ updateSelectedCalendars()
+ await updateEvents(force: true)
+ await updateLockScreenEvents(force: true)
+ }
+
func setReminderCompleted(reminderID: String, completed: Bool) async {
await calendarService.setReminderCompleted(reminderID: reminderID, completed: completed)
await updateEvents(force: true)
diff --git a/DynamicIsland/managers/LockScreenPanelManager.swift b/DynamicIsland/managers/LockScreenPanelManager.swift
index 5c5dfa7..c259971 100644
--- a/DynamicIsland/managers/LockScreenPanelManager.swift
+++ b/DynamicIsland/managers/LockScreenPanelManager.swift
@@ -166,6 +166,8 @@ class LockScreenPanelManager {
return
}
+ let resizeDuration: CFTimeInterval = 0.28
+
let baseSize = expanded ? LockScreenMusicPanel.expandedSize : LockScreenMusicPanel.collapsedSize
let targetWidth = baseSize.width
let targetHeight = baseSize.height + additionalHeight
@@ -175,7 +177,7 @@ class LockScreenPanelManager {
if animated {
NSAnimationContext.runAnimationGroup { context in
- context.duration = 0.45
+ context.duration = resizeDuration
context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
window.animator().setFrame(targetFrame, display: true)
}
@@ -191,7 +193,8 @@ class LockScreenPanelManager {
let targetRadius = expanded ? expandedPanelCornerRadius : collapsedPanelCornerRadius
if animated {
CATransaction.begin()
- CATransaction.setAnimationDuration(0.28)
+ CATransaction.setAnimationDuration(resizeDuration)
+ CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeInEaseOut))
window.contentView?.layer?.cornerRadius = targetRadius
CATransaction.commit()
} else {
diff --git a/DynamicIsland/managers/LockScreenWidgetPreviewManager.swift b/DynamicIsland/managers/LockScreenWidgetPreviewManager.swift
index 9ac2c2a..7c3b5c0 100644
--- a/DynamicIsland/managers/LockScreenWidgetPreviewManager.swift
+++ b/DynamicIsland/managers/LockScreenWidgetPreviewManager.swift
@@ -302,6 +302,7 @@ final class LockScreenWidgetPreviewManager: ObservableObject {
private func applyCalendarPreviewEvents() {
let now = Date()
let reminderCalendar = CalendarModel(
+ accountName: "Preview",
id: "preview.reminders",
title: "Reminders",
color: .systemBlue,
@@ -327,6 +328,7 @@ final class LockScreenWidgetPreviewManager: ObservableObject {
)
let eventCalendar = CalendarModel(
+ accountName: "Preview",
id: "preview.calendar",
title: "Calendar",
color: .systemOrange,
diff --git a/DynamicIsland/models/CalendarModel.swift b/DynamicIsland/models/CalendarModel.swift
index dd6e8b0..132ec3b 100644
--- a/DynamicIsland/models/CalendarModel.swift
+++ b/DynamicIsland/models/CalendarModel.swift
@@ -23,6 +23,7 @@
import Cocoa
struct CalendarModel: Identifiable, Hashable {
+ let accountName: String
let id: String
let title: String
let color: NSColor
diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift
index f04f6da..392c081 100644
--- a/DynamicIsland/models/Constants.swift
+++ b/DynamicIsland/models/Constants.swift
@@ -836,6 +836,7 @@ extension Defaults.Keys {
static let lockScreenShowAppIcon = Key("lockScreenShowAppIcon", default: false)
static let lockScreenPanelShowsBorder = Key("lockScreenPanelShowsBorder", default: false)
static let lockScreenPanelUsesBlur = Key("lockScreenPanelUsesBlur", default: true)
+ static let lockScreenMusicMergedAirPlayOutput = Key("lockScreenMusicMergedAirPlayOutput", default: true)
static let lockScreenTimerWidgetUsesBlur = Key("lockScreenTimerWidgetUsesBlur", default: false)
static let lockScreenReminderChipStyle = Key("lockScreenReminderChipStyle", default: .eventColor)
static let lockScreenReminderWidgetHorizontalAlignment = Key("lockScreenReminderWidgetHorizontalAlignment", default: "center")
diff --git a/DynamicIsland/models/MusicControlButton.swift b/DynamicIsland/models/MusicControlButton.swift
index c4023a9..3d2bd23 100644
--- a/DynamicIsland/models/MusicControlButton.swift
+++ b/DynamicIsland/models/MusicControlButton.swift
@@ -29,6 +29,7 @@ enum MusicControlButton: String, CaseIterable, Identifiable, Codable, Defaults.S
case trackForward
case repeatMode
case mediaOutput
+ case airPlay
case lyrics
case seekBackward
case seekForward
@@ -61,9 +62,15 @@ enum MusicControlButton: String, CaseIterable, Identifiable, Codable, Defaults.S
.shuffle,
.repeatMode,
.lyrics,
- .mediaOutput
+ .mediaOutput,
+ .airPlay
]
+ /// Controls that are only available when Apple Music is the active media source.
+ var isAppleMusicExclusive: Bool {
+ self == .airPlay
+ }
+
var id: String { rawValue }
var label: String {
@@ -80,6 +87,8 @@ enum MusicControlButton: String, CaseIterable, Identifiable, Codable, Defaults.S
return "Repeat"
case .mediaOutput:
return "Change Media Output"
+ case .airPlay:
+ return "AirPlay"
case .lyrics:
return "Lyrics"
case .seekBackward:
@@ -105,6 +114,8 @@ enum MusicControlButton: String, CaseIterable, Identifiable, Codable, Defaults.S
return "repeat"
case .mediaOutput:
return "speaker.wave.2"
+ case .airPlay:
+ return "airplayaudio"
case .lyrics:
return "quote.bubble"
case .seekBackward:
@@ -122,11 +133,10 @@ enum MusicControlButton: String, CaseIterable, Identifiable, Codable, Defaults.S
}
extension Array where Element == MusicControlButton {
- func normalized(allowingMediaOutput: Bool) -> [MusicControlButton] {
+ func normalized(allowingMediaOutput: Bool, isAppleMusicActive: Bool = true) -> [MusicControlButton] {
var sanitized = map { button -> MusicControlButton in
- if button == .mediaOutput && !allowingMediaOutput {
- return .none
- }
+ if button == .mediaOutput && !allowingMediaOutput { return .none }
+ if button.isAppleMusicExclusive && !isAppleMusicActive { return .none }
return button
}