From 4e06fff9297a44607e65db5eef74286d385ba328 Mon Sep 17 00:00:00 2001 From: QuerTeal <11648267+QuerTeal@users.noreply.github.com> Date: Mon, 28 Sep 2026 00:26:29 +0900 Subject: [PATCH 1/2] android: add in-app language picker Adds a Language section to the app settings listing the locales from the generated locale config, plus System default. Uses LocaleManager (minSdk is 33), so the choice is the same per-app language setting as in the system settings. It is shown regardless of connection/premium state. Co-Authored-By: Claude Opus 5.5 --- .../presentation/screens/AppSettingsScreen.kt | 28 +++++++++++++++++++ android/app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 30 insertions(+) diff --git a/android/app/src/main/kotlin/me/kavishdevar/librepods/presentation/screens/AppSettingsScreen.kt b/android/app/src/main/kotlin/me/kavishdevar/librepods/presentation/screens/AppSettingsScreen.kt index 1437a4c72..10be010db 100644 --- a/android/app/src/main/kotlin/me/kavishdevar/librepods/presentation/screens/AppSettingsScreen.kt +++ b/android/app/src/main/kotlin/me/kavishdevar/librepods/presentation/screens/AppSettingsScreen.kt @@ -18,9 +18,12 @@ package me.kavishdevar.librepods.presentation.screens +import android.app.LocaleConfig +import android.app.LocaleManager import android.content.Intent import android.net.Uri import android.os.Build +import android.os.LocaleList import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -231,6 +234,31 @@ fun AppSettingsScreen( Spacer(modifier = Modifier.height(16.dp)) + val localeManager = remember { context.getSystemService(LocaleManager::class.java) } + val appLocales = remember { localeManager.applicationLocales } + val supportedLocales = remember { + val locales = LocaleConfig(context).supportedLocales ?: LocaleList.getEmptyLocaleList() + List(locales.size()) { locales[it] } + } + + StyledList(title = stringResource(R.string.language)) { + StyledListItem( + contentText = stringResource(R.string.system_default), + selected = appLocales.isEmpty, + onClick = { localeManager.applicationLocales = LocaleList.getEmptyLocaleList() } + ) + + supportedLocales.forEach { locale -> + StyledListItem( + contentText = locale.getDisplayName(locale).replaceFirstChar { it.titlecase(locale) }, + selected = appLocales[0]?.toLanguageTag() == locale.toLanguageTag(), + onClick = { localeManager.applicationLocales = LocaleList(locale) } + ) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + StyledList( title = stringResource(R.string.advanced_options), description = stringResource(R.string.do_not_change) diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 387a99630..39cea992c 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -280,6 +280,8 @@ Custom Recommended Appearance + Language + System default Material 3 Expressive LibrePods now supports a whole new look based on Material 3 Expressive including updated typography and adaptive color schemes.\nYou can switch back to the Apple look from the app\'s settings. Available only on the latest AirPods Beta firmware. An Apple device running OS version 27 is required to install the beta firmware. From a58fe6af60c5722e6a9eb331a64f5c7919044ab9 Mon Sep 17 00:00:00 2001 From: QuerTeal <11648267+QuerTeal@users.noreply.github.com> Date: Mon, 28 Sep 2026 00:26:29 +0900 Subject: [PATCH 2/2] android(i18n): add Korean translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translates all strings. AirPods feature names follow Apple's official Korean terminology from the Korean AirPods User Guide (support.apple.com/ko-kr/guide/airpods), e.g. 대화 인지 (Conversation Awareness), 노이즈 캔슬링, 주변음 허용, 개인 맞춤형 음량, 자동으로 착용 감지. Co-Authored-By: Claude Opus 5.5 --- .../app/src/main/res/values-ko/strings.xml | 359 ++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 android/app/src/main/res/values-ko/strings.xml diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml new file mode 100644 index 000000000..7d8e241a4 --- /dev/null +++ b/android/app/src/main/res/values-ko/strings.xml @@ -0,0 +1,359 @@ + + + + Apple 생태계에서 AirPods을 해방하십시오. + 홈 화면에서 바로 AirPods 배터리 상태를 확인하십시오! + 손쉬운 사용 + 톤 음량 + AirPods에서 재생되는 사운드 효과의 톤 음량을 조절합니다. + 오디오 + 적응형 오디오 + 적응형 오디오 사용자화 + 적응형 오디오는 주변 환경에 따라 동적으로 반응하여 외부 소음을 차단하거나 허용합니다. 적응형 오디오를 사용자화하여 소음을 더 많이 또는 더 적게 허용할 수 있습니다. + 이어버드 + 케이스 + 테스트 + 이름 + 듣기 모드 + 끔 + 주변음 허용 + 적응형 + 노이즈 캔슬링 + AirPods 길게 누르기 + 스템을 길게 눌러 선택한 듣기 모드 간에 전환합니다. + 머리 제스처 + 왼쪽 + 오른쪽 + 대화 인지 + 다른 사람과 대화를 시작하면 미디어 음량을 낮추고 배경 소음을 줄입니다. + 개인 맞춤형 음량 + 주변 환경에 따라 미디어 음량을 조절합니다. + AirPod 한 개 착용 시 노이즈 캔슬링 + AirPod 한 개만 착용한 경우에도 노이즈 캔슬링 모드를 사용할 수 있도록 허용합니다. + 음량 제어 + AirPods Pro 스템의 센서를 위아래로 쓸어넘겨 음량을 조절합니다. + AirPods이 연결되지 않음 + 설정에 접근하려면 AirPods을 연결하십시오. + 뒤로 + 사용자화 + 상대 음량 + 최대 음량 대신 현재 음량의 비율로 낮춥니다. + 음악 일시 정지 + 말하기 시작하면 음악이 일시 정지됩니다. + 예시 + 위젯 추가 + 홈 화면에서 바로 듣기 모드를 제어합니다. + 연결됨 + Linux에 연결됨 + 연결됨 + Linux로 이동됨 + %1$s(으)로 이동됨 + 알림에서 다시 연결 + 머리 추적 + 머리를 위아래로 끄덕여 전화를 받고, 좌우로 흔들어 거절합니다. + 일반 + 빠른 설정 타일 동작 + 탭하면 듣기 모드 대화상자를 표시합니다. + 탭하면 모드를 차례로 전환합니다. + 개발자 + AirPods 설정 열기 + AirPods 기능 및 환경설정 관리 + 자동으로 착용 감지 + 자동 재생 + 자동 일시 정지 + 문제 해결 + AirPods 연결 문제를 진단하기 위해 로그를 수집합니다 + 로그 수집 + 저장된 로그 + 저장된 로그가 없습니다 + 자동 연결 환경설정 + AirPods이 다음 상태일 때 연결: + 연결 해제됨 + AirPods이 어떤 기기에도 연결되어 있지 않음 + 대기 중 + 기기가 AirPods에 연결되어 있지만 미디어를 재생하거나 통화 중이 아님 + 미디어 재생 중 + 기기가 AirPods으로 미디어를 재생하는 중 + 통화 중 + 기기가 AirPods으로 통화하는 중 + 휴대폰이 다음 상태일 때 AirPods에 연결: + 전화 수신 중 + 휴대폰이 울리기 시작함 + 미디어 재생 시작 + 휴대폰에서 미디어 재생이 시작됨 + 실행 취소 + 주변 소리를 더 잘 들을 수 있도록 AirPods Pro의 주변음 허용 모드를 사용자화할 수 있습니다. + 큰 소리 줄이기는 주변음 허용 및 적응형 모드에서 큰 주변 소음에 대한 노출을 능동적으로 줄여 줍니다. 끔 모드에서는 큰 소리 줄이기가 작동하지 않습니다. + 큰 소리 줄이기 + 통화 제어 + 이 기기에 자동으로 연결 + 활성화하면 AirPods이 이 기기에 자동으로 연결을 시도합니다. 비활성화하면 마지막으로 연결된 기기일 때만 자동 연결을 시도합니다. + 잠들면 미디어 일시 정지 + 듣기 모드 끔 + 이 옵션을 켜면 AirPods 듣기 모드에 끔 옵션이 포함됩니다. 듣기 모드가 끔으로 설정되어 있으면 큰 소리가 줄어들지 않습니다. + 마이크 + 마이크 + AirPods 자동 전환 + 항상 오른쪽 AirPod + 항상 왼쪽 AirPod + 전화 받기 + 소리 끔/소리 켬 + 통화 종료 + 한 번 누르기 + 두 번 누르기 + 보청기 + 조절 + 쓸어서 증폭 조절하기 + 주변음 허용 모드에서 미디어를 재생하지 않을 때 AirPods Pro의 터치 제어를 위아래로 쓸어넘겨 주변 소리의 증폭을 높이거나 낮춥니다. + 주변음 허용 모드 + 주변음 허용 모드 사용자화 + 누르기 속도 + AirPods을 두 번 또는 세 번 누를 때 필요한 속도를 조절합니다. + 길게 누르기 지속 시간 + AirPods을 길게 누를 때 필요한 지속 시간을 조절합니다. + 음량 쓸어넘기기 속도 + 의도하지 않은 음량 조절을 방지하려면 쓸어넘기기 사이의 대기 시간을 선택하십시오. + 이퀄라이저 + EQ 적용 대상 + 전화 + 미디어 + 밴드 %d + 기본 + 느리게 + 가장 느리게 + 길게 + 가장 길게 + 어둡게 + 밝게 + 적게 + 많이 + 증폭 + 밸런스 + 톤 + 주변 소음 감소 + 대화 부스트 + 대화 부스트는 AirPods Pro가 앞에서 말하는 사람에게 집중하도록 하여 대면 대화를 더 쉽게 들을 수 있게 합니다. + AirPods은 청력 테스트 결과를 사용하여 주변의 음성과 소리를 더 선명하게 들을 수 있도록 조절할 수 있습니다.\n\n보청기는 경도에서 중등도의 청력 손실이 있다고 인지하는 사람만을 대상으로 합니다. + 미디어 지원 + AirPods Pro는 청력 테스트 결과를 사용하여 음악, 비디오 및 통화를 더 선명하게 들을 수 있도록 조절할 수 있습니다. + 음악 및 비디오 조절 + 통화 조절 + 위젯 + 위젯에 휴대폰 배터리 표시 + 위젯에 AirPods 배터리와 함께 휴대폰의 배터리 잔량을 표시합니다 + 팝업 애니메이션 + 하단 시트 팝업 + AirPods이 연결되면 화면 하단에 iOS 스타일의 팝업을 표시합니다. + Dynamic Island 팝업 + 연결 및 전환 이벤트가 발생하면 화면 상단에 Dynamic Island 스타일의 팝업을 표시합니다. + 대화 인지 음량 + 빠른 설정 타일 + 제어 대화상자 열기 + 비활성화하면 빠른 설정 타일을 탭할 때 모드가 차례로 전환됩니다. 활성화하면 듣기 모드와 대화 인지를 제어하는 대화상자가 표시됩니다 + 착용하지 않을 때 AirPods 연결 해제 + 앱에서는 계속 제어할 수 있으며, 오디오 연결만 해제됩니다. + 고급 옵션 + IRK(Identity Resolving Key) 설정 + BLE 임의 주소를 확인하는 데 사용되는 IRK 값을 직접 설정합니다 + 암호화 키 설정 + BLE 광고를 복호화하는 데 사용되는 ENC_KEY 값을 직접 설정합니다 + 대체 머리 추적 패킷 사용 + 머리 추적이 작동하지 않으면 활성화하십시오. 머리 추적 데이터를 요청하거나 중지할 때 AirPods에 다른 데이터를 전송합니다. + Apple 기기로 동작 + 여러 기기 연결과 주변음 허용 모드 사용자화(증폭, 톤, 주변 소음 감소, 대화 부스트, EQ) 같은 손쉬운 사용 기능을 활성화합니다 + 불안정할 수 있습니다! AirPods에는 최대 두 대의 기기를 연결할 수 있습니다. iPad나 Mac 같은 Apple 기기와 함께 사용하는 경우 해당 기기를 먼저 연결한 다음 Android 기기를 연결하십시오. + 훅 오프셋 재설정 + 현재 훅 오프셋이 지워지며 설정 과정을 다시 진행해야 합니다. 계속하겠습니까? + 재설정 + 훅 오프셋이 재설정되었습니다. 설정으로 이동하는 중… + 훅 오프셋을 재설정하지 못했습니다 + IRK가 설정되었습니다 + 암호화 키가 설정되었습니다 + IRK 16진수 값 + ENC_KEY 16진수 값 + 16바이트 IRK를 16진수 문자열(32자)로 입력하십시오: + 16바이트 ENC_KEY를 16진수 문자열(32자)로 입력하십시오: + 정확히 32자의 16진수여야 합니다 + 16진수 변환 오류: + Bluetooth 프로세스를 재시작하십시오 + 디지털 어시스턴트 + 켬 + 카메라 리모컨 + 카메라 제어 + 한 번 누르기 또는 길게 누르기로 사진 촬영, 비디오 녹화 시작 또는 중단 등을 할 수 있습니다. AirPods으로 카메라를 제어할 때 한 번 누르기를 선택하면 미디어 제어 제스처를 사용할 수 없고, 길게 누르기를 선택하면 듣기 모드 및 디지털 어시스턴트 제스처를 사용할 수 없습니다. + 카메라 감지에 사용할 앱 패키지를 직접 설정합니다 + 사용자 지정 카메라 앱 ID 설정 + 카메라 앱의 애플리케이션 ID를 입력하십시오: + 사용자 지정 카메라 앱 ID + 사용자 지정 카메라 앱 ID가 설정되었습니다 + 카메라 리스너 + 카메라가 활성화되었는지 감지하여 AirPods의 카메라 제어를 활성화하는 LibrePods 리스너 서비스입니다. + 오픈 소스 라이선스 + 청력 테스트 업데이트 + 청력 테스트 결과 업데이트 + ATT Manager가 null입니다. 다시 연결해 보십시오. + 앱을 사용하려면 다음 권한이 필요합니다. 계속하려면 권한을 허용하십시오. + 머리를 흔들거나 끄덕이십시오! + 루트 권한 필요 + 이 앱은 Bluetooth 라이브러리에 훅을 연결하기 위해 루트 권한이 필요합니다 + 루트 권한이 거부되었습니다. 루트 권한을 허용하십시오. + 문제 해결 단계 + 손실 값을 dBHL 단위로 입력하십시오 + 정보 + 모델 이름 + 모델 번호 + 일련번호 + 버전 + 청력 건강 + 청력 보호 + 작업장 사용 + EN 352 보호 + EN 352 보호는 미디어의 최대 음량을 82dBA로 제한하며, 개인용 청력 보호구에 적용되는 EN 352 표준 요구 사항을 충족합니다. + 환경 소음 + 마지막으로 연결된 기기에 다시 연결 + 연결 해제 + 소음 관리를 끕니다 + 외부 소리를 들려줍니다 + 외부 소음을 동적으로 조절합니다 + 외부 소리를 차단합니다 + 고급 기능 잠금 해제 + %s에 구입 + 구입 항목 복원 + AirPods을 빼면 자동으로 오디오 재생을 멈추고, 다시 착용하면 재생을 재개합니다. + 배터리 + 앱과 알림에서 정확한 배터리 상태를 확인합니다. + 앱이나 빠른 설정에서 바로 듣기 모드를 전환합니다. + 고급 기기 설정 + 개인 맞춤형 음량, 적응형 오디오, 잠들면 미디어 일시 정지 및 기타 손쉬운 사용 설정을 사용자화합니다. + 자동 연결 + AirPods 자동 연결을 활성화하고 사용자화합니다. + 위젯의 휴대폰 배터리 표시, 대화 인지 음량 등 앱 사용자화 기능과 앞으로 추가될 다양한 사용자화 기능을 사용할 수 있습니다. + 개발 지원하기 + LibrePods는 한 명의 개발자가 개발하고 있습니다. 업그레이드하면 앱을 계속 유지하는 데 도움이 됩니다. + 기능 사용 가능 여부는 AirPods 모델 및 펌웨어 버전에 따라 다릅니다. + 문의 + 이메일 + Discord + GitHub 이슈 + 버전 코드 + 빌드 유형 + 아니요 + 예 + 설정 + Xposed 필요 + 호환성 검사 건너뛰기 + 기기가 기본적으로 지원되거나 Xposed 모듈이 활성화되어 있는 것이 확실합니까? + 지원되지 않음 + + Android Bluetooth 스택의 제한으로 인해 많은 기기가 지원되지 않습니다. + \n이러한 기기에서 모든 기능을 사용하려면 루트 권한과 Xposed 프레임워크가 필요합니다. + \n\n이 제한은 최신 Android 버전에서 해결되었습니다. 다음 기기 구성에서는 앱을 기본적으로 실행할 수 있습니다. + \n• Android 16 3월 업데이트 이상과 최신 Google Play 시스템 업데이트가 설치된 Google Pixel® + \n• Android 17 베타 3 이상을 실행하는 Google Pixel® + \n• OxygenOS 16 이상을 실행하는 OnePlus 기기 + \n• ColorOS 16 이상을 실행하는 Oppo 기기 + \n\n자세한 내용은 프로젝트 문서를 참조하십시오. + + (원하는 가격 지정) + + 플랫폼 제한으로 인해 이 기기는 지원되지 않을 수 있으며 Xposed 프레임워크가 필요합니다. 계속하려면 아래 체크박스를 선택하고 OK를 입력하십시오. + + 계속하려면 \"%s\"을(를) 입력하십시오 + 계속 + 호환성 요구 사항을 읽었습니다. + 기기 정보 + 빌드 ID + 제조사 + 무료 기능 + 고급 기능 + 길게 눌러 디지털 어시스턴트 호출 + AirPods Pro 스템을 길게 누르면 디지털 어시스턴트를 호출합니다. + 사용자화를 사용할 수 없습니다. 사용하려면 AirPods을 한 번 이상 연결하십시오. + Xposed 사용 가능 + Xposed에서 앱 활성화됨 + 제목 + 문제를 설명하십시오 + 최적화된 충전 한도 + AirPods은 일상적인 사용 패턴을 학습하여 최적화된 한도까지만 충전할 때와 완전히 충전할 때를 판단합니다. 이 한도는 일상적인 사용 패턴에 맞게 조정되며 시간이 지나도 배터리 수명을 보존합니다.\n지원되지 않는 AirPods이나 이전 펌웨어 버전의 AirPods에는 이 설정이 적용되지 않을 수 있습니다. + 계속하려면 기기를 업데이트하거나 Xposed에서 LibrePods를 활성화한 후 앱을 다시 여십시오. + 결제 오류로 인해 프리미엄 이용 권한이 %1$d일 후에 만료됩니다. 이미 앱을 업그레이드했다면 이 메시지를 눌러 billing@kavish.xyz로 이메일을 보내 권한을 복원하거나 확인하십시오. 불편을 드려 죄송합니다. + 사용자 지정 + 권장 + 화면 모드 + 언어 + 시스템 기본값 + Material 3 Expressive + LibrePods가 이제 새로운 타이포그래피와 적응형 색상 구성을 포함한 Material 3 Expressive 기반의 완전히 새로운 디자인을 지원합니다.\n앱 설정에서 Apple 디자인으로 다시 전환할 수 있습니다. + 최신 AirPods 베타 펌웨어에서만 사용할 수 있습니다. 베타 펌웨어를 설치하려면 OS 버전 27을 실행하는 Apple 기기가 필요합니다. + 새로운 기능 + 다시 연결하는 중 + 탭하여 다시 연결 + 권한 + 개인정보 처리방침 + 동의합니다 + 녹음기 + 녹음 + AirPods의 고품질 마이크로 오디오를 녹음합니다. + 심박수 + 시스템 + 라이트 + 다크 + 디자인 시스템 + Apple + Apple + 연결 중 + 기기 + 위젯 구성 + 환영합니다 + 개발자에게 직접 도움을 받으십시오. 혼자 개발하고 있어 답장에 시간이 걸릴 수 있습니다 :) + 커뮤니티에서 도움을 받으십시오. + GitHub 저장소에 이슈를 생성합니다. 기능을 요청하거나 버그를 발견한 것이 확실한 경우에만 사용하십시오. 이슈를 열기 전에 먼저 커뮤니티에 문의해 보십시오. + Discord 초대를 여는 중 오류가 발생했습니다 + GitHub 링크를 여는 중 오류가 발생했습니다 + 스캔 모드 + BLE 설정 + 무엇을 하는지 정확히 알지 못한다면 이 설정을 변경하지 마십시오! + 저전력 + 전력 소모가 가장 적습니다 + 균형 + 스캔 빈도와 전력 소모 사이의 균형을 맞춥니다 + 저지연 + 스캔 빈도가 가장 빠릅니다 + 디버그 모드 활성화 + 0보다 큰 값을 입력하면 일괄 처리가 활성화됩니다. + 보고 지연(ms) + 간격 + 심박수 측정 간격 + 심박수 데이터 없음 + 1초 + 1분 + 헬스 커넥트에 심박수 기록 + 앱이 Android 헬스 커넥트 플랫폼에 심박수 데이터를 기록하도록 허용합니다. + 필수 권한 + Bluetooth + AirPods과 통신하는 데 필요합니다. + 선택 권한 + 알림 + 배터리 상태, 높은 심박수 경고(지원되는 모델) 등을 표시합니다. + 머리 제스처로 전화에 응답합니다. + 다른 앱 위에 표시 + AirPods이 근처에 있거나 오디오가 AirPods으로 전환될 때 팝업을 표시합니다. + 아무 곳에서나 쓸어넘겨 뒤로 가기 + 가능한 최고 화면 주사율 사용 + 추가 정보와 설정을 표시합니다. + 상호 작용 + 심박수 모니터링 + 심박수가 임계값을 초과하면 알림을 보냅니다. 배터리 소모가 늘어납니다. + 심박수 경고 + 경고 임계값 + 통화 거절됨 + 전화 받음 + 대기 중… + 서비스 실행 중 + 불필요한 알림입니다. 눌러서 끌 수 있습니다. + 포그라운드 서비스 상태 + 심박수가 설정한 임계값을 초과했습니다. (현재: %d BPM) + 높은 심박수 + 이 경고는 현재 운동이나 신체 활동을 고려하지 않습니다. 정보 제공 목적으로만 사용되며 의학적 조언을 대신하지 않습니다. + 다시 연결하거나 심박수 모니터링을 다시 활성화할 때까지 경고가 비활성화됩니다. +