import { INSTALLED_MESSAGE_CATALOGS } from "../../features/installed-feature-messages.ts"; const PLATFORM_KO_MESSAGES = { "common.unavailable": "요청한 문구를 표시할 수 없습니다.", "common.processing": "처리 중…", "common.appName": "Tech Log", "common.noDisplayValue": "표시 정보 없음", "action.retry": "다시 시도", "action.reauth": "로그인", "action.navigateSafe": "안전한 화면으로 이동", "action.reloadOnce": "한 번 새로고침", "action.contactSupport": "지원 정보 확인", "action.resolveConflict": "충돌 해결", "action.confirmMutationApplied": "변경됨으로 확인", "action.confirmMutationNotApplied": "변경되지 않음으로 확인", "action.continueEditing": "계속 작성", "action.discardAndLeave": "변경 버리고 이동", "action.signIn": "로그인 시작", "action.recoverSession": "세션 복구", "action.signOut": "로그아웃", "action.goHome": "홈으로 이동", "action.closeNamed": "{title} 닫기", "action.alertCloseNamed": "{title} 알림 닫기", "shell.skipToContent": "본문으로 건너뛰기", "shell.menu": "메뉴", "shell.closeMenu": "메뉴 닫기", "shell.sidebar": "사이드바", "shell.primaryNavigation": "주요 탐색", "shell.theme": "색상 테마", "shell.theme.system": "시스템 테마", "shell.theme.light": "라이트 테마", "shell.theme.dark": "다크 테마", "shell.locale": "언어", "shell.locale.ko": "한국어", "shell.locale.en": "English", "shell.locale.pseudo": "Pseudo", "shell.locale.rtl": "RTL smoke", "shell.session.authenticated": "인증됨", "shell.session.unauthenticated": "로그인 전", "shell.session.recoveryPending": "복구 대기", "shell.session.integrationFailed": "연동 필요", "shell.session.actionFailed": "세션 작업을 완료하지 못했습니다.", "route.APP_HOME.navigation": "홈", "route.APP_HOME.title": "Tech Log", "route.EXAMPLES_PLATFORM.navigation": "플랫폼 구성", "route.EXAMPLES_PLATFORM.title": "플랫폼 구성", "route.EXAMPLES_UI.navigation": "UI 구성요소", "route.EXAMPLES_UI.title": "UI 구성요소", "route.EXAMPLES_STATES.navigation": "화면 상태", "route.EXAMPLES_STATES.title": "화면 상태", "route.EXAMPLES_AUTH.navigation": "인증 연동", "route.EXAMPLES_AUTH.title": "인증 연동", "route.NOT_FOUND.navigation": "찾을 수 없음", "route.NOT_FOUND.title": "페이지를 찾을 수 없습니다.", "async.loading": "불러오는 중", "async.empty": "표시할 항목이 없습니다.", "async.refreshing": "최신 정보를 확인하고 있습니다.", "async.staleDegraded": "기존 정보를 표시하고 있습니다.", "async.mutationPending": "변경 사항을 저장하고 있습니다.", "async.mutationEffectUnknown": "변경 결과를 확인할 수 없습니다.", "async.mutationConflict": "다른 변경과 충돌했습니다.", "access.auth.eyebrow": "401 · 인증 필요", "access.auth.title": "로그인이 필요합니다.", "access.auth.description": "세션을 시작한 뒤 이전 작업을 안전하게 계속할 수 있습니다.", "access.forbidden.eyebrow": "403 · 권한 없음", "access.forbidden.title": "접근할 수 없습니다.", "access.forbidden.description": "권한을 확인하거나 접근 가능한 화면으로 이동하세요.", "access.notFound.eyebrow": "404 · 찾을 수 없음", "access.notFound.title": "요청한 화면이 없습니다.", "access.notFound.description": "주소를 확인하거나 시작 화면으로 돌아가세요.", "route.loading": "화면을 준비하고 있습니다.", "route.loadingNamed": "{title} 로딩 중", "route.failure.title": "화면을 표시하지 못했습니다.", "route.failure.description": "잠시 후 다시 시도해 주세요. 문제가 계속되면 운영 지원 참조 정보를 확인하세요.", "route.invalid.title": "올바르지 않은 주소입니다.", "route.invalid.description": "주소의 경로 또는 검색 조건을 확인해 주세요.", "route.invalid.action": "안전한 탐색 링크를 사용해 주세요.", "route.disabledFeature.title": "현재 사용할 수 없는 기능입니다.", "route.disabledFeature.description": "이 기능은 배포 설정에서 중지되어 있습니다. 코드에는 포함되어 있으며 운영자가 다시 켤 수 있습니다.", "route.disabledFeature.action": "다른 탐색 링크를 사용해 주세요.", "route.auth.integration.title": "로그인 연동이 필요합니다.", "route.auth.integration.description": "외부 인증 소유자가 연결되면 이 보호 라우트를 사용할 수 있습니다.", "route.auth.recovering.title": "세션을 복구하고 있습니다.", "route.auth.required.title": "Studio에 로그인해 주세요.", "route.auth.recovering.description": "이전 로그인이 아직 살아 있는지 확인하고 있습니다. 잠시 뒤에도 이 화면이면 다시 시도해 주세요.", // 예전 문구("인증 연동 지점을 확인하기 위한 보호 라우트")는 이 뼈대를 만들던 사람에게 하는 // 말이었다. 실제로 이 화면을 보는 사람은 글을 쓰러 온 작성자이고, 알아야 할 것은 무엇을 // 누르면 되는지다. "route.auth.required.description": "기록을 쓰고 게시하려면 로그인이 필요합니다. 로그인하면 방금 열려던 화면으로 돌아옵니다.", "route.documentTitle": "{title} · {appName}", "chunk.checking": "새 릴리스 정보를 확인하고 있습니다.", "chunk.reloadOnce": "새 버전으로 한 번만 전환합니다.", "chunk.failure.title": "화면 자산을 복구하지 못했습니다.", "chunk.failure.description": "문제가 계속되면 배포 상태와 지원 참조 정보를 확인해 주세요.", "page.notFound.title": "페이지를 찾을 수 없습니다.", "page.notFound.description": "주소를 확인하거나 준비된 시작 화면으로 돌아가세요.", "template.breadcrumb": "현재 위치", "template.relatedInformation": "관련 정보", "template.searchAndFilter": "검색과 필터", "template.pagination": "페이지 탐색", "template.summary": "요약 정보", "template.dangerActions": "위험 작업", "template.supportReference": "지원 참조: {reference}", "form.errorSummary": "입력 내용을 확인해 주세요.", "form.unsaved.title": "저장하지 않은 변경이 있습니다.", "form.unsaved.description": "이 화면을 떠나면 입력한 내용이 사라집니다.", "form.validation.required": "필수 입력값입니다.", "form.validation.tooSmall": "입력값이 너무 짧습니다.", "form.validation.tooBig": "입력값이 너무 깁니다.", "form.validation.invalidType": "입력 형식을 확인해 주세요.", "form.validation.invalidFormat": "입력 형식을 확인해 주세요.", "form.validation.invalidValue": "허용된 값을 선택해 주세요.", "form.validation.unknown": "입력값을 확인해 주세요.", "form.validation.retry": "입력값을 다시 확인해 주세요.", "form.validation.unknownField": "서버가 확인하지 못한 입력 항목이 있습니다.", "form.validation.configuration": "입력 구성을 다시 확인해 주세요.", "form.conflict": "다른 변경과 충돌했습니다. 입력은 유지되었으니 최신 상태를 확인해 주세요.", "form.unavailable": "저장하지 못했습니다. 잠시 후 다시 시도해 주세요.", "form.remaining": "{count}자 남음", "toast.region": "알림", "error.network_unreachable": "네트워크에 연결할 수 없습니다.", "error.request_timeout": "요청 시간이 초과되었습니다.", "error.auth_required": "계속하려면 로그인이 필요합니다.", "error.auth_integration_failure": "로그인 연동을 사용할 수 없습니다.", "error.forbidden": "이 작업을 수행할 권한이 없습니다.", "error.not_found": "요청한 항목을 찾을 수 없습니다.", "error.rate_limited": "요청이 많습니다. 잠시 후 다시 시도해 주세요.", "error.server_failure": "요청을 완료하지 못했습니다.", "error.chunk_load_failure": "새 화면 파일을 불러오지 못했습니다.", "error.build_mismatch": "현재 화면과 활성 빌드가 일치하지 않습니다.", "error.config_mismatch": "런타임 설정 버전이 현재 화면과 일치하지 않습니다.", "error.api_contract_mismatch": "API 계약 버전이 현재 화면과 일치하지 않습니다.", "error.release_mismatch": "현재 화면과 활성 릴리스가 일치하지 않습니다.", "error.asset_mismatch": "화면 자산 구성이 현재 릴리스와 일치하지 않습니다.", "error.render_failure": "화면을 표시하지 못했습니다.", "error.unknown_failure": "예상하지 못한 문제가 발생했습니다.", // 아래 22개는 문구가 비어 있어 화면에 "요청한 문구를 표시할 수 없습니다."(common.unavailable) // 가 대신 나가고 있었다 — 실패 종류 38개 중 절반 이상이 그 상태였다. 사용자에게는 // 원인 분류가 아니라 무엇이 안 됐고 무엇을 하면 되는지가 필요하므로, 기술 용어를 // 그대로 옮기지 않는다. 구분이 필요한 진단 정보는 로그와 error.code 가 들고 있다. "error.request_aborted": "요청이 취소되었습니다.", "error.content_type_mismatch": "서버 응답 형식이 예상과 달라 표시하지 못했습니다.", "error.malformed_json": "서버 응답을 읽지 못했습니다.", "error.response_body_limit": "응답이 너무 커서 표시하지 못했습니다.", "error.envelope_mismatch": "서버 응답 형식이 예상과 달라 표시하지 못했습니다.", "error.schema_mismatch": "서버 응답 형식이 예상과 달라 표시하지 못했습니다.", "error.mapping_contract_violation": "서버 응답을 화면에 옮기지 못했습니다.", "error.result_limit_exceeded": "결과가 너무 많습니다. 조건을 좁혀 주세요.", "error.scope_generation_changed": "화면이 바뀌어 이전 요청을 버렸습니다. 다시 시도해 주세요.", "error.identity_intern_limit_exceeded": "한 번에 처리할 수 있는 항목 수를 넘었습니다.", "error.duplicate_in_flight": "같은 요청이 이미 처리 중입니다.", "error.pagination_contract_violation": "다음 페이지를 불러오지 못했습니다.", "error.conflict": "다른 곳에서 먼저 바뀌었습니다. 새로 불러온 뒤 다시 시도해 주세요.", "error.validation_rejected": "입력 값이 올바르지 않습니다.", "error.unknown_client_failure": "요청을 처리하지 못했습니다.", "error.boot_config_failure": "설정을 불러오지 못했습니다.", "error.release_manifest_failure": "릴리스 정보를 불러오지 못했습니다.", "error.deploy_mismatch": "배포 버전이 현재 화면과 일치하지 않습니다.", "error.storage_unavailable": "브라우저 저장소를 사용할 수 없습니다.", "error.storage_quota_exceeded": "브라우저 저장 공간이 부족합니다.", "error.telemetry_failure": "사용 기록을 전송하지 못했습니다.", "error.query_cache_failure": "화면 데이터를 갱신하지 못했습니다.", "boot.failure.title": "애플리케이션을 시작할 수 없습니다.", "boot.field.error": "오류", "boot.field.code": "코드", "boot.field.build": "빌드", "boot.field.configSchema": "설정 스키마", "boot.field.release": "릴리스", "boot.supportReference": "지원 참조: {reference}", } as const; export const KO_MESSAGES = { ...PLATFORM_KO_MESSAGES, ...INSTALLED_MESSAGE_CATALOGS["ko-KR"], } as const; export type MessageKey = keyof typeof KO_MESSAGES; const PLATFORM_EN_MESSAGES = { "common.unavailable": "This message is unavailable.", "common.processing": "Processing…", "common.appName": "Tech Log", "common.noDisplayValue": "No display value", "action.retry": "Try again", "action.reauth": "Sign in", "action.navigateSafe": "Go to an available page", "action.reloadOnce": "Reload once", "action.contactSupport": "View support information", "action.resolveConflict": "Resolve conflict", "action.confirmMutationApplied": "Confirm the change was applied", "action.confirmMutationNotApplied": "Confirm the change was not applied", "action.continueEditing": "Continue editing", "action.discardAndLeave": "Discard and leave", "action.signIn": "Start sign-in", "action.recoverSession": "Recover session", "action.signOut": "Sign out", "action.goHome": "Go home", "action.closeNamed": "Close {title}", "action.alertCloseNamed": "Dismiss {title} alert", "shell.skipToContent": "Skip to content", "shell.menu": "Menu", "shell.closeMenu": "Close menu", "shell.sidebar": "Sidebar", "shell.primaryNavigation": "Primary navigation", "shell.theme": "Color theme", "shell.theme.system": "System theme", "shell.theme.light": "Light theme", "shell.theme.dark": "Dark theme", "shell.locale": "Language", "shell.locale.ko": "한국어", "shell.locale.en": "English", "shell.locale.pseudo": "Pseudo", "shell.locale.rtl": "RTL smoke", "shell.session.authenticated": "Authenticated", "shell.session.unauthenticated": "Signed out", "shell.session.recoveryPending": "Recovery pending", "shell.session.integrationFailed": "Integration required", "shell.session.actionFailed": "The session action could not be completed.", "route.APP_HOME.navigation": "Home", "route.APP_HOME.title": "Tech Log", "route.EXAMPLES_PLATFORM.navigation": "Platform composition", "route.EXAMPLES_PLATFORM.title": "Platform composition", "route.EXAMPLES_UI.navigation": "UI components", "route.EXAMPLES_UI.title": "UI components", "route.EXAMPLES_STATES.navigation": "Screen states", "route.EXAMPLES_STATES.title": "Screen states", "route.EXAMPLES_AUTH.navigation": "Authentication", "route.EXAMPLES_AUTH.title": "Authentication", "route.NOT_FOUND.navigation": "Not found", "route.NOT_FOUND.title": "Page not found", "async.loading": "Loading", "async.empty": "There are no items to display.", "async.refreshing": "Checking for the latest information.", "async.staleDegraded": "Showing previously loaded information.", "async.mutationPending": "Saving changes.", "async.mutationEffectUnknown": "The result of the change is unknown.", "async.mutationConflict": "The change conflicts with another update.", "access.auth.eyebrow": "401 · Authentication required", "access.auth.title": "Sign-in is required.", "access.auth.description": "Start a session to safely continue the previous task.", "access.forbidden.eyebrow": "403 · Access denied", "access.forbidden.title": "You cannot access this page.", "access.forbidden.description": "Check your permissions or go to an available page.", "access.notFound.eyebrow": "404 · Not found", "access.notFound.title": "The requested page does not exist.", "access.notFound.description": "Check the address or return to the start page.", "route.loading": "Preparing the page.", "route.loadingNamed": "Loading {title}", "route.failure.title": "The page could not be displayed.", "route.failure.description": "Try again shortly. If the problem continues, check the support reference.", "route.invalid.title": "This address is invalid.", "route.invalid.description": "Check the path and search parameters.", "route.invalid.action": "Use a safe navigation link.", "route.disabledFeature.title": "This feature is not available right now.", "route.disabledFeature.description": "The deployment configuration has switched it off. It is still part of this build and an operator can switch it back on.", "route.disabledFeature.action": "Use another navigation link.", "route.auth.integration.title": "Sign-in integration is required.", "route.auth.integration.description": "This protected route is available after an external authentication owner is connected.", "route.auth.recovering.title": "Recovering the session.", "route.auth.required.title": "Sign in to Studio.", "route.auth.recovering.description": "Checking whether the previous sign-in is still valid. Try again if this screen stays.", "route.auth.required.description": "Writing and publishing records needs a signed-in session. You return to this screen afterwards.", "route.documentTitle": "{title} · {appName}", "chunk.checking": "Checking the new release information.", "chunk.reloadOnce": "Switching to the new version once.", "chunk.failure.title": "The page assets could not be recovered.", "chunk.failure.description": "If the problem continues, check deployment status and support information.", "page.notFound.title": "Page not found.", "page.notFound.description": "Check the address or return to the start page.", "template.breadcrumb": "Current location", "template.relatedInformation": "Related information", "template.searchAndFilter": "Search and filters", "template.pagination": "Pagination", "template.summary": "Summary information", "template.dangerActions": "Dangerous actions", "template.supportReference": "Support reference: {reference}", "form.errorSummary": "Review the entered information.", "form.unsaved.title": "You have unsaved changes.", "form.unsaved.description": "The entered information will be lost if you leave this page.", "form.validation.required": "This field is required.", "form.validation.tooSmall": "This value is too short.", "form.validation.tooBig": "This value is too long.", "form.validation.invalidType": "Check the input type.", "form.validation.invalidFormat": "Check the input format.", "form.validation.invalidValue": "Choose an allowed value.", "form.validation.unknown": "Check the entered value.", "form.validation.retry": "Review the entered values.", "form.validation.unknownField": "The server reported an unrecognized input field.", "form.validation.configuration": "Review the input configuration.", "form.conflict": "Another update conflicts with this change. Your input has been preserved.", "form.unavailable": "The change could not be saved. Try again shortly.", "form.remaining": "{count} characters remaining", "toast.region": "Notifications", "error.network_unreachable": "The network is unavailable.", "error.request_timeout": "The request timed out.", "error.auth_required": "Sign in to continue.", "error.auth_integration_failure": "Sign-in integration is unavailable.", "error.forbidden": "You are not allowed to perform this action.", "error.not_found": "The requested item could not be found.", "error.rate_limited": "Too many requests were made. Try again shortly.", "error.server_failure": "The request could not be completed.", "error.chunk_load_failure": "The new page assets could not be loaded.", "error.build_mismatch": "The active build does not match this page.", "error.config_mismatch": "The runtime configuration does not match this page.", "error.api_contract_mismatch": "The API contract does not match this page.", "error.release_mismatch": "The active release does not match this page.", "error.asset_mismatch": "The page assets do not match this release.", "error.render_failure": "The page could not be displayed.", "error.unknown_failure": "An unexpected problem occurred.", // Mirrors the ko-KR additions: every failure kind needs copy, or the surface // falls back to `common.unavailable` and tells the reader nothing. "error.request_aborted": "The request was cancelled.", "error.content_type_mismatch": "The server replied in an unexpected format.", "error.malformed_json": "The server reply could not be read.", "error.response_body_limit": "The reply was too large to display.", "error.envelope_mismatch": "The server replied in an unexpected format.", "error.schema_mismatch": "The server replied in an unexpected format.", "error.mapping_contract_violation": "The reply could not be shown on this screen.", "error.result_limit_exceeded": "Too many results. Narrow the filters.", "error.scope_generation_changed": "The screen changed, so the earlier request was dropped. Try again.", "error.identity_intern_limit_exceeded": "More items than this screen can handle at once.", "error.duplicate_in_flight": "The same request is already in progress.", "error.pagination_contract_violation": "The next page could not be loaded.", "error.conflict": "It changed elsewhere first. Reload and try again.", "error.validation_rejected": "Some values are not valid.", "error.unknown_client_failure": "The request could not be completed.", "error.boot_config_failure": "Configuration could not be loaded.", "error.release_manifest_failure": "Release information could not be loaded.", "error.deploy_mismatch": "The deployed version does not match this screen.", "error.storage_unavailable": "Browser storage is unavailable.", "error.storage_quota_exceeded": "Browser storage is full.", "error.telemetry_failure": "Usage data could not be sent.", "error.query_cache_failure": "Screen data could not be refreshed.", "boot.failure.title": "The application could not start.", "boot.field.error": "Error", "boot.field.code": "Code", "boot.field.build": "Build", "boot.field.configSchema": "Configuration schema", "boot.field.release": "Release", "boot.supportReference": "Support reference: {reference}", } as const satisfies Record; export const EN_MESSAGES = { ...PLATFORM_EN_MESSAGES, ...INSTALLED_MESSAGE_CATALOGS["en-US"], } as const satisfies Record; export const MESSAGE_CATALOGS = Object.freeze({ "ko-KR": KO_MESSAGES, "en-US": EN_MESSAGES, "ar-EG": EN_MESSAGES, });