From 546698866cbe314696d20e51266d1eee98bc0e80 Mon Sep 17 00:00:00 2001 From: chayapats Date: Sat, 31 Oct 2026 17:19:09 +0700 Subject: [PATCH 1/3] feat(l10n): add Thai language support --- lib/l10n/app_th.arb | 16115 ++++++++++++++++ lib/ui2/profile/profile.dart | 1 + .../notification_number_bodies_l10n_test.dart | 4 +- test/thai_l10n_test.dart | 105 + 4 files changed, 16223 insertions(+), 2 deletions(-) create mode 100644 lib/l10n/app_th.arb create mode 100644 test/thai_l10n_test.dart diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb new file mode 100644 index 000000000..0315afdc0 --- /dev/null +++ b/lib/l10n/app_th.arb @@ -0,0 +1,16115 @@ +{ + "@@locale": "th", + "appTitle": "OpenStrap", + "@appTitle": { + "description": "App name shown in the OS task switcher / MaterialApp title." + }, + "profileTitle": "โปรไฟล์", + "@profileTitle": { + "description": "Profile screen header." + }, + "profileMyDevices": "อุปกรณ์ของฉัน", + "@profileMyDevices": { + "description": "Profile > Quick access row label." + }, + "profileLanguage": "ภาษา", + "@profileLanguage": { + "description": "Profile > Quick access row label for the language picker." + }, + "languageSystemDefault": "ตามระบบ", + "@languageSystemDefault": { + "description": "Option in the language picker that follows the OS locale." + }, + "actionCancel": "ยกเลิก", + "@actionCancel": { + "description": "Generic Cancel button." + }, + "actionSave": "บันทึก", + "@actionSave": { + "description": "Generic Save button." + }, + "actionContinue": "ดำเนินการต่อ", + "@actionContinue": { + "description": "Generic Continue button." + }, + "actionDone": "เสร็จสิ้น", + "@actionDone": { + "description": "Generic Done status label." + }, + "actionSettings": "การตั้งค่า", + "@actionSettings": { + "description": "Settings icon semantic label." + }, + "actionUpdateApp": "อัปเดตแอป", + "@actionUpdateApp": { + "description": "Fix action: the file needs a newer version of the app." + }, + "actionTryAnotherFile": "ลองไฟล์อื่น", + "@actionTryAnotherFile": { + "description": "Fix action: try another file." + }, + "stateOn": "เปิด", + "@stateOn": { + "description": "On/off toggle state: on." + }, + "stateOff": "ปิด", + "@stateOff": { + "description": "On/off toggle state: off." + }, + "pillLocalNoCloud": "บนเครื่อง · ไม่ใช้คลาวด์", + "@pillLocalNoCloud": { + "description": "Pill badge: everything computed on-device." + }, + "pairingSkipForNow": "ข้ามไปก่อน", + "@pairingSkipForNow": { + "description": "Onboarding pairing screen: skip button." + }, + "pairingSkipNote": "เปิดแอปได้โดยไม่ต้องมีสายรัด แต่จะยังไม่มีการวัดจนกว่าจะจับคู่", + "@pairingSkipNote": { + "description": "Note under the skip button." + }, + "pairingIdleTitle": "เปิดใช้งานแล้วนำมาไว้ใกล้ๆ", + "@pairingIdleTitle": { + "description": "Pairing state title: idle." + }, + "pairingIdleBody": "ถอดสายรัดจากแท่นชาร์จ สวมที่ข้อมือ และวางโทรศัพท์ไว้ในระยะเอื้อมถึง", + "@pairingIdleBody": { + "description": "Pairing state body: idle." + }, + "pairingScanningTitle": "กำลังค้นหาสายรัดของคุณ", + "@pairingScanningTitle": { + "description": "Pairing state title: scanning." + }, + "pairingScanningBody": "สายรัดที่เพิ่งถอดจากแท่นชาร์จอาจใช้เวลาถึงครึ่งนาทีกว่าจะเริ่มส่งสัญญาณให้ค้นพบ", + "@pairingScanningBody": { + "description": "Pairing state body: scanning." + }, + "pairingNotFoundTitle": "ไม่พบสายรัดในระยะ", + "@pairingNotFoundTitle": { + "description": "Pairing state title: not found." + }, + "pairingNotFoundBody": "ไม่มีอุปกรณ์ตอบกลับการสแกน สายรัดจะส่งสัญญาณให้ค้นพบเมื่อทำงานอยู่และยังไม่ได้เชื่อมต่อกับโทรศัพท์เครื่องอื่น", + "@pairingNotFoundBody": { + "description": "Pairing state body: not found." + }, + "pairingBondRefusedTitle": "สายรัดปฏิเสธการจับคู่", + "@pairingBondRefusedTitle": { + "description": "Pairing state title: bond refused." + }, + "pairingBondRefusedBody": "สายรัดเชื่อมต่อแล้วแต่ปฏิเสธคีย์เข้ารหัส โดยทั่วไปเกิดจากข้อมูลการจับคู่เก่าในโทรศัพท์เครื่องนี้ ไม่ใช่สายรัดเสีย", + "@pairingBondRefusedBody": { + "description": "Pairing state body: bond refused." + }, + "pairingCancelledTitle": "ยกเลิกการจับคู่แล้ว", + "@pairingCancelledTitle": { + "description": "Pairing state title: cancelled." + }, + "pairingCancelledBody": "หน้าต่างเลือกอุปกรณ์ของระบบถูกปิดก่อนเลือกสายรัด", + "@pairingCancelledBody": { + "description": "Pairing state body: cancelled." + }, + "pairingFailedTitle": "จับคู่ไม่สำเร็จ", + "@pairingFailedTitle": { + "description": "Pairing state title: failed." + }, + "pairingFailedBody": "ติดต่อสายรัดได้ แต่ดำเนินการไม่เสร็จสมบูรณ์", + "@pairingFailedBody": { + "description": "Pairing state body: failed." + }, + "pairingPairedTitle": "จับคู่แล้ว", + "@pairingPairedTitle": { + "description": "Pairing state title: paired." + }, + "pairingPairedBody": "กำลังตั้งค่าการซิงค์ครั้งแรก", + "@pairingPairedBody": { + "description": "Pairing state body: paired." + }, + "pairingFindMyBand": "ค้นหาสายรัดของฉัน", + "@pairingFindMyBand": { + "description": "Pairing CTA: idle." + }, + "pairingSearching": "กำลังค้นหา…", + "@pairingSearching": { + "description": "Pairing CTA: scanning." + }, + "pairingOpenPickerAgain": "เปิดหน้าต่างเลือกอีกครั้ง", + "@pairingOpenPickerAgain": { + "description": "Pairing CTA: cancelled." + }, + "pairingTryAgain": "ลองอีกครั้ง", + "@pairingTryAgain": { + "description": "Pairing CTA: default retry." + }, + "pairingNotFoundAdviceTitle": "สามสาเหตุที่สายรัดไม่ตอบกลับ", + "@pairingNotFoundAdviceTitle": { + "description": "Advice card title: not found." + }, + "pairingNotFoundAdviceBody": "สายรัดยังอยู่บนแท่นชาร์จ อยู่นอกระยะ หรือยังเชื่อมต่อกับโทรศัพท์เครื่องอื่นหรือแอปของผู้ผลิต", + "@pairingNotFoundAdviceBody": { + "description": "Advice card body: not found." + }, + "pairingNotFoundAdviceFix": "บังคับปิดแอปอื่น แล้วสแกนอีกครั้ง", + "@pairingNotFoundAdviceFix": { + "description": "Advice card fix: not found." + }, + "pairingBondRefusedAdviceTitle": "ลืมสายรัดในการตั้งค่า Bluetooth ก่อน", + "@pairingBondRefusedAdviceTitle": { + "description": "Advice card title: bond refused." + }, + "pairingBondRefusedAdviceBody": "ไปที่การตั้งค่า Bluetooth ของโทรศัพท์ เลือกลืมสายรัด แล้วกลับมาสแกนที่นี่ เฉพาะระบบเท่านั้นที่ลบข้อมูลการจับคู่เก่าได้", + "@pairingBondRefusedAdviceBody": { + "description": "Advice card body: bond refused." + }, + "pairingBondRefusedAdviceFix": "จากนั้นกลับมาแตะ “ลองอีกครั้ง”", + "@pairingBondRefusedAdviceFix": { + "description": "Advice card fix: bond refused." + }, + "pairingFailedAdviceTitle": "พบสายรัดแต่ดำเนินการไม่เสร็จสมบูรณ์", + "@pairingFailedAdviceTitle": { + "description": "Advice card title: failed." + }, + "pairingFailedAdviceBody": "โดยทั่วไป การสแกนใหม่จากระยะประมาณหนึ่งเมตรจะช่วยได้", + "@pairingFailedAdviceBody": { + "description": "Advice card body: failed." + }, + "profileSetupTitle": "เกี่ยวกับคุณ", + "@profileSetupTitle": { + "description": "Profile setup screen header." + }, + "profileSetupBody": "ต้องเลือกเพศเพื่อดำเนินการต่อ อายุ ส่วนสูง และน้ำหนักมีผลต่อการคำนวณคะแนน หากเว้นข้อมูลใดไว้ จะไม่มีเฉพาะค่าที่จำเป็นต้องใช้ข้อมูลนั้น", + "@profileSetupBody": { + "description": "Profile setup intro body." + }, + "profileSetupSexHeader": "เพศ", + "@profileSetupSexHeader": { + "description": "Sex field section header." + }, + "profileSetupSexMale": "ชาย", + "@profileSetupSexMale": { + "description": "Sex option: male." + }, + "profileSetupSexFemale": "หญิง", + "@profileSetupSexFemale": { + "description": "Sex option: female." + }, + "profileSetupSexPreferNotToSay": "ไม่ประสงค์ระบุ", + "@profileSetupSexPreferNotToSay": { + "description": "Sex option: prefer not to say." + }, + "profileSetupOtherSexNote": "แคลอรีใช้ค่าเฉลี่ยจากสูตรที่เผยแพร่สำหรับทั้งสองเพศ ส่วนภาระการฝึกและความหนักมีค่าคงที่ที่เผยแพร่เพียงสองชุด ไม่มีชุดที่สาม จึงใช้ชุดของเพศชาย", + "@profileSetupOtherSexNote": { + "description": "Note shown when 'prefer not to say' is picked." + }, + "profileSetupAgeLabel": "อายุ", + "@profileSetupAgeLabel": { + "description": "Field label: age." + }, + "profileSetupAgeUnit": "ปี", + "@profileSetupAgeUnit": { + "description": "Unit hint: years." + }, + "profileSetupAgeConsequence": "หากไม่ระบุ จะไม่มีโซนอัตราการเต้นหัวใจ แคลอรี และอายุสมรรถภาพ", + "@profileSetupAgeConsequence": { + "description": "What is lost without age." + }, + "profileSetupHeightLabel": "ส่วนสูง", + "@profileSetupHeightLabel": { + "description": "Field label: height." + }, + "profileSetupHeightConsequence": "หากไม่ระบุ จะไม่มีความยาวก้าวและระยะทางจากจำนวนก้าว", + "@profileSetupHeightConsequence": { + "description": "What is lost without height." + }, + "profileSetupWeightLabel": "น้ำหนัก", + "@profileSetupWeightLabel": { + "description": "Field label: weight." + }, + "profileSetupWeightConsequence": "หากไม่ระบุ จะไม่มีแคลอรีและภาระการฝึก", + "@profileSetupWeightConsequence": { + "description": "What is lost without weight." + }, + "profileSetupOptional": "ไม่บังคับ", + "@profileSetupOptional": { + "description": "Field tag: optional." + }, + "profileSetupPickOneToContinue": "เลือกตัวเลือกด้านบนหนึ่งข้อเพื่อดำเนินการต่อ", + "@profileSetupPickOneToContinue": { + "description": "Hint below the disabled Continue button." + }, + "alarmNavTitle": "นาฬิกาปลุก", + "@alarmNavTitle": { + "description": "Alarm screen title." + }, + "alarmFiredAt": "ปลุกเมื่อ {time}", + "@alarmFiredAt": { + "description": "Alarm screen pill after the band fired the alarm today.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "alarmNavSub": "ปลุกด้วยสายรัดแทนโทรศัพท์", + "@alarmNavSub": { + "description": "Alarm screen subtitle." + }, + "alarmArmedFor": "ตั้งปลุกไว้สำหรับ", + "@alarmArmedFor": { + "description": "Armed-for section label." + }, + "alarmNextLabel": "ถัดไป", + "@alarmNextLabel": { + "description": "Next-occurrence section label." + }, + "alarmScheduleGroup": "ตารางประจำสัปดาห์", + "@alarmScheduleGroup": { + "description": "Settings group: the 7-day alarm schedule." + }, + "alarmWakeTimeRowTitle": "เวลาตื่น", + "@alarmWakeTimeRowTitle": { + "description": "Row: a weekday's configured wake time." + }, + "alarmNotConnectedTitle": "สายรัดไม่ได้เชื่อมต่อ", + "@alarmNotConnectedTitle": { + "description": "Status card: band not connected." + }, + "alarmNotConnectedBody": "ต้องเชื่อมต่ออยู่จึงจะเปลี่ยน ทดสอบ หรือยกเลิกการปลุกได้ การปลุกที่ตั้งไว้แล้วยังทำงานได้ เพราะบันทึกอยู่ในสายรัด", + "@alarmNotConnectedBody": { + "description": "Status card body: band not connected." + }, + "alarmSetAnAlarm": "ตั้งปลุก", + "@alarmSetAnAlarm": { + "description": "Button: set an alarm." + }, + "alarmChangeTheTime": "เปลี่ยนเวลา", + "@alarmChangeTheTime": { + "description": "Button: change the time." + }, + "alarmTestTheBuzz": "ทดสอบการสั่น", + "@alarmTestTheBuzz": { + "description": "Button: test the buzz." + }, + "alarmCancelTheAlarm": "ยกเลิกการปลุก", + "@alarmCancelTheAlarm": { + "description": "Button: cancel the alarm." + }, + "alarmBuzzingTheBand": "กำลังสั่งให้สายรัดสั่น", + "@alarmBuzzingTheBand": { + "description": "Snackbar: testing the buzz." + }, + "alarmCancelled": "ยกเลิกการปลุกแล้ว", + "@alarmCancelled": { + "description": "Snackbar: alarm cancelled." + }, + "alarmSentToBand": "ส่งการปลุกไปยังสายรัดแล้ว", + "@alarmSentToBand": { + "description": "Snackbar: alarm sent." + }, + "alarmInThePast": "เวลาผ่านไปแล้ว — ปลุกไปแล้วหรือพลาดการปลุก", + "@alarmInThePast": { + "description": "Which-day label: in the past." + }, + "alarmGlanceInThePast": "ปลุกไปแล้วหรือพลาดการปลุก", + "@alarmGlanceInThePast": { + "description": "Short form of alarmInThePast for the Home 'At a glance' alarm tile, which is half the screen wide." + }, + "alarmLaterToday": "ภายในวันนี้", + "@alarmLaterToday": { + "description": "Which-day label: later today." + }, + "alarmTomorrow": "พรุ่งนี้", + "@alarmTomorrow": { + "description": "Which-day label: tomorrow." + }, + "alarmInDays": "ในอีก {days} วัน", + "@alarmInDays": { + "description": "Which-day label: N days from now.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "alarmStateConfirmed": "ยืนยันแล้ว", + "@alarmStateConfirmed": { + "description": "Arm state label: confirmed." + }, + "alarmStateWaiting": "กำลังรอ", + "@alarmStateWaiting": { + "description": "Arm state label: waiting." + }, + "alarmStateNotConfirmed": "ยังไม่ยืนยัน", + "@alarmStateNotConfirmed": { + "description": "Arm state label: unknown/not confirmed." + }, + "alarmStateNotSet": "ยังไม่ตั้งค่า", + "@alarmStateNotSet": { + "description": "Arm state label: none." + }, + "alarmHeadlineConfirmed": "สายรัดบันทึกการปลุกนี้แล้ว", + "@alarmHeadlineConfirmed": { + "description": "Detail card headline: confirmed." + }, + "alarmHeadlinePending": "ส่งแล้ว — กำลังรอสายรัดยืนยัน", + "@alarmHeadlinePending": { + "description": "Detail card headline: pending." + }, + "alarmHeadlineUnknown": "ยังบอกไม่ได้ว่าการปลุกนี้จะทำงานหรือไม่", + "@alarmHeadlineUnknown": { + "description": "Detail card headline: unknown." + }, + "alarmHeadlineNone": "ยังไม่ได้ตั้งปลุก", + "@alarmHeadlineNone": { + "description": "Detail card headline: none." + }, + "alarmDetailConfirmed": "สายรัดรายงานว่าบันทึกการปลุกแล้ว", + "@alarmDetailConfirmed": { + "description": "Detail card body: confirmed." + }, + "alarmDetailPending": "ส่งคำสั่งถึงสายรัดแล้ว โดยปกติจะได้รับการยืนยันภายในไม่กี่วินาที", + "@alarmDetailPending": { + "description": "Detail card body: pending." + }, + "alarmDetailUnknown": "นี่คือเวลาที่แอปส่งครั้งล่าสุด แต่สายรัดยังไม่เคยยืนยัน หากต้องการความแน่นอน ให้ตั้งใหม่ขณะเชื่อมต่อ", + "@alarmDetailUnknown": { + "description": "Detail card body: unknown." + }, + "bandNotifNavTitle": "การแจ้งเตือนบนสายรัด", + "@bandNotifNavTitle": { + "description": "Screen title." + }, + "bandNotifNavSub": "สิ่งที่ทำให้สายรัดสั่น", + "@bandNotifNavSub": { + "description": "Screen subtitle." + }, + "bandNotifUnsupportedTitle": "โทรศัพท์เครื่องนี้ไม่รองรับ", + "@bandNotifUnsupportedTitle": { + "description": "Status card: unsupported platform." + }, + "bandNotifUnsupportedBody": "การอ่านว่าแอปใดส่งการแจ้งเตือนเป็นความสามารถของ Android ส่วน iOS ไม่อนุญาตให้แอปใดเข้าถึงข้อมูลนี้ รวมถึงแอปนี้ด้วย", + "@bandNotifUnsupportedBody": { + "description": "Status card body: unsupported platform." + }, + "bandNotifRelayGroup": "ส่งต่อการแจ้งเตือน", + "@bandNotifRelayGroup": { + "description": "Settings group header." + }, + "bandNotifBuzzOnAppNotifs": "สั่นเมื่อแอปแจ้งเตือน", + "@bandNotifBuzzOnAppNotifs": { + "description": "Setting row title." + }, + "bandNotifBuzzSub": "สายรัดจะสั่นเมื่อแอปด้านล่างแจ้งเตือน เก็บเฉพาะชื่อแอปไว้ในโทรศัพท์เครื่องนี้ ไม่อ่านเนื้อหาการแจ้งเตือน", + "@bandNotifBuzzSub": { + "description": "Setting row sub." + }, + "bandNotifAppsArmed": "แอปที่เปิดใช้การสั่น", + "@bandNotifAppsArmed": { + "description": "Setting row title: count of armed apps." + }, + "bandNotifPermissionTitle": "ต้องอนุญาตให้อ่านการแจ้งเตือนใน Android", + "@bandNotifPermissionTitle": { + "description": "Status card: needs permission." + }, + "bandNotifPermissionBody": "สิทธิ์นี้บอกว่าแอปใดส่งการแจ้งเตือน และใช้เพื่อจุดประสงค์นี้เท่านั้น ชื่อแอปจะอยู่ในโทรศัพท์เครื่องนี้ ไม่มีการส่งออกไป", + "@bandNotifPermissionBody": { + "description": "Status card body: needs permission." + }, + "bandNotifGrantAccess": "อนุญาตให้เข้าถึงการแจ้งเตือน", + "@bandNotifGrantAccess": { + "description": "Fix button: grant access." + }, + "bandNotifEmptyTitle": "ยังไม่มีแอปแจ้งเตือนคุณ", + "@bandNotifEmptyTitle": { + "description": "Status card: no apps yet." + }, + "bandNotifEmptyBody": "แต่ละแอปจะปรากฏที่นี่เมื่อแจ้งเตือนครั้งแรกขณะเปิดการส่งต่อ และเริ่มทำให้สายรัดสั่นได้ตั้งแต่การแจ้งเตือนครั้งที่สอง", + "@bandNotifEmptyBody": { + "description": "Status card body: no apps yet." + }, + "bandNotifAppsGroup": "แอปที่แจ้งเตือนคุณ", + "@bandNotifAppsGroup": { + "description": "Settings group header: apps list." + }, + "bandNotifOneBuzzTitle": "สั่นครั้งเดียว ไม่สั่นรัว", + "@bandNotifOneBuzzTitle": { + "description": "Status card: rate limiting explained." + }, + "bandNotifOneBuzzBody": "ไม่สนใจการแจ้งเตือนซ้ำจากแอปเดียวกันภายในสี่วินาที การแจ้งเตือนต่อเนื่อง เช่น เพลงหรือการดาวน์โหลด จะไม่ทำให้สั่น และจะไม่สั่นเมื่อไม่ได้เชื่อมต่อ", + "@bandNotifOneBuzzBody": { + "description": "Status card body: rate limiting explained." + }, + "bandNotifBuzzesDescription": "สั่น", + "@bandNotifBuzzesDescription": { + "description": "Semantic label suffix: buzzes." + }, + "bandNotifDoesNotBuzzDescription": "ไม่สั่น", + "@bandNotifDoesNotBuzzDescription": { + "description": "Semantic label suffix: does not buzz." + }, + "bandNotifBuzzes": "สั่น", + "@bandNotifBuzzes": { + "description": "Row trailing label: buzzes." + }, + "dataNavTitle": "ข้อมูลของคุณ", + "@dataNavTitle": { + "description": "Screen title." + }, + "dataExportGroup": "ส่งออก", + "@dataExportGroup": { + "description": "Group header." + }, + "dataExportSpreadsheets": "ส่งออกเป็นสเปรดชีต", + "@dataExportSpreadsheets": { + "description": "Row title." + }, + "dataExportSpreadsheetsSub": "ไฟล์ CSV {count} ไฟล์: ค่ารายวัน การออกกำลังกาย การนอน บันทึกประจำวัน ผลแล็บ และข้อมูลทั้งหมดที่คุณกรอก แต่ละวันระบุแหล่งที่มาและเวอร์ชันการคำนวณคะแนน", + "@dataExportSpreadsheetsSub": { + "description": "Row sub with file count.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dataExportDatabase": "ส่งออกฐานข้อมูล", + "@dataExportDatabase": { + "description": "Row title." + }, + "dataExportDatabaseSub": "ไฟล์ .db ไฟล์เดียว ข้อมูลครบถ้วนไม่สูญหาย และเป็นรูปแบบเดียวที่กู้คืนบนโทรศัพท์เครื่องอื่นได้ โปรแกรมอ่าน SQLite ใดก็เปิดได้ จึงควรเก็บให้ปลอดภัย", + "@dataExportDatabaseSub": { + "description": "Row sub." + }, + "dataExportEncrypted": "ส่งออกข้อมูลสำรองแบบเข้ารหัส", + "@dataExportEncrypted": { + "description": "Row title." + }, + "dataExportEncryptedSub": "สำเนาข้อมูลครบชุดเดิม แต่ล็อกด้วยรหัสลับ เหมาะสำหรับเก็บในที่อย่าง iCloud หากลืมรหัสลับ จะไม่มีใครเปิดไฟล์ได้", + "@dataExportEncryptedSub": { + "description": "Row sub." + }, + "dataAutoBackupGroup": "สำรองข้อมูลอัตโนมัติ", + "@dataAutoBackupGroup": { + "description": "Group header." + }, + "dataHowOften": "ความถี่", + "@dataHowOften": { + "description": "Row title." + }, + "dataHowOftenSub": "บันทึกสำเนาที่บีบอัดแต่ไม่เข้ารหัสไว้ที่ {dir} โดยเก็บ {kept} ชุดล่าสุด", + "@dataHowOftenSub": { + "description": "Row sub.", + "placeholders": { + "dir": { + "type": "String" + }, + "kept": { + "type": "int" + } + } + }, + "dataLastBackup": "สำรองข้อมูลล่าสุด", + "@dataLastBackup": { + "description": "Row title." + }, + "dataNever": "ไม่เคย", + "@dataNever": { + "description": "Row value: never." + }, + "dataBackUpNow": "สำรองข้อมูลตอนนี้", + "@dataBackUpNow": { + "description": "Row title." + }, + "dataBringDataInGroup": "นำเข้าข้อมูล", + "@dataBringDataInGroup": { + "description": "Group header." + }, + "dataImportFile": "นำเข้าไฟล์", + "@dataImportFile": { + "description": "Row title." + }, + "dataImportFileSub": "ข้อมูลสำรอง OpenStrap, CSV บันทึกประจำวัน, ข้อมูลเซ็นเซอร์ดิบ หรือ CSV จากผู้ผลิต จะไม่เขียนทับวันที่สายรัดวัดไว้แล้ว", + "@dataImportFileSub": { + "description": "Row sub." + }, + "dataFromYourPhone": "จากโทรศัพท์ของคุณ", + "@dataFromYourPhone": { + "description": "Row title." + }, + "dataFromYourPhoneSub": "อัตราการเต้นหัวใจขณะพัก ความดันโลหิต กลูโคส และอุณหภูมิร่างกาย", + "@dataFromYourPhoneSub": { + "description": "Row sub." + }, + "dataRebuildGroup": "สร้างใหม่", + "@dataRebuildGroup": { + "description": "Group header." + }, + "dataReanalyzeEverything": "วิเคราะห์ทั้งหมดอีกครั้ง", + "@dataReanalyzeEverything": { + "description": "Row title." + }, + "dataReanalyzeEverythingSub": "คำนวณคะแนนทุกวันใหม่จากข้อมูลที่เก็บไว้ จำเป็นหลังบินข้ามเขตเวลาระยะไกล และหลังนำเข้าข้อมูลที่วันไม่เรียงตามลำดับ", + "@dataReanalyzeEverythingSub": { + "description": "Row sub." + }, + "dataThatDidNotWork": "ดำเนินการไม่สำเร็จ", + "@dataThatDidNotWork": { + "description": "Status card title: failure." + }, + "dataFailed": "ไม่สำเร็จ: {error}", + "@dataFailed": { + "description": "Generic failure message with error text.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "dataNothingExportedFailed": "ไม่ได้ส่งออกข้อมูล ({failed} รายการไม่สำเร็จ)", + "@dataNothingExportedFailed": { + "description": "Export result: nothing exported, some sets failed.", + "placeholders": { + "failed": { + "type": "String" + } + } + }, + "dataNothingToExportYet": "ยังไม่มีข้อมูลให้ส่งออก", + "@dataNothingToExportYet": { + "description": "Export result: nothing to export." + }, + "dataFilesShared": "{n, plural, other{แชร์แล้ว {n} ไฟล์}}", + "@dataFilesShared": { + "description": "Export result: N files shared.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "dataSetsFailed": "ชุดข้อมูล {count} ชุดไม่สำเร็จ: {list}", + "@dataSetsFailed": { + "description": "N export sets failed, with names.", + "placeholders": { + "count": { + "type": "int" + }, + "list": { + "type": "String" + } + } + }, + "dataDatabaseShared": "แชร์ฐานข้อมูลแล้ว นี่คือสำเนาข้อมูลครบชุด", + "@dataDatabaseShared": { + "description": "Export result: database shared." + }, + "dataEncryptedBackupShared": "แชร์ข้อมูลสำรองแบบเข้ารหัสแล้ว หากไม่มีรหัสลับนั้น จะไม่มีใครเปิดได้ รวมถึงแอปนี้และเราด้วย", + "@dataEncryptedBackupShared": { + "description": "Export result: encrypted backup shared." + }, + "dataDaysReanalyzed": "{n, plural, other{วิเคราะห์ใหม่แล้ว {n} วัน}}", + "@dataDaysReanalyzed": { + "description": "Re-analyze result: N days.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "dataBackupFailed": "สำรองข้อมูลไม่สำเร็จ: {error}", + "@dataBackupFailed": { + "description": "Backup result: failed.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "dataBackupSkipped": "ข้ามการสำรองข้อมูลแล้ว", + "@dataBackupSkipped": { + "description": "Backup result: skipped." + }, + "dataBackedUpTo": "สำรองข้อมูลไว้ที่ {path}", + "@dataBackedUpTo": { + "description": "Backup result: succeeded, with path.", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "dataCouldNotOpenPicker": "เปิดหน้าต่างเลือกไฟล์ไม่ได้: {error}", + "@dataCouldNotOpenPicker": { + "description": "Import: could not open picker.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "dataSummariesDidNotBodyShort": "บันทึกข้อมูลที่นำเข้าทุกแถวแล้ว แต่อัปเดตแนวโน้มไม่สำเร็จ ({error}) แนวโน้มและข้อสังเกตยังแสดงข้อมูลเดิม", + "@dataSummariesDidNotBodyShort": { + "description": "Rollup error body (shorter, no re-analyze CTA copy).", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "devicesAddASensor": "เพิ่มเซ็นเซอร์", + "@devicesAddASensor": { + "description": "Row/sheet title: add a sensor." + }, + "devicesAddASensorSub": "สายคาดวัดหัวใจหรือแหวน ใช้ร่วมกับสายรัด", + "@devicesAddASensorSub": { + "description": "Row sub." + }, + "devicesWhichSourceWins": "ลำดับความสำคัญของแหล่งข้อมูล", + "@devicesWhichSourceWins": { + "description": "Row title: opens the per-signal priority editor." + }, + "devicesWhichSourceWinsSub": "เมื่ออุปกรณ์สองชิ้นวัดสิ่งเดียวกัน", + "@devicesWhichSourceWinsSub": { + "description": "Row sub for the priority-editor entry." + }, + "devicesResetToDefault": "กลับไปใช้ลำดับเริ่มต้น", + "@devicesResetToDefault": { + "description": "Per-signal reset-to-physics-ladder action in the priority editor." + }, + "devicesMySources": "แหล่งข้อมูลของฉัน", + "@devicesMySources": { + "description": "Screen title." + }, + "devicesNoBandPaired": "ยังไม่ได้จับคู่สายรัด", + "@devicesNoBandPaired": { + "description": "Status card title." + }, + "devicesNothingMeasuringYet": "ยังไม่มีอุปกรณ์กำลังวัด", + "@devicesNothingMeasuringYet": { + "description": "Status card title." + }, + "devicesPhoneCountingBody": "โทรศัพท์นับได้เฉพาะก้าว จะยังไม่แสดงอัตราการเต้นหัวใจ การนอน การฟื้นตัว และอุณหภูมิจนกว่าจะจับคู่สายรัด", + "@devicesPhoneCountingBody": { + "description": "Status card body: phone only." + }, + "devicesNothingMeasuringBody": "ยังไม่ได้จับคู่สายรัดและไม่มีข้อมูลก้าวจากโทรศัพท์ แอปจึงยังไม่แสดงค่าต่าง ๆ แทนการประมาณขึ้นมา", + "@devicesNothingMeasuringBody": { + "description": "Status card body: nothing measuring." + }, + "devicesPairABand": "จับคู่สายรัด", + "@devicesPairABand": { + "description": "Fix button." + }, + "devicesLive": "สด", + "@devicesLive": { + "description": "Section header." + }, + "devicesQualityLadder": "ลำดับคุณภาพข้อมูล", + "@devicesQualityLadder": { + "description": "Section header." + }, + "devicesNothingHereYet": "ยังไม่มีข้อมูลที่นี่", + "@devicesNothingHereYet": { + "description": "Empty tier row note." + }, + "devicesExperimental": "อยู่ระหว่างทดลอง", + "@devicesExperimental": { + "description": "Tag: experimental support." + }, + "devicesStreamingBeats": "กำลังสตรีมข้อมูลจังหวะหัวใจ", + "@devicesStreamingBeats": { + "description": "Source state: streaming." + }, + "devicesStoringWhatItSends": "จับคู่แล้ว · กำลังเก็บข้อมูลที่ส่งมา", + "@devicesStoringWhatItSends": { + "description": "Source state: paired, unranked." + }, + "devicesWaitingForWorkout": "กำลังรอการออกกำลังกาย", + "@devicesWaitingForWorkout": { + "description": "Source state: paired sensor, idle." + }, + "devicesReportingSteps": "กำลังรายงานจำนวนก้าว", + "@devicesReportingSteps": { + "description": "Source state: phone reporting." + }, + "devicesNoStepsArriving": "ไม่มีข้อมูลก้าวเข้ามา", + "@devicesNoStepsArriving": { + "description": "Source state: phone not reporting." + }, + "devicesSyncing": "กำลังซิงค์", + "@devicesSyncing": { + "description": "Source state: syncing." + }, + "devicesConnected": "เชื่อมต่อแล้ว", + "@devicesConnected": { + "description": "Source state: connected." + }, + "devicesNotConnected": "ไม่ได้เชื่อมต่อ", + "@devicesNotConnected": { + "description": "Source state: not connected." + }, + "devicesTierRank": "ระดับ {rank}", + "@devicesTierRank": { + "description": "Tier pill: rank only.", + "placeholders": { + "rank": { + "type": "int" + } + } + }, + "devicesTierRankLabel": "ระดับ {rank} · {label}", + "@devicesTierRankLabel": { + "description": "Tier row title: rank and label.", + "placeholders": { + "rank": { + "type": "int" + }, + "label": { + "type": "String" + } + } + }, + "devicesOuraKeyRefused": "แหวนปฏิเสธคีย์ จับคู่ใหม่เพื่อติดตั้งคีย์ที่แหวนยอมรับ", + "@devicesOuraKeyRefused": { + "description": "Snackbar: Oura sync failed — the ring explicitly refused the pairing key." + }, + "devicesBandKeyRefused": "สายรัดปฏิเสธคีย์ จับคู่ใหม่เพื่อติดตั้งคีย์ที่สายรัดยอมรับ", + "@devicesBandKeyRefused": { + "description": "Snackbar: Mi Band sync failed — the band explicitly refused the pairing key." + }, + "devicesOuraStorageFailed": "บันทึกข้อมูลที่ซิงค์ได้ไม่ครบ โปรดลองซิงค์อีกครั้ง", + "@devicesOuraStorageFailed": { + "description": "Snackbar: Oura sync failed — the durable storage commit failed." + }, + "devicesOuraProtocolTimeout": "แหวนหยุดตอบกลับระหว่างซิงค์ โปรดลองซิงค์อีกครั้ง", + "@devicesOuraProtocolTimeout": { + "description": "Snackbar: Oura sync failed — protocol timeout / incomplete answer." + }, + "devicesOuraWriteRefused": "ส่งคำสั่งไปยังแหวนไม่ได้ โปรดลองซิงค์อีกครั้ง", + "@devicesOuraWriteRefused": { + "description": "Snackbar: Oura sync failed — the link refused a command write." + }, + "devicesOuraCheckpointUnconfirmed": "ซิงค์ไม่เสร็จสมบูรณ์ โปรดลองซิงค์อีกครั้ง", + "@devicesOuraCheckpointUnconfirmed": { + "description": "Snackbar: Oura sync failed — a batch checkpoint was not confirmed in time." + }, + "devicesSyncingTheRing": "กำลังซิงค์แหวน…", + "@devicesSyncingTheRing": { + "description": "Snackbar: syncing ring." + }, + "devicesSynced": "ซิงค์แล้ว", + "@devicesSynced": { + "description": "Snackbar: sync succeeded." + }, + "devicesCouldNotReachRing": "ติดต่อแหวนไม่ได้ แหวนต้องอยู่ใกล้และไม่ได้เชื่อมต่อกับแอปอื่น", + "@devicesCouldNotReachRing": { + "description": "Snackbar: sync failed." + }, + "devicesCouldNotReachCorosWatch": "ติดต่ออุปกรณ์ไม่ได้ อุปกรณ์ต้องอยู่ใกล้และไม่ได้เชื่อมต่อกับแอปอื่น", + "@devicesCouldNotReachCorosWatch": { + "description": "Snackbar: sync failed, for a paired Coros or Pebble watch (device-neutral text)." + }, + "devicesSyncingTheSensor": "กำลังซิงค์เซ็นเซอร์…", + "@devicesSyncingTheSensor": { + "description": "Snackbar: syncing a paired non-ring sensor (e.g. a thermometer)." + }, + "devicesCouldNotReachSensor": "ติดต่อเซ็นเซอร์ไม่ได้ เซ็นเซอร์ต้องอยู่ใกล้และไม่ได้เชื่อมต่อกับแอปอื่น", + "@devicesCouldNotReachSensor": { + "description": "Snackbar: sensor sync failed." + }, + "deviceFilterAllDevices": "อุปกรณ์ทั้งหมด", + "@deviceFilterAllDevices": { + "description": "First pill in a metric screen's per-device filter — the merged view." + }, + "devicesForgetSensor": "ลืม {name} หรือไม่?", + "@devicesForgetSensor": { + "description": "Dialog title: forget a paired sensor.", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "devicesForgetSensorBody": "จะหยุดใช้เซ็นเซอร์นี้ระหว่างออกกำลังกายและต้องจับคู่ใหม่ ข้อมูลทั้งหมดที่บันทึกไว้ในโทรศัพท์เครื่องนี้ยังอยู่", + "@devicesForgetSensorBody": { + "description": "Dialog body: forget a sensor." + }, + "devicesKeepItPaired": "จับคู่ไว้ต่อ", + "@devicesKeepItPaired": { + "description": "Dialog action: cancel forget." + }, + "devicesForgetIt": "ลืมอุปกรณ์", + "@devicesForgetIt": { + "description": "Dialog action: confirm forget." + }, + "devicesNameThisBand": "ตั้งชื่อสายรัดนี้", + "@devicesNameThisBand": { + "description": "Dialog title: rename." + }, + "devicesYourBand": "สายรัดของคุณ", + "@devicesYourBand": { + "description": "Rename field hint." + }, + "devicesNameCharset": "ตัวอักษร ตัวเลข ช่องว่าง และ ' . _ -", + "@devicesNameCharset": { + "description": "Rename field helper text." + }, + "devicesGiveItAName": "ตั้งชื่อ", + "@devicesGiveItAName": { + "description": "Rename validation error: empty." + }, + "devicesNameCharsetError": "ใช้ได้เฉพาะตัวอักษร ตัวเลข ช่องว่าง และ ' . _ -", + "@devicesNameCharsetError": { + "description": "Rename validation error: bad charset." + }, + "devicesRenamedTo": "เปลี่ยนชื่อเป็น {name} แล้ว", + "@devicesRenamedTo": { + "description": "Snackbar: renamed.", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "devicesCouldNotRename": "เปลี่ยนชื่อสายรัดไม่ได้: {error}", + "@devicesCouldNotRename": { + "description": "Snackbar: rename failed.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "devicesForgetBand": "ลืม {name} หรือไม่?", + "@devicesForgetBand": { + "description": "Dialog title: forget band.", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "devicesForgetBandBody": "สายรัดจะหยุดซิงค์จนกว่าจะจับคู่ใหม่ ข้อมูลทั้งหมดที่บันทึกไว้ในโทรศัพท์เครื่องนี้ยังอยู่", + "@devicesForgetBandBody": { + "description": "Dialog body: forget band." + }, + "devicesSupport": "การรองรับ", + "@devicesSupport": { + "description": "Row title: support status." + }, + "devicesSensorExperimentalSub": "ถอดรหัสจากโพรโทคอลแล้ว แต่ยังไม่เคยตรวจสอบกับฮาร์ดแวร์จริง เพราะยังไม่มีใครในทีมมีอุปกรณ์นี้", + "@devicesSensorExperimentalSub": { + "description": "Row sub: sensor experimental." + }, + "devicesWhatItDoes": "ความสามารถ", + "@devicesWhatItDoes": { + "description": "Row title." + }, + "devicesLastData": "ข้อมูลล่าสุด", + "@devicesLastData": { + "description": "Row title." + }, + "devicesNothingBankedYet": "ยังไม่มีข้อมูลที่เก็บไว้", + "@devicesNothingBankedYet": { + "description": "Row sub: no data yet." + }, + "devicesSyncNow": "ซิงค์ตอนนี้", + "@devicesSyncNow": { + "description": "Row title: manual sync." + }, + "devicesSyncNowSub": "ดึงข้อมูลทั้งหมดที่อุปกรณ์เก็บไว้", + "@devicesSyncNowSub": { + "description": "Row sub: manual sync, for a sensor that fetches held history off a cursor (e.g. Oura)." + }, + "devicesSyncNowSubListen": "รอรับข้อมูลที่ส่งมาในขณะนี้", + "@devicesSyncNowSubListen": { + "description": "Row sub: manual sync, for a sensor that only opens a bounded listen window with no history fetch." + }, + "devicesName": "ชื่อ", + "@devicesName": { + "description": "Row title: device name." + }, + "devicesConnectToRename": "เชื่อมต่อสายรัดเพื่อเปลี่ยนชื่อ", + "@devicesConnectToRename": { + "description": "Row sub: rename disabled." + }, + "devicesBattery": "แบตเตอรี่", + "@devicesBattery": { + "description": "Row title." + }, + "devicesBatteryNotReported": "ยังไม่รายงานนับตั้งแต่เชื่อมต่อครั้งล่าสุด", + "@devicesBatteryNotReported": { + "description": "Row sub: battery unknown." + }, + "devicesBatteryPack": "แบตเตอรี่เสริม", + "@devicesBatteryPack": { + "description": "Row title: the charge left in the external battery pack sitting on the band." + }, + "devicesBatteryPackSub": "สายรัดรายงานประมาณทุก 10 นาที", + "@devicesBatteryPackSub": { + "description": "Row sub under the battery-pack charge: where the number comes from and how often it updates." + }, + "devicesCharging": "กำลังชาร์จ", + "@devicesCharging": { + "description": "Battery sub tag: charging." + }, + "devicesHeartRate": "อัตราการเต้นหัวใจ", + "@devicesHeartRate": { + "description": "Row title: live heart rate." + }, + "devicesRightNow": "ขณะนี้", + "@devicesRightNow": { + "description": "Row sub: live value." + }, + "devicesCalibration": "การปรับเทียบ", + "@devicesCalibration": { + "description": "Row title." + }, + "devicesBandExperimentalSub": "ถอดรหัสสายรัดนี้แล้ว แต่ยังไม่มีใครในทีมเคยสวมใช้งาน ตรวจสอบค่าต่าง ๆ กับโพรโทคอลเท่านั้น ยังไม่ได้ตรวจสอบกับฮาร์ดแวร์จริง", + "@devicesBandExperimentalSub": { + "description": "Row sub: band experimental." + }, + "devicesBuzzTheBand": "สั่งให้สายรัดสั่น", + "@devicesBuzzTheBand": { + "description": "Row title." + }, + "devicesFindItByFeel": "หาตำแหน่งจากแรงสั่น", + "@devicesFindItByFeel": { + "description": "Row sub." + }, + "devicesForgetThisBand": "ลืมสายรัดนี้", + "@devicesForgetThisBand": { + "description": "Row title: danger action." + }, + "pairSensorAddASensor": "เพิ่มเซ็นเซอร์", + "@pairSensorAddASensor": { + "description": "Screen nav title." + }, + "pairSensorWhatThisAdds": "สิ่งที่จะได้เพิ่ม", + "@pairSensorWhatThisAdds": { + "description": "Section header: no paired sensor." + }, + "pairSensorPairAnother": "จับคู่อีกอุปกรณ์", + "@pairSensorPairAnother": { + "description": "Section header: has a paired sensor." + }, + "pairSensorSearchWouldHideSheet": "การค้นหาจะซ่อนหน้าต่างจับคู่ของระบบ", + "@pairSensorSearchWouldHideSheet": { + "description": "iOS-gate status card title." + }, + "pairSensorKeyTitle": "เคยตั้งค่ากับแอปอื่นแล้วหรือไม่?", + "@pairSensorKeyTitle": { + "description": "Section title for pairing with an existing device key." + }, + "pairSensorKeyBody": "มีคีย์ของอุปกรณ์นี้หรือไม่? วางคีย์เพื่อจับคู่โดยไม่ต้องคืนค่าโรงงาน หากมีหลายคีย์ ให้ใส่บรรทัดละหนึ่งคีย์เพื่อทดลองตามลำดับ เว้นว่างเพื่อจับคู่ตามปกติ", + "@pairSensorKeyBody": { + "description": "Explainer under the existing-key section title." + }, + "pairSensorKeyHint": "เลขฐานสิบหก 32 หลัก หรือ base64 — บรรทัดละหนึ่งคีย์", + "@pairSensorKeyHint": { + "description": "Hint text in the existing-key field." + }, + "pairSensorSearchAnyway": "ค้นหาต่อ", + "@pairSensorSearchAnyway": { + "description": "iOS-gate status card fix." + }, + "devicePickerTitle": "เชื่อมต่ออุปกรณ์ของคุณ", + "@devicePickerTitle": { + "description": "Unified pairing screen title." + }, + "devicePickerSubtitle": "เพิ่มอุปกรณ์ที่คุณใช้งาน และเพิ่มอีกได้ทุกเมื่อ", + "@devicePickerSubtitle": { + "description": "Unified pairing screen subtitle." + }, + "devicePickerBrowseByCategory": "เลือกตามหมวดหมู่", + "@devicePickerBrowseByCategory": { + "description": "Section header over the device category list." + }, + "devicePickerPrivacyNote": "ทุกอย่างอยู่ในโทรศัพท์เครื่องนี้ ไม่มีการส่งไปที่ใดจนกว่าคุณจะเลือกส่งออก", + "@devicePickerPrivacyNote": { + "description": "Footer privacy note on the device picker." + }, + "devicePickerSearchLabel": "ค้นหาอุปกรณ์หรือประเภท", + "@devicePickerSearchLabel": { + "description": "Accessibility label for the device picker's search field." + }, + "devicePickerSearchHint": "ค้นหาอุปกรณ์หรือประเภท", + "@devicePickerSearchHint": { + "description": "Placeholder text in the device picker's search field." + }, + "devicePickerNothingNearbyTitle": "ยังไม่พบอุปกรณ์", + "@devicePickerNothingNearbyTitle": { + "description": "Status card title when the live scan has found nothing." + }, + "devicePickerNothingNearbyBody": "อุปกรณ์จะตอบกลับเมื่อทำงานอยู่ สวมใช้งานอยู่ และยังไม่ได้เชื่อมต่อกับโทรศัพท์หรือแอปอื่น", + "@devicePickerNothingNearbyBody": { + "description": "Status card body when the live scan has found nothing." + }, + "devicePickerNearby": "ใกล้เคียง", + "@devicePickerNearby": { + "description": "Section header over live scan results." + }, + "devicePickerScanning": "กำลังสแกนหาอุปกรณ์ใกล้เคียง…", + "@devicePickerScanning": { + "description": "Row shown while the live scan is running." + }, + "devicePickerBlurbBand": "สายรัดหลักที่แอปนี้ออกแบบมารองรับ WHOOP 4 หรือ 5", + "@devicePickerBlurbBand": { + "description": "Category row subtitle for the WHOOP band." + }, + "devicePickerBlurbRing": "อ่านข้อมูลจากแหวนโดยตรง ไม่ต้องมีบัญชีหรือสมัครสมาชิก Oura", + "@devicePickerBlurbRing": { + "description": "Category row subtitle for the Oura ring." + }, + "devicePickerBlurbPolarPmd": "Polar Verity Sense หรือ OH1 วัดช่วงเวลาระหว่างชีพจรด้วยแสงและสตรีมระหว่างออกกำลังกายเช่นเดียวกับสายคาดอก", + "@devicePickerBlurbPolarPmd": { + "description": "Category row subtitle for a Polar PMD optical sensor." + }, + "devicePickerBlurbSensor": "สายคาดอกหรือสายรัดต้นแขน สำหรับวัดช่วงเวลาระหว่างจังหวะหัวใจขณะออกกำลังกาย", + "@devicePickerBlurbSensor": { + "description": "Category row subtitle for a standard Bluetooth heart-rate sensor." + }, + "devicePickerBlurbCoros": "นาฬิกากีฬา อ่านแบตเตอรี่และอัตราการเต้นหัวใจสดได้ ส่วนกิจกรรมที่บันทึกไว้ยังอยู่ในนาฬิกา", + "@devicePickerBlurbCoros": { + "description": "Category row subtitle for a Coros sports watch." + }, + "devicePickerBlurbMiband234": "Mi Band 2 หรือ 3: อัตราการเต้นหัวใจ ก้าว และการนอน ยกเลิกการจับคู่จาก Mi Fit หรือ Zepp ก่อน หรือรีเซ็ตอุปกรณ์ แตะสายรัดหากสั่น ยังไม่รองรับ Mi Band 4", + "@devicePickerBlurbMiband234": { + "description": "Category row subtitle for a Mi Band 2/3." + }, + "devicePickerBlurbColmi": "แหวน Colmi ซิงค์อัตราการเต้นหัวใจ ระยะการนอน ก้าว SpO2, HRV และความเครียด ค่าที่แหวนคำนวณเองจะระบุว่าเป็นของ Colmi ยังอยู่ระหว่างทดลอง", + "@devicePickerBlurbColmi": { + "description": "Category row subtitle for a Colmi smart ring." + }, + "devicePickerCannotPairFromHere": "จับคู่อุปกรณ์นั้นจากหน้านี้ไม่ได้", + "@devicePickerCannotPairFromHere": { + "description": "Shown when a tapped category has no pairing step behind it." + }, + "pairSensorSearching": "กำลังค้นหา…", + "@pairSensorSearching": { + "description": "Button label: scanning." + }, + "pairSensorSearchForSensors": "ค้นหาเซ็นเซอร์", + "@pairSensorSearchForSensors": { + "description": "Button label: idle." + }, + "pairSensorThatDidNotWork": "ดำเนินการไม่สำเร็จ", + "@pairSensorThatDidNotWork": { + "description": "Status card title: failure." + }, + "pairSensorInRange": "อยู่ในระยะ", + "@pairSensorInRange": { + "description": "Section header: candidates list." + }, + "pairSensorListeningForSensors": "กำลังรอรับสัญญาณเซ็นเซอร์…", + "@pairSensorListeningForSensors": { + "description": "Empty state while scanning." + }, + "pairSensorNothingFoundYet": "ยังไม่พบอุปกรณ์", + "@pairSensorNothingFoundYet": { + "description": "Status card title: empty result." + }, + "pairSensorNothingFoundBody": "เซ็นเซอร์จะตอบกลับการค้นหาเมื่อทำงานอยู่ สวมอยู่หรือสัมผัสความชื้น และยังไม่ได้เชื่อมต่อกับโทรศัพท์หรือแอปอื่น", + "@pairSensorNothingFoundBody": { + "description": "Status card body: empty result." + }, + "pairSensorPaired": "จับคู่แล้ว", + "@pairSensorPaired": { + "description": "Section header: already paired." + }, + "pairSensorUsedDuringWorkouts": "ใช้ระหว่างออกกำลังกาย", + "@pairSensorUsedDuringWorkouts": { + "description": "Row sub: paired sensor." + }, + "pairSensorForgetThisSensor": "ลืมเซ็นเซอร์นี้", + "@pairSensorForgetThisSensor": { + "description": "Row title: danger action." + }, + "pairSensorForgetThisSensorSub": "ลบแหล่งข้อมูล ค่าที่วัดไว้แล้วยังอยู่", + "@pairSensorForgetThisSensorSub": { + "description": "Row sub: forget sensor." + }, + "pairSensorPairing": "กำลังจับคู่…", + "@pairSensorPairing": { + "description": "Row sub: pairing in progress." + }, + "pairSensorScanDidNotRun": "สแกนไม่ได้: {error}", + "@pairSensorScanDidNotRun": { + "description": "Error: scan failed to run.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "pairSensorCouldNotPair": "จับคู่อุปกรณ์นั้นไม่ได้: {error}", + "@pairSensorCouldNotPair": { + "description": "Error: pairing failed.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "phoneImportSystolic": "ความดันโลหิตตัวบน", + "@phoneImportSystolic": { + "description": "Imported measurement kind label." + }, + "phoneImportDiastolic": "ความดันโลหิตตัวล่าง", + "@phoneImportDiastolic": { + "description": "Imported measurement kind label." + }, + "phoneImportGlucose": "กลูโคสในเลือด", + "@phoneImportGlucose": { + "description": "Imported measurement kind label." + }, + "phoneImportBodyTemp": "อุณหภูมิร่างกาย", + "@phoneImportBodyTemp": { + "description": "Imported measurement kind label." + }, + "phoneImportNavTitle": "จากโทรศัพท์ของคุณ", + "@phoneImportNavTitle": { + "description": "Screen title." + }, + "phoneImportRhrSection": "อัตราการเต้นหัวใจขณะพัก", + "@phoneImportRhrSection": { + "description": "Section header." + }, + "phoneImportRhrExplainer": "อ่านอัตราการเต้นหัวใจขณะพักจาก {store} เพื่อให้แอปทราบค่าปกติคร่าว ๆ ก่อนสายรัดจะวัดได้", + "@phoneImportRhrExplainer": { + "description": "Explanatory body.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "phoneImportRhrLimit": "ยังไม่นำมาใช้ เมื่อสายรัดมีข้อมูลครบ 14 คืน จะเปรียบเทียบด้านล่าง ข้อมูลนี้จะไม่กลายเป็นค่าที่แอปวัดเอง", + "@phoneImportRhrLimit": { + "description": "Promise-limit body." + }, + "phoneImportReadRhr": "อ่านอัตราการเต้นหัวใจขณะพัก", + "@phoneImportReadRhr": { + "description": "Button label." + }, + "phoneImportWhatPhoneSays": "ข้อมูลจากโทรศัพท์", + "@phoneImportWhatPhoneSays": { + "description": "Metric row title." + }, + "phoneImportUsuallyRange": "ปกติ {low}–{high} bpm จาก {store} ในช่วง {days} วัน", + "@phoneImportUsuallyRange": { + "description": "Metric row sub: baseline range.", + "placeholders": { + "low": { + "type": "int" + }, + "high": { + "type": "int" + }, + "days": { + "type": "int" + }, + "store": { + "type": "String" + } + } + }, + "phoneImportDisagreeTitle": "โทรศัพท์กับสายรัดให้ค่าต่างกัน", + "@phoneImportDisagreeTitle": { + "description": "Status card title: disagreement." + }, + "phoneImportAgreeTitle": "โทรศัพท์กับสายรัดให้ค่าสอดคล้องกัน", + "@phoneImportAgreeTitle": { + "description": "Status card title: agreement." + }, + "phoneImportHigher": "สูงกว่า", + "@phoneImportHigher": { + "description": "Comparison word: higher." + }, + "phoneImportLower": "ต่ำกว่า", + "@phoneImportLower": { + "description": "Comparison word: lower." + }, + "phoneImportDisagreeBody": "อัตราการเต้นหัวใจขณะพักจาก {store} {dir}สายรัดนี้ {delta} bpm ตลอด {nights} คืน ทั้งสองวัดต่างวิธีกัน จึงยังไม่นำข้อมูลนี้มาใช้", + "@phoneImportDisagreeBody": { + "description": "Status card body: disagreement.", + "placeholders": { + "store": { + "type": "String" + }, + "delta": { + "type": "String" + }, + "dir": { + "type": "String" + }, + "nights": { + "type": "int" + } + } + }, + "phoneImportAgreeBody": "ตลอด {nights} คืน ค่าจากสายรัดต่างจาก {store} ไม่เกิน {delta} bpm แต่ยังไม่นำข้อมูลนี้ไปใช้งานใด ๆ", + "@phoneImportAgreeBody": { + "description": "Status card body: agreement.", + "placeholders": { + "nights": { + "type": "int" + }, + "delta": { + "type": "String" + }, + "store": { + "type": "String" + } + } + }, + "phoneImportMeasuredElsewhere": "วัดจากอุปกรณ์อื่น", + "@phoneImportMeasuredElsewhere": { + "description": "Section header." + }, + "phoneImportMeasuredElsewhereBody": "เครื่องวัดความดัน เครื่องวัดน้ำตาล เทอร์โมมิเตอร์ สายรัดวัดสิ่งเหล่านี้ไม่ได้ แต่ละค่าจึงระบุแอปที่บันทึกไว้", + "@phoneImportMeasuredElsewhereBody": { + "description": "Explanatory body." + }, + "phoneImportNeverAveraged": "แสดงตามที่ได้รับ ไม่เฉลี่ยรวมเป็นค่าที่แอปนี้คำนวณเอง และไม่ใช้สอนให้เดาค่าจากข้อมือ", + "@phoneImportNeverAveraged": { + "description": "Note: never blended." + }, + "phoneImportReadFrom": "อ่านจาก {store}", + "@phoneImportReadFrom": { + "description": "Button label.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "phoneImportMovedTitle": "ย้ายส่วนสูง น้ำหนัก และการออกกำลังกายแล้ว", + "@phoneImportMovedTitle": { + "description": "Status card title: moved features." + }, + "phoneImportMovedBody": "ส่วนสูงและน้ำหนักอยู่ใน “แก้ไขโปรไฟล์” ส่วนการออกกำลังกายที่โทรศัพท์บันทึกอยู่ใน “ออกกำลังกาย” ใต้ “ประวัติ” ข้อมูลแต่ละอย่างอยู่ในหน้าที่นำไปใช้", + "@phoneImportMovedBody": { + "description": "Status card body: moved features." + }, + "phoneImportRhrDenied": "{store} ไม่อนุญาตให้อ่านอัตราการเต้นหัวใจขณะพัก จึงไม่ได้อ่านข้อมูล", + "@phoneImportRhrDenied": { + "description": "Permission denied message.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "phoneImportRhrNothingUsable": "ไม่พบข้อมูลที่ใช้ได้ ต้องมีอัตราการเต้นหัวใจขณะพักหลายวันพอที่จะแสดงช่วงปกติของคุณ", + "@phoneImportRhrNothingUsable": { + "description": "Nothing usable came back." + }, + "phoneImportRhrSeeded": "{n, plural, other{เพิ่มข้อมูล {n} วันในช่วงปกติของคุณแล้ว ไม่ได้เพิ่มวันใดลงในกราฟ}}", + "@phoneImportRhrSeeded": { + "description": "Result: N days seeded.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "phoneImportMeasurementsDenied": "{store} ไม่อนุญาตให้อ่านค่าเหล่านั้น จึงไม่ได้อ่านข้อมูล", + "@phoneImportMeasurementsDenied": { + "description": "Permission denied message.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "phoneImportNothingCameBack": "ไม่ได้รับข้อมูล {store} ไม่มีค่าประเภทเหล่านี้ หรือไม่มีค่าในช่วงเวลาที่อนุญาตให้แชร์", + "@phoneImportNothingCameBack": { + "description": "Nothing came back.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "phoneImportReadingsStored": "{n, plural, other{บันทึกแล้ว {n} ค่า พร้อมชื่อแอปที่บันทึกแต่ละค่า}}", + "@phoneImportReadingsStored": { + "description": "Result: N readings stored.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "profileDefaultName": "คุณ", + "@profileDefaultName": { + "description": "Default display name." + }, + "profileQuickAccessGroup": "เข้าถึงด่วน", + "@profileQuickAccessGroup": { + "description": "Group header." + }, + "profileSourcesCount": "{n, plural, other{{n} แหล่ง}}", + "@profileSourcesCount": { + "description": "Row sub: N sources.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "profileEditProfile": "แก้ไขโปรไฟล์", + "@profileEditProfile": { + "description": "Row title." + }, + "profileEditProfileSub": "เพศ อายุ ส่วนสูง น้ำหนัก", + "@profileEditProfileSub": { + "description": "Row sub." + }, + "profileAiCoach": "โค้ช AI", + "@profileAiCoach": { + "description": "Row title." + }, + "profileNotSetUp": "ยังไม่ได้ตั้งค่า", + "@profileNotSetUp": { + "description": "Row sub: not configured." + }, + "profileYourDataGroup": "ข้อมูลของคุณ", + "@profileYourDataGroup": { + "description": "Group header." + }, + "profileStorage": "พื้นที่จัดเก็บ", + "@profileStorage": { + "description": "Row title." + }, + "profileMoreSettings": "การตั้งค่าเพิ่มเติม", + "@profileMoreSettings": { + "description": "Row title." + }, + "profileMoreSettingsSub": "นำเข้าจาก {store} ส่งออก สำรองข้อมูล หน่วย ความเป็นส่วนตัว รีเซ็ต", + "@profileMoreSettingsSub": { + "description": "Row sub with health-store name.", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "welcomeHeadline": "ถอดรหัสสายรัดของคุณที่นี่", + "@welcomeHeadline": { + "description": "Welcome screen headline." + }, + "welcomeSubhead": "ทุกค่าคำนวณจากสัญญาณดิบบนโทรศัพท์เครื่องนี้", + "@welcomeSubhead": { + "description": "Welcome screen subhead." + }, + "welcomeSetUpMyBand": "ตั้งค่าสายรัดของฉัน", + "@welcomeSetUpMyBand": { + "description": "Button label." + }, + "welcomeImporting": "กำลังนำเข้า…", + "@welcomeImporting": { + "description": "Button label: busy." + }, + "welcomeBringMyHistoryFirst": "นำเข้าประวัติของฉันก่อน", + "@welcomeBringMyHistoryFirst": { + "description": "Button label: idle." + }, + "welcomeImportFooterNote": "ไฟล์เซ็นเซอร์ ข้อมูลสำรอง OpenStrap หรือ CSV จากผู้ผลิต วันที่นำเข้าช่วยสร้างช่วงปกติของคุณ และไม่เขียนทับวันที่สายรัดวัดไว้แล้ว", + "@welcomeImportFooterNote": { + "description": "Footer note about imports." + }, + "welcomeChoosePassphrase": "ตั้งรหัสลับ", + "@welcomeChoosePassphrase": { + "description": "Dialog title: create." + }, + "welcomePassphrase": "รหัสลับ", + "@welcomePassphrase": { + "description": "Dialog title / field label." + }, + "welcomePassphraseCreateNote": "หากไม่มีรหัสลับนี้จะเปิดไฟล์ไม่ได้ ไม่มีบัญชีหรือเซิร์ฟเวอร์เก็บสำเนาไว้ หากลืมรหัสลับจะกู้คืนข้อมูลสำรองไม่ได้", + "@welcomePassphraseCreateNote": { + "description": "Dialog body: creating." + }, + "welcomePassphraseOpenNote": "รหัสลับที่คุณตั้งไว้ตอนสร้างข้อมูลสำรองนี้", + "@welcomePassphraseOpenNote": { + "description": "Dialog body: opening." + }, + "welcomeRepeatIt": "พิมพ์ซ้ำ", + "@welcomeRepeatIt": { + "description": "Dialog field label: confirm passphrase." + }, + "welcomeEncrypt": "เข้ารหัส", + "@welcomeEncrypt": { + "description": "Dialog action: encrypt." + }, + "welcomeUnlock": "ปลดล็อก", + "@welcomeUnlock": { + "description": "Dialog action: unlock." + }, + "welcomePassphraseTooShort": "อย่างน้อย {n} อักขระ", + "@welcomePassphraseTooShort": { + "description": "Validation: too short.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomePassphraseMismatch": "รหัสลับทั้งสองไม่ตรงกัน", + "@welcomePassphraseMismatch": { + "description": "Validation: mismatch." + }, + "welcomePassphraseEmpty": "กรอกรหัสลับ", + "@welcomePassphraseEmpty": { + "description": "Validation: empty." + }, + "welcomeSourceCouldNotBeRead": "อ่าน {source} ไม่ได้", + "@welcomeSourceCouldNotBeRead": { + "description": "Error card title: unreadable file.", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "welcomeNothingWasImported": "ไม่ได้นำเข้าข้อมูล", + "@welcomeNothingWasImported": { + "description": "Status card title: nothing imported." + }, + "welcomeEveryRowRefused": "ปฏิเสธทุกแถว: {rejects}", + "@welcomeEveryRowRefused": { + "description": "Status card body: all rows refused.", + "placeholders": { + "rejects": { + "type": "String" + } + } + }, + "welcomeNothingUsableInFile": "อ่านไฟล์แล้ว แต่ไม่มีข้อมูลที่แอปใช้ได้ หรือทุกวันในไฟล์เป็นวันที่สายรัดนี้วัดไว้แล้ว", + "@welcomeNothingUsableInFile": { + "description": "Status card body: nothing usable." + }, + "welcomeWorkoutsCount": "{n, plural, other{การออกกำลังกาย {n} ครั้ง}}", + "@welcomeWorkoutsCount": { + "description": "N workouts, in a comma-list.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeDaysAlreadyMeasured": "{n, plural, other{{n} วันวัดไว้แล้วที่นี่ จึงคงข้อมูลเดิมไว้}}", + "@welcomeDaysAlreadyMeasured": { + "description": "N days already measured, in a comma-list.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeDaysImported": "{n, plural, other{นำเข้าแล้ว {n} วัน}}", + "@welcomeDaysImported": { + "description": "Import result headline: N days.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeJournalDaysWritten": "{n, plural, other{บันทึกประจำวันแล้ว {n} วัน}}", + "@welcomeJournalDaysWritten": { + "description": "Import result headline: N journal days.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeJournalDaysReplaced": "{n, plural, other{แทนที่บันทึกประจำวันแล้ว {n} วัน}}", + "@welcomeJournalDaysReplaced": { + "description": "Import result sub: N journal days replaced.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeLabResultsWritten": "{n, plural, other{บันทึกผลแล็บแล้ว {n} รายการ}}", + "@welcomeLabResultsWritten": { + "description": "Import result headline/sub: N lab results.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeRowsRefused": "{n, plural, other{ปฏิเสธ {n} แถว}}", + "@welcomeRowsRefused": { + "description": "Status card title: N rows refused.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeRejectedDetail": "{rejects} ไม่มีการตัดข้อมูลให้ผ่านเงื่อนไข โปรดแก้ไขบรรทัดเหล่านั้นแล้วนำเข้าอีกครั้ง", + "@welcomeRejectedDetail": { + "description": "Status card body: rejected rows detail + advice.", + "placeholders": { + "rejects": { + "type": "String" + } + } + }, + "welcomeOneFileCouldNotBeRead": "อ่านไฟล์หนึ่งในนั้นไม่ได้", + "@welcomeOneFileCouldNotBeRead": { + "description": "Status card title: partial read failure." + }, + "welcomeRestImported": "นำเข้าส่วนที่เหลือแล้ว {error}", + "@welcomeRestImported": { + "description": "Status card body: partial read failure.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "welcomeSummariesDidNotTitle": "นำเข้าข้อมูลรายวันแล้ว แต่สรุปไม่สำเร็จ", + "@welcomeSummariesDidNotTitle": { + "description": "Status card title: rollup error." + }, + "welcomeSummariesDidNotBody": "บันทึกข้อมูลที่นำเข้าทุกแถวแล้ว แต่อัปเดตแนวโน้มไม่สำเร็จ ({error}) แก้ไขได้โดยเปิด “ข้อมูลของคุณ” แล้วแตะ “วิเคราะห์ทั้งหมดอีกครั้ง”", + "@welcomeSummariesDidNotBody": { + "description": "Status card body: rollup error.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "welcomePartOfFileNotUsedTitle": "ใช้ข้อมูลบางส่วนในไฟล์นั้นไม่ได้", + "@welcomePartOfFileNotUsedTitle": { + "description": "Status card title: partial data loss." + }, + "welcomeStrandedDays": "{n, plural, other{ข้อมูล {n} วันมาไม่เรียงตามลำดับ จึงใช้เป็นบริบทสำหรับวันถัดไปเท่านั้น}}", + "@welcomeStrandedDays": { + "description": "N stranded days.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeArchiveSkipped": "{n, plural, other{ประวัติเซ็นเซอร์ที่เก็บไว้ {n} วันอยู่ในรูปแบบที่เวอร์ชันนี้อ่านไม่ได้ โปรดอัปเดตแอปแล้วนำเข้าข้อมูลสำรองอีกครั้ง}}", + "@welcomeArchiveSkipped": { + "description": "Backup import: N days of archived raw sensor history were in a storage format this version cannot read (in the backup or on the phone) and were not merged.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeArchiveRestored": "{n, plural, other{กู้คืนหรือเพิ่มประวัติเซ็นเซอร์ดิบแล้ว {n} วัน}}", + "@welcomeArchiveRestored": { + "description": "Backup import: N days of archived raw sensor history were restored. Short; shown as a headline or a secondary line.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeLateRows": "{n, plural, other{ข้อมูล {n} แถวมาหลังจากคำนวณคะแนนและปิดวันนั้นไปแล้ว}}", + "@welcomeLateRows": { + "description": "N late rows.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "welcomeExportAgainInDateOrder": "ส่งออกใหม่โดยเรียงตามวันที่", + "@welcomeExportAgainInDateOrder": { + "description": "Fix button: partial data loss." + }, + "scanBarcodeTitle": "สแกนบาร์โค้ด", + "@scanBarcodeTitle": { + "description": "Title at the top of the barcode-scanner sheet" + }, + "scanBarcodeClose": "ปิด", + "@scanBarcodeClose": { + "description": "Semantic label for the close (X) button on the barcode-scanner sheet" + }, + "scanBarcodeInstructions": "วางบาร์โค้ดให้อยู่ในกรอบ ไม่มีการบันทึกภาพ อ่านเฉพาะตัวเลขเท่านั้น", + "@scanBarcodeInstructions": { + "description": "Instructional caption under the camera preview in the barcode scanner" + }, + "scanBarcodeNoAccessTitle": "ไม่มีสิทธิ์ใช้กล้อง", + "@scanBarcodeNoAccessTitle": { + "description": "Title shown when camera permission was denied for barcode scanning" + }, + "scanBarcodeCameraFailedTitle": "เปิดกล้องไม่สำเร็จ", + "@scanBarcodeCameraFailedTitle": { + "description": "Title shown when the camera failed to start for barcode scanning" + }, + "scanBarcodeNoAccessBody": "การสแกนต้องใช้กล้อง แต่แอปยังไม่ได้รับสิทธิ์", + "@scanBarcodeNoAccessBody": { + "description": "Body text explaining camera permission was refused, in the barcode scanner" + }, + "scanBarcodeCameraFailedBody": "อุปกรณ์นี้ไม่ยอมเปิดกล้องให้เครื่องสแกน", + "@scanBarcodeCameraFailedBody": { + "description": "Body text explaining the device could not open its camera for the barcode scanner" + }, + "scanBarcodeTypeInstead": "พิมพ์ตัวเลขแทน", + "@scanBarcodeTypeInstead": { + "description": "Fallback action label offering manual entry instead of camera scanning" + }, + "findingsLogTitle": "ข้อสังเกต", + "@findingsLogTitle": { + "description": "Page title of the Observations (findings log) screen" + }, + "findingsLogEmptyTitle": "ยังไม่พบสิ่งที่โดดเด่น", + "@findingsLogEmptyTitle": { + "description": "Title of the empty-state card on the Observations screen when no findings exist" + }, + "findingsLogEmptyBody": "ไม่มีสิ่งที่ต้องรายงาน การตรวจสัญญาณการเจ็บป่วย คืนที่ผิดไปจากปกติ อุณหภูมิผิว และการเปลี่ยนแปลงอัตราการเต้นหัวใจขณะพักยังไม่พบสิ่งที่ต้องแจ้ง", + "@findingsLogEmptyBody": { + "description": "Body text of the empty-state card on the Observations screen listing the four quiet watches" + }, + "findingsLogDerivedNote": "คำนวณจากข้อมูลรายวันของคุณทุกครั้งที่เปิดหน้านี้ ไม่ได้บันทึกผลไว้ตอนเกิดเหตุ หากวิเคราะห์วันใดใหม่ ข้อความที่นี่จะเปลี่ยนตาม", + "@findingsLogDerivedNote": { + "description": "Footnote on the Observations screen explaining findings are recomputed each time the screen opens" + }, + "startCardDefaultSub": "เลือกแล้วเริ่มได้เลย", + "@startCardDefaultSub": { + "description": "Default subline shown under the count on the Workout/Wellness start card, e.g. 'Pick one and go'" + }, + "monthGridCoverage": "{have} จาก {total} วัน", + "@monthGridCoverage": { + "description": "Month grid: coverage count above a metric strip, e.g. '23 of 30 days'.", + "placeholders": { + "have": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "monthGridDaysAgo": "{days} วันที่แล้ว", + "@monthGridDaysAgo": { + "description": "Month grid: left-edge axis label, e.g. '30 days ago'.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "monthGridToday": "วันนี้", + "@monthGridToday": { + "description": "Month grid: right-edge axis label for the most recent day." + }, + "whatChangedTitle": "สิ่งที่เปลี่ยนไป", + "@whatChangedTitle": { + "description": "What Changed screen: nav bar title." + }, + "whatChangedSub": "เทียบกับประวัติของคุณเอง", + "@whatChangedSub": { + "description": "What Changed screen: nav bar subtitle, all caps." + }, + "whatChangedNoDataTitle": "ยังไม่มีข้อมูลของวันนี้", + "@whatChangedNoDataTitle": { + "description": "What Changed screen: status card title when the selected day has no data at all." + }, + "whatChangedNoDataBody": "วันนี้ไม่มีค่าให้เทียบกับวันก่อน ๆ จึงยังระบุสิ่งที่โดดเด่นไม่ได้", + "@whatChangedNoDataBody": { + "description": "What Changed screen: status card body explaining why a dataless day has no findings." + }, + "whatChangedLearningTitle": "กำลังเรียนรู้ช่วงปกติของคุณ", + "@whatChangedLearningTitle": { + "description": "What Changed screen: status card title shown while there isn't yet enough history for the sweep to judge anything." + }, + "whatChangedLearningBody": "ต้องมีช่วงปกติก่อนจึงจะตรวจพบความผิดปกติ ขณะนี้มีประวัติ {days, plural, other{{days} วัน}} เริ่มตรวจเมื่อครบ {min}", + "@whatChangedLearningBody": { + "description": "What Changed screen: status card body stating how many days of history exist and the minimum needed for the sweep to start.", + "placeholders": { + "days": { + "type": "int" + }, + "min": { + "type": "int" + } + } + }, + "whatChangedNothingTitle": "ไม่พบสิ่งที่โดดเด่น", + "@whatChangedNothingTitle": { + "description": "What Changed screen: status card title when the sweep ran but found nothing unusual." + }, + "whatChangedNothingBody": "ทุกค่าที่มีประวัติเพียงพออยู่ในช่วงที่ข้อมูลเดิมของคุณกำหนดไว้ นี่คือผลปกติที่สมบูรณ์แล้ว", + "@whatChangedNothingBody": { + "description": "What Changed screen: status card body explaining that every metric sat within its normal range." + }, + "whatChangedMethodologyNote": "เทียบกับข้อมูลล่าสุดของคุณ ในหน่วยของคุณและช่วงเวลาที่ระบุ ข้อมูลนี้ไม่ได้ระบุสาเหตุหรือวินิจฉัยโรค", + "@whatChangedMethodologyNote": { + "description": "What Changed screen: footnote under the findings list explaining the methodology and its limits." + }, + "whatChangedDayLinkTitle": "วันนั้นเกิดอะไรขึ้น", + "@whatChangedDayLinkTitle": { + "description": "What Changed screen: link row title to the day's timeline." + }, + "whatChangedDayLinkSub": "การนอน การออกกำลังกาย มื้ออาหาร และบันทึกตามลำดับเวลา", + "@whatChangedDayLinkSub": { + "description": "What Changed screen: link row subtitle describing what the timeline shows." + }, + "whatChangedMonthSection": "ภาพรวมของเดือนนั้น", + "@whatChangedMonthSection": { + "description": "What Changed screen: section heading above the embedded month grid." + }, + "journalFieldErrorNoName": "ตั้งชื่อ", + "@journalFieldErrorNoName": { + "description": "Custom journal field sheet: validation error when the name field is left empty." + }, + "journalFieldErrorInvalidName": "ใช้ตัวอักษรหรือตัวเลขอย่างน้อยหนึ่งตัว", + "@journalFieldErrorInvalidName": { + "description": "Custom journal field sheet: validation error when the name has no letters or digits to build a key from." + }, + "journalFieldErrorNoUnit": "ระบุหน่วยที่นับ เช่น mg, ml, ถ้วย…", + "@journalFieldErrorNoUnit": { + "description": "Custom journal field sheet: validation error when an amount-kind field has no unit entered." + }, + "journalFieldErrorDuplicate": "คุณติดตามรายการชื่อนี้อยู่แล้ว", + "@journalFieldErrorDuplicate": { + "description": "Custom journal field sheet: validation error when the entered name collides with an existing field." + }, + "journalFieldTitle": "ติดตามอย่างอื่น", + "@journalFieldTitle": { + "description": "Custom journal field sheet: sheet title." + }, + "journalFieldNameLabel": "คุณต้องการติดตามอะไร?", + "@journalFieldNameLabel": { + "description": "Custom journal field sheet: text field label asking what to track." + }, + "journalFieldNameHint": "แมกนีเซียม เวลาใช้หน้าจอ ปวดศีรษะ…", + "@journalFieldNameHint": { + "description": "Custom journal field sheet: text field placeholder with example things to track." + }, + "journalFieldKindQuestion": "ข้อมูลนี้เป็นตัวเลขแบบใด?", + "@journalFieldKindQuestion": { + "description": "Custom journal field sheet: label above the kind-selector chips." + }, + "journalFieldKindRating": "คะแนน 1–5", + "@journalFieldKindRating": { + "description": "Custom journal field sheet: chip label for a 1-5 rating kind field." + }, + "journalFieldKindAmount": "ปริมาณ", + "@journalFieldKindAmount": { + "description": "Custom journal field sheet: chip label for an amount/dose kind field." + }, + "journalFieldKindMinutes": "นาที", + "@journalFieldKindMinutes": { + "description": "Custom journal field sheet: chip label for a duration-in-minutes kind field." + }, + "journalFieldUnitLabel": "หน่วย", + "@journalFieldUnitLabel": { + "description": "Custom journal field sheet: text field label for the unit of an amount field." + }, + "journalFieldUnitHint": "mg, ml, ถ้วย…", + "@journalFieldUnitHint": { + "description": "Custom journal field sheet: text field placeholder with example units." + }, + "journalFieldStepSize": "ปรับครั้งละ", + "@journalFieldStepSize": { + "description": "Custom journal field sheet: label above the step-size chips." + }, + "journalFieldMaxPerDay": "ปริมาณสูงสุดที่อาจบันทึกในหนึ่งวัน", + "@journalFieldMaxPerDay": { + "description": "Custom journal field sheet: label above the daily-ceiling chips." + }, + "journalFieldAskLastTime": "ถามเวลาครั้งล่าสุด", + "@journalFieldAskLastTime": { + "description": "Custom journal field sheet: toggle pill asking whether to also record time of last occurrence." + }, + "journalFieldStartTracking": "เริ่มติดตาม", + "@journalFieldStartTracking": { + "description": "Custom journal field sheet: primary save button label." + }, + "aiBriefingForDay": "สำหรับ {day}", + "@aiBriefingForDay": { + "description": "AI briefing screen subtitle naming the day the briefing covers.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "aiBriefingNoModelTitle": "ยังไม่ได้ตั้งค่าโมเดล", + "@aiBriefingNoModelTitle": { + "description": "Status card title when no coach model is configured." + }, + "aiBriefingNoModelBody": "สรุปเขียนโดยโมเดลที่คุณเลือก จนกว่าจะเลือกโมเดล จะยังสร้างสรุปไม่ได้และไม่มีการส่งข้อมูลไปที่ใด", + "@aiBriefingNoModelBody": { + "description": "Status card body when no coach model is configured." + }, + "aiBriefingChooseModel": "เลือกโมเดล", + "@aiBriefingChooseModel": { + "description": "Fix button label to go to model setup." + }, + "aiBriefingNothingTitle": "ยังไม่มีสรุปสำหรับวันนี้", + "@aiBriefingNothingTitle": { + "description": "Status card title when no briefing exists for today." + }, + "aiBriefingNothingBody": "สร้างสรุปตามกำหนดเวลา หรือสั่งสร้างได้ที่นี่", + "@aiBriefingNothingBody": { + "description": "Status card body when no briefing exists for today." + }, + "aiBriefingWriting": "กำลังเขียน…", + "@aiBriefingWriting": { + "description": "Busy-state button/fix label while a briefing is being generated." + }, + "aiBriefingWriteNow": "เขียนตอนนี้", + "@aiBriefingWriteNow": { + "description": "Fix button label to generate a briefing on demand." + }, + "aiBriefingWriteAgain": "เขียนใหม่", + "@aiBriefingWriteAgain": { + "description": "Button label to regenerate an existing briefing." + }, + "aiBriefingFailedTitle": "ส่งคำขอไม่สำเร็จ", + "@aiBriefingFailedTitle": { + "description": "Status card title when briefing generation failed." + }, + "aiBriefingFailedGeneric": "ไม่สำเร็จ: {error}", + "@aiBriefingFailedGeneric": { + "description": "Fallback error message shown when briefing generation throws a non-coach exception.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "aiBriefingSentSection": "ข้อมูลที่ส่ง", + "@aiBriefingSentSection": { + "description": "Section header: payload was sent off-device." + }, + "aiBriefingReadSection": "ข้อมูลที่อ่าน", + "@aiBriefingReadSection": { + "description": "Section header: payload was only read on-device (local endpoint)." + }, + "aiBriefingNoneBody": "ไม่มี ไม่มีการส่งคำขอ ข้อความด้านบนเขียนบนโทรศัพท์เครื่องนี้", + "@aiBriefingNoneBody": { + "description": "Banner text when no model request was made at all (nightly sweep found nothing)." + }, + "aiBriefingLocalBody": "ส่งค่าต่อไปนี้ไปยัง {host} บนเครื่องนี้ ไม่มีข้อมูลออกจากเครื่อง", + "@aiBriefingLocalBody": { + "description": "Banner text when the model endpoint is on the same machine (nothing left the device).", + "placeholders": { + "host": { + "type": "String" + } + } + }, + "aiBriefingCloudBody": "ส่งเฉพาะค่าต่อไปนี้ไปยัง {host} โดยใช้ {model} ไม่มีข้อมูลดิบ ชื่อ หรือข้อมูลระบุตัวตน", + "@aiBriefingCloudBody": { + "description": "Banner text describing exactly what was sent to a remote model host.", + "placeholders": { + "host": { + "type": "String" + }, + "model": { + "type": "String" + } + } + }, + "aiBriefingNoneCardTitle": "ไม่พบสิ่งที่โดดเด่น จึงไม่ส่งคำถาม", + "@aiBriefingNoneCardTitle": { + "description": "Status card title when the nightly sweep found nothing worth asking a model about." + }, + "aiBriefingNoneCardBody": "การตรวจทบทวนทำบนโทรศัพท์เครื่องนี้ จะเรียกโมเดลต่อเมื่อพบประเด็นให้พิจารณา ซึ่งวันนี้ไม่พบ", + "@aiBriefingNoneCardBody": { + "description": "Status card body explaining the sweep only calls a model when it has a finding." + }, + "aiBriefingEmptyCardTitle": "ไม่มีข้อมูลให้ส่ง", + "@aiBriefingEmptyCardTitle": { + "description": "Status card title when the payload had no metric values to send." + }, + "aiBriefingEmptyCardBody": "ตอนเขียนข้อความนี้ยังไม่มีค่าที่วัดได้ คำขอจึงไม่ได้แนบค่าใด", + "@aiBriefingEmptyCardBody": { + "description": "Status card body when the payload had no metric values to send." + }, + "napsFellAsleepHelp": "เวลาที่หลับ", + "@napsFellAsleepHelp": { + "description": "Time picker helper text for logging when a manual nap started." + }, + "napsWokeUpHelp": "เวลาที่ตื่น", + "@napsWokeUpHelp": { + "description": "Time picker helper text for logging when a manual nap ended." + }, + "napsInvalidWindow": "การงีบต้องยาว 5 นาทีถึง 6 ชั่วโมง หากนานกว่านั้นถือเป็นการนอนหลักและควรอยู่ในคืนนั้นเพื่ออ่านระยะการนอน", + "@napsInvalidWindow": { + "description": "Validation error when a manually logged nap window is outside 5 minutes to 6 hours." + }, + "napsOverlap": "เวลาทับซ้อนกับการงีบที่มีอยู่ในวันนี้ โปรดลบรายการเดิมก่อนเพื่อไม่นับชั่วโมงซ้ำ", + "@napsOverlap": { + "description": "Validation error when a manually logged nap overlaps an existing one." + }, + "napsOverlapsSleep": "เวลาทับซ้อนกับการนอนหลักซึ่งนับเวลานั้นแล้ว โปรดบันทึกเฉพาะช่วงหลังลุกจากเตียง หรือแก้ไขการนอนคืนนั้นแทน", + "@napsOverlapsSleep": { + "description": "Validation error when a manually logged nap overlaps the main sleep window." + }, + "napsNotReanalysed": "ยังไม่ได้วิเคราะห์วันนั้นใหม่ เพราะมีการวิเคราะห์อื่นทำงานอยู่ บันทึกการแก้ไขแล้วและจะใช้ในครั้งถัดไป", + "@napsNotReanalysed": { + "description": "Fallback error when a nap edit saved but the day could not be re-derived because another analysis was already running." + }, + "napsTitle": "การงีบ", + "@napsTitle": { + "description": "Naps screen nav bar title." + }, + "napsNoReadingTitle": "ไม่มีข้อมูลการงีบของวันนี้", + "@napsNoReadingTitle": { + "description": "Status card title when a day has no nap detection result." + }, + "napsNoReadingBody": "การงีบคำนวณจากข้อมูลที่บันทึกความถี่ 1 Hz เช่นเดียวกับข้อมูลอื่นของวัน แต่วันนี้มีข้อมูลไม่เพียงพอ", + "@napsNoReadingBody": { + "description": "Fallback status card body explaining naps require enough 1Hz recording." + }, + "napsEmptyTitle": "วันนี้ไม่มีการงีบ", + "@napsEmptyTitle": { + "description": "Status card title when a judged day detected zero naps." + }, + "napsEmptyBody": "วันนี้ไม่พบช่วงที่อยู่นิ่งนานพอพร้อมอัตราการเต้นหัวใจลดลงตามลักษณะการหลับ", + "@napsEmptyBody": { + "description": "Status card body explaining why no naps were detected that day." + }, + "napsCountsToward": "การงีบ {mins} นับเป็นส่วนหนึ่งของเวลานอนที่ต้องการคืนนี้", + "@napsCountsToward": { + "description": "Footnote stating how many minutes of nap reduce tonight's sleep need.", + "placeholders": { + "mins": { + "type": "String" + } + } + }, + "napsNotAppliedTitle": "ยังไม่ได้ใช้การเปลี่ยนแปลงนั้น", + "@napsNotAppliedTitle": { + "description": "Status card title when a nap edit failed to apply." + }, + "napsWorking": "กำลังดำเนินการ…", + "@napsWorking": { + "description": "Busy-state label on the log-a-nap button while an edit is being written." + }, + "napsLogANap": "บันทึกการงีบ", + "@napsLogANap": { + "description": "Button label to open the manual nap logging flow." + }, + "napsRemovedSection": "ลบแล้ว", + "@napsRemovedSection": { + "description": "Section header listing naps the user has removed/rejected." + }, + "napsPutBackSemantic": "คืนค่าการงีบนี้", + "@napsPutBackSemantic": { + "description": "Accessibility semantic label for the button that restores a removed nap." + }, + "napsPutBackLabel": "คืนค่า", + "@napsPutBackLabel": { + "description": "Visible button label to restore a removed nap." + }, + "napsRemovalKept": "บันทึกการลบเป็นช่วงเวลาแทนรหัสรายการ จึงยังมีผลแม้ขอบเขตที่ตรวจพบจะเปลี่ยนไป", + "@napsRemovalKept": { + "description": "Footnote explaining removed naps are stored as a time window, not an id." + }, + "napsYouLoggedThis": "คุณบันทึกเอง", + "@napsYouLoggedThis": { + "description": "Caption for a manually logged nap with no duration recorded." + }, + "napsDetected": "ตรวจพบ", + "@napsDetected": { + "description": "Caption for a detector-found nap with no duration recorded." + }, + "napsLoggedWithMins": "{mins} · คุณบันทึกเอง", + "@napsLoggedWithMins": { + "description": "Caption for a manually logged nap including its duration.", + "placeholders": { + "mins": { + "type": "String" + } + } + }, + "napsDetectedWithMins": "หลับ {mins} · ตรวจพบ", + "@napsDetectedWithMins": { + "description": "Caption for a detector-found nap including its duration.", + "placeholders": { + "mins": { + "type": "String" + } + } + }, + "napsDeleteSemantic": "ลบการงีบนี้", + "@napsDeleteSemantic": { + "description": "Accessibility semantic label for deleting a manually logged nap." + }, + "napsNotANapSemantic": "ช่วงนี้ไม่ใช่การงีบ", + "@napsNotANapSemantic": { + "description": "Accessibility semantic label for rejecting a detector-found nap." + }, + "napsDeleteLabel": "ลบ", + "@napsDeleteLabel": { + "description": "Visible button label to delete a manually logged nap." + }, + "napsNotANapLabel": "ไม่ใช่การงีบ", + "@napsNotANapLabel": { + "description": "Visible button label to reject a detector-found nap." + }, + "readinessDetailTitle": "การฟื้นตัว", + "@readinessDetailTitle": { + "description": "Readiness detail screen title, also used as the history chart title." + }, + "readinessDetailNotScoredTitle": "ยังไม่มีคะแนนการฟื้นตัว", + "@readinessDetailNotScoredTitle": { + "description": "Status card title when readiness has no score for today." + }, + "readinessDetailLastNightScored": "คืนล่าสุดที่คำนวณคะแนนคือ {day}", + "@readinessDetailLastNightScored": { + "description": "Appended fact naming the last night that did produce a readiness score.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "readinessDetailWhatWasMissing": "ข้อมูลที่ขาด", + "@readinessDetailWhatWasMissing": { + "description": "Section header for the readiness absence diagnostic breakdown." + }, + "readinessDetailWhatWentIntoIt": "ข้อมูลที่ใช้", + "@readinessDetailWhatWentIntoIt": { + "description": "Section header for the readiness input breakdown (scored or empty-state)." + }, + "readinessDetailInputsFooter": "ใช้ข้อมูล {used}/{total} รายการ แต่ละรายการจัดอันดับเทียบประวัติของคุณ เป็นอีกมุมมองของข้อมูลเดียวกัน ไม่ใช่ส่วนย่อยของคะแนนด้านบน", + "@readinessDetailInputsFooter": { + "description": "Footnote below the breakdown stating how many inputs were used out of the total.", + "placeholders": { + "used": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "readinessDetailBreakdownNoScoreNote": "อีกมุมมองที่ใช้เกณฑ์ผ่อนปรนกว่าของข้อมูลสี่รายการเดิม ไม่ใช่ส่วนที่รวมเป็นคะแนนวันนี้ ซึ่งยังไม่มีด้วยเหตุผลข้างต้น", + "@readinessDetailBreakdownNoScoreNote": { + "description": "Shown above the breakdown rows only when readiness itself is absent, clarifying that this glass-box percentile view is a different calculation than the headline composite and does not explain or contradict its absence." + }, + "readinessDetailNoBreakdownTitle": "ยังไม่มีรายละเอียด", + "@readinessDetailNoBreakdownTitle": { + "description": "Status card title when readiness scored but no breakdown exists yet." + }, + "readinessDetailNoBreakdownBody": "ต้องมีประวัติประมาณสองสัปดาห์จึงจะจัดอันดับข้อมูลแต่ละรายการเทียบกับคืนก่อน ๆ ของคุณได้", + "@readinessDetailNoBreakdownBody": { + "description": "Status card body explaining the breakdown needs about two weeks of history." + }, + "readinessDetailHistoryTitle": "ประวัติ", + "@readinessDetailHistoryTitle": { + "description": "History section header when there are zero scored days." + }, + "readinessDetailLastNDays": "{n, plural, other{{n} วันล่าสุด}}", + "@readinessDetailLastNDays": { + "description": "History section header naming how many days of history are shown.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "readinessDetailNoHistoryTitle": "ไม่มีประวัติการฟื้นตัว", + "@readinessDetailNoHistoryTitle": { + "description": "Status card title when there is no readiness history at all." + }, + "readinessDetailNoHistoryBody": "คำนวณคะแนนแล้ว 0 วัน", + "@readinessDetailNoHistoryBody": { + "description": "Status card body stating 0 days scored." + }, + "readinessDetailWearOvernight": "สวมสายรัดขณะนอน", + "@readinessDetailWearOvernight": { + "description": "Fix button label suggesting the user wear the band overnight." + }, + "readinessDetailUnit": "/100", + "@readinessDetailUnit": { + "description": "Unit suffix shown on the readiness history chart (score out of 100)." + }, + "readinessDetailDaysAgo": "{n, plural, other{{n} วันที่แล้ว}}", + "@readinessDetailDaysAgo": { + "description": "X-axis label on the readiness history chart naming how many days ago the first plotted point is.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "readinessDetailToday": "วันนี้", + "@readinessDetailToday": { + "description": "X-axis label on the readiness history chart for the most recent point." + }, + "readinessDetailMeasured": "วัดแล้ว", + "@readinessDetailMeasured": { + "description": "Row value in the absence diagnostic: this input was measured." + }, + "readinessDetailNotMeasured": "ยังไม่ได้วัด", + "@readinessDetailNotMeasured": { + "description": "Row value in the absence diagnostic: this input was not measured." + }, + "readinessDetailNightsOfHistory": "{n, plural, other{ประวัติของคุณเอง {n} คืน}}", + "@readinessDetailNightsOfHistory": { + "description": "Row value in the absence diagnostic stating how many of the user's own nights back the baseline.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "readinessDetailNightsOfTarget": "{have} จาก {need} คืน", + "@readinessDetailNightsOfTarget": { + "description": "Row value in the absence diagnostic: how many of the user's own nights back this input against the floor every input needs before it can be used.", + "placeholders": { + "have": { + "type": "int" + }, + "need": { + "type": "int" + } + } + }, + "readinessDetailNeedSuffix": "{need} แต่ละรายการจัดอันดับเทียบกับคืนก่อน ๆ ของคุณ จึงยังเริ่มให้คะแนนไม่ได้จนกว่าจะมีข้อมูลเพียงพอ", + "@readinessDetailNeedSuffix": { + "description": "Sentence appended after the pipeline's own 'need N more nights' message.", + "placeholders": { + "need": { + "type": "String" + } + } + }, + "readinessDetailNoNoteFallback": "มีข้อมูลด้านบนครบแล้ว แต่ยังเปรียบเทียบกับประวัติของคุณไม่ได้", + "@readinessDetailNoNoteFallback": { + "description": "Fallback sentence when readiness is absent but the pipeline left no specific note." + }, + "readinessDetailNotAvailable": "ไม่มีข้อมูล", + "@readinessDetailNotAvailable": { + "description": "Breakdown row tag: this input was not available/used." + }, + "readinessDetailContributionNotReported": "ไม่ได้รายงานผลต่อคะแนน", + "@readinessDetailContributionNotReported": { + "description": "Breakdown row tag: input was used but its numeric contribution was not reported." + }, + "readinessDetailRelativeUncalibrated": "ค่าเชิงสัมพัทธ์ ยังไม่ปรับเทียบ", + "@readinessDetailRelativeUncalibrated": { + "description": "Breakdown row tag on the temperature input: it is a relative, uncalibrated sensor deviation." + }, + "readinessDetailWithinSpread": "ใช่ อยู่ในช่วงปกติของคุณ", + "@readinessDetailWithinSpread": { + "description": "Breakdown row tag: the input's change was within the user's usual spread (below the smallest-worthwhile-change threshold)." + }, + "readinessDetailOutsideRange": "ไม่ อยู่นอกช่วงปกติของคุณ", + "@readinessDetailOutsideRange": { + "description": "Recovery breakdown row answer: the input moved past the smallest change that counts." + }, + "readinessDetailLiftingScore": "ช่วยเพิ่มคะแนน", + "@readinessDetailLiftingScore": { + "description": "Recovery breakdown row: this input raised the score." + }, + "readinessDetailLoweringScore": "ทำให้คะแนนลดลง", + "@readinessDetailLoweringScore": { + "description": "Recovery breakdown row: this input lowered the score." + }, + "readinessDetailWeightPercent": "น้ำหนัก {pct}%", + "@readinessDetailWeightPercent": { + "description": "Breakdown row tag showing the percentage weight this input actually carried.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "readinessDetailAskHrv": "HRV อยู่ในช่วงปกติของคุณหรือไม่?", + "@readinessDetailAskHrv": { + "description": "Recovery breakdown row, phrased as a plain question: the HRV input." + }, + "readinessDetailAskRhr": "อัตราการเต้นหัวใจขณะพักอยู่ในช่วงปกติของคุณหรือไม่?", + "@readinessDetailAskRhr": { + "description": "Recovery breakdown row, phrased as a plain question: the resting heart rate input." + }, + "readinessDetailAskResp": "อัตราการหายใจอยู่ในช่วงปกติของคุณหรือไม่?", + "@readinessDetailAskResp": { + "description": "Recovery breakdown row, phrased as a plain question: the breathing rate input." + }, + "readinessDetailAskTemp": "อุณหภูมิผิวอยู่ในช่วงปกติของคุณหรือไม่?", + "@readinessDetailAskTemp": { + "description": "Recovery breakdown row, phrased as a plain question: the skin temperature input." + }, + "dayStepsTitle": "ก้าว", + "@dayStepsTitle": { + "description": "Screen title on the Day Steps detail screen." + }, + "dayStepsThroughDay": "ตลอดวัน", + "@dayStepsThroughDay": { + "description": "Section header above the list of step spans through the day." + }, + "dayStepsToday": "วันนี้", + "@dayStepsToday": { + "description": "Fragment meaning 'today', substituted into other Day Steps sentences as {when}." + }, + "dayStepsOnDay": "วันที่ {day}", + "@dayStepsOnDay": { + "description": "Fragment naming a specific past day, substituted into other Day Steps sentences as {when}.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "dayStepsNoTimesTitle": "ไม่มีเวลาประกอบจำนวนก้าว{when}", + "@dayStepsNoTimesTitle": { + "description": "Empty-state title: the day has a step total but no timed spans behind it.", + "placeholders": { + "when": { + "type": "String" + } + } + }, + "dayStepsNoStepsTitle": "ไม่ได้บันทึกจำนวนก้าว{when}", + "@dayStepsNoStepsTitle": { + "description": "Empty-state title: nothing counted steps this day.", + "placeholders": { + "when": { + "type": "String" + } + } + }, + "dayStepsStrapCounterBody": "ก้าว {count} ก้าว{when} มาจากตัวนับของสายรัด ซึ่งไม่ได้เก็บเวลาสำหรับวันนี้ จึงวางบนเส้นเวลาไม่ได้", + "@dayStepsStrapCounterBody": { + "description": "Empty-state body explaining the strap's own running counter has no times.", + "placeholders": { + "count": { + "type": "String" + }, + "when": { + "type": "String" + } + } + }, + "dayStepsNothingCounted": "ไม่มีอุปกรณ์นับก้าวบันทึกข้อมูล{when}", + "@dayStepsNothingCounted": { + "description": "Empty-state body when no sensor recorded steps this day.", + "placeholders": { + "when": { + "type": "String" + } + } + }, + "dayStepsChartTitle": "เวลาที่นับก้าว", + "@dayStepsChartTitle": { + "description": "Title of the hourly steps chart, shown in caps." + }, + "dayStepsUnit": "ก้าว", + "@dayStepsUnit": { + "description": "Unit label for the steps chart." + }, + "dayStepsYourPhone": "โทรศัพท์ของคุณ", + "@dayStepsYourPhone": { + "description": "Label for the phone as a step source, used in legend, metrics and row labels." + }, + "dayStepsYourBand": "สายรัดของคุณ", + "@dayStepsYourBand": { + "description": "Fallback label for the wearable band when no paired-device name is known." + }, + "dayStepsCounted": "นับแล้ว", + "@dayStepsCounted": { + "description": "Label for the combined total in the inline metrics row." + }, + "dayStepsHonestyMixed": "นับจากข้อมือและโทรศัพท์ ข้อมืออาจนับการเดินได้น้อยกว่าจริงและนับงานที่ขยับมือเป็นการเดิน ส่วนโทรศัพท์นับได้เฉพาะตอนพกติดตัว", + "@dayStepsHonestyMixed": { + "description": "Footnote explaining wrist vs phone step-counting error when both sources contributed." + }, + "dayStepsHonestyStrap": "นับจากข้อมือ ซึ่งมักนับการเดินจริงได้น้อยกว่า และอาจนับการขยับมือเป็นจังหวะเป็นการเดิน", + "@dayStepsHonestyStrap": { + "description": "Footnote explaining wrist step-counting error when only the strap contributed." + }, + "dayStepsHonestyPhone": "นับจากโทรศัพท์ จึงมีเฉพาะก้าวขณะที่คุณพกโทรศัพท์", + "@dayStepsHonestyPhone": { + "description": "Footnote explaining phone step-counting coverage when only the phone contributed." + }, + "roughNightSignRhr": "อัตราการเต้นหัวใจขณะพักสูงขึ้น", + "@roughNightSignRhr": { + "description": "Rough Night: one of the moved-measurement clauses, resting heart rate ran higher." + }, + "roughNightSignHrv": "HRV ต่ำลง", + "@roughNightSignHrv": { + "description": "Rough Night: one of the moved-measurement clauses, HRV ran lower." + }, + "roughNightSignDip": "อัตราการเต้นหัวใจลดลงระหว่างคืนน้อยกว่าปกติ", + "@roughNightSignDip": { + "description": "Rough Night: one of the moved-measurement clauses, overnight heart rate dip was blunted." + }, + "roughNightSignTemp": "ผิวของคุณอุ่นขึ้น", + "@roughNightSignTemp": { + "description": "Rough Night: one of the moved-measurement clauses, skin temperature ran warmer." + }, + "roughNightLateTraining": "คุณฝึกจนถึง {at} ซึ่งมักทำให้เกิดลักษณะนี้ได้เอง", + "@roughNightLateTraining": { + "description": "Rough Night card: stated fact about a late training session that night.", + "placeholders": { + "at": { + "type": "String" + } + } + }, + "roughNightIllness": "อัตราการเต้นหัวใจขณะพักก็ส่งสัญญาณในคืนนี้ด้วย ข้อมูลหลายคืนล่าสุดแสดงว่าค่าสูงกว่าปกติของคุณ นี่ไม่ใช่การวินิจฉัย", + "@roughNightIllness": { + "description": "Rough Night card: stated fact when the resting-heart-rate watch also flagged the same night (an accumulated rise, never an illness claim)." + }, + "roughNightLuteal": "คุณอยู่ในระยะลูทีล ซึ่งทำให้อัตราการเต้นหัวใจขณะพักและอุณหภูมิผิวสูงขึ้นได้เอง", + "@roughNightLuteal": { + "description": "Rough Night card: stated fact when the user is in the luteal phase." + }, + "roughNightWarmRoom": "ผิวอุ่นกว่าปกติของคุณ ห้องที่อุ่นก็ทำให้เป็นเช่นนี้ได้", + "@roughNightWarmRoom": { + "description": "Rough Night card: stated fact when the skin-temperature sign fired." + }, + "roughNightDismiss": "ปิดข้อความ", + "@roughNightDismiss": { + "description": "Semantic label for the dismiss (X) button on the Rough Night card." + }, + "roughNightDefaultHeadline": "คืนที่พักได้ไม่ดีเท่าปกติ", + "@roughNightDefaultHeadline": { + "description": "Fallback headline for the Rough Night card when the analytics descriptor has no leading clause." + }, + "roughNightSummary": "{sentence} เมื่อเทียบกับคืนก่อน ๆ ของคุณ นี่คือการวัดการนอนคืนนั้น ไม่ใช่การตัดสินตัวคุณ", + "@roughNightSummary": { + "description": "Rough Night card body sentence, combining the moved-measurements clause with the closing disclaimer.", + "placeholders": { + "sentence": { + "type": "String" + } + } + }, + "roughNightTellWhatHappened": "บันทึกสิ่งที่เกิดขึ้น", + "@roughNightTellWhatHappened": { + "description": "Button inviting the user to open the optional attribution question on the Rough Night card." + }, + "roughNightNothingToAnswer": "ไม่ต้องตอบอะไร การ์ดนี้รายงานข้อมูลของคืนนั้นเท่านั้น", + "@roughNightNothingToAnswer": { + "description": "Rough Night card note shown after the user has permanently declined the attribution question." + }, + "roughNightWhatElse": "มีอะไรเกิดขึ้นอีกบ้าง?", + "@roughNightWhatElse": { + "description": "Rough Night attribution question heading when nothing else is already known about the night." + }, + "roughNightAnythingElse": "มีอย่างอื่นอีกไหม?", + "@roughNightAnythingElse": { + "description": "Rough Night attribution question heading when something is already known about the night." + }, + "roughNightSaving": "กำลังบันทึก", + "@roughNightSaving": { + "description": "Button label while the Rough Night attribution answer is being saved." + }, + "roughNightLogIt": "บันทึกไว้สำหรับคืนนั้น", + "@roughNightLogIt": { + "description": "Button label to save the picked attribution tags for that night." + }, + "roughNightAddHowMuch": "เพิ่มปริมาณ", + "@roughNightAddHowMuch": { + "description": "Link to the journal editor for entering amounts, from the Rough Night card." + }, + "roughNightDoNotAskAgain": "ไม่ต้องถามอีก", + "@roughNightDoNotAskAgain": { + "description": "Link to permanently decline the Rough Night attribution question." + }, + "roughNightSeveralMoved": "ค่าหลายอย่างที่วัดระหว่างคืนเปลี่ยนไปพร้อมกัน", + "@roughNightSeveralMoved": { + "description": "Fallback clause when the Rough Night card has no named moved measurements." + }, + "driverBreakdownHigherThanUsual": "สูงกว่าปกติของคุณ", + "@driverBreakdownHigherThanUsual": { + "description": "Driver breakdown: non-numeric input (e.g. skin temp) moved up vs usual." + }, + "driverBreakdownLowerThanUsual": "ต่ำกว่าปกติของคุณ", + "@driverBreakdownLowerThanUsual": { + "description": "Driver breakdown: non-numeric input (e.g. skin temp) moved down vs usual." + }, + "driverBreakdownRightOnUsual": "{now} · ตรงกับค่าปกติของคุณ", + "@driverBreakdownRightOnUsual": { + "description": "Driver value line when the reading equals the user's usual.", + "placeholders": { + "now": { + "type": "String" + } + } + }, + "driverBreakdownAboveUsual": "{now} · สูงกว่าค่าปกติ {usual} อยู่ {delta}", + "@driverBreakdownAboveUsual": { + "description": "Driver value line: reading is above usual, with reading/delta/usual formatted values.", + "placeholders": { + "now": { + "type": "String" + }, + "delta": { + "type": "String" + }, + "usual": { + "type": "String" + } + } + }, + "driverBreakdownBelowUsual": "{now} · ต่ำกว่าค่าปกติ {usual} อยู่ {delta}", + "@driverBreakdownBelowUsual": { + "description": "Driver value line: reading is below usual, with reading/delta/usual formatted values.", + "placeholders": { + "now": { + "type": "String" + }, + "delta": { + "type": "String" + }, + "usual": { + "type": "String" + } + } + }, + "driverBreakdownWeightPct": "น้ำหนัก {pct}%", + "@driverBreakdownWeightPct": { + "description": "Driver qualifier chip: the renormalised weight share as a rounded percent.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "driverBreakdownNotAvailable": "ไม่มีข้อมูล", + "@driverBreakdownNotAvailable": { + "description": "Driver qualifier: the input was not usable." + }, + "driverBreakdownContributionNotReported": "ไม่ได้รายงานผลต่อคะแนน", + "@driverBreakdownContributionNotReported": { + "description": "Driver qualifier: used but no contribution number was reported." + }, + "driverBreakdownRelativeUncalibrated": "ค่าเชิงสัมพัทธ์ ยังไม่ปรับเทียบ", + "@driverBreakdownRelativeUncalibrated": { + "description": "Driver qualifier: raw uncalibrated sensor deviation (e.g. skin temp)." + }, + "driverBreakdownWithinUsualSpread": "อยู่ในช่วงการกระจายปกติของคุณ", + "@driverBreakdownWithinUsualSpread": { + "description": "Driver qualifier: change did not clear the smallest-worthwhile-change gate." + }, + "driverBreakdownBiggerThanNoise": "มากกว่าความคลาดเคลื่อนจากการวัด", + "@driverBreakdownBiggerThanNoise": { + "description": "Driver qualifier: change is outside usual spread and bigger than measurement noise." + }, + "driverBreakdownSmallerThanNoise": "อยู่นอกช่วงการกระจายปกติ แต่ยังน้อยพอที่จะเป็นความคลาดเคลื่อนจากการวัด", + "@driverBreakdownSmallerThanNoise": { + "description": "Driver qualifier: change is outside usual spread but still within measurement noise." + }, + "driverBreakdownWhatHelped": "สิ่งที่ช่วย", + "@driverBreakdownWhatHelped": { + "description": "Driver breakdown group header: drivers that raised the score." + }, + "driverBreakdownWhatHeldYouBack": "สิ่งที่ฉุดคะแนน", + "@driverBreakdownWhatHeldYouBack": { + "description": "Driver breakdown group header: drivers that lowered the score." + }, + "driverBreakdownNeither": "ไม่มีผลทั้งสองทาง", + "@driverBreakdownNeither": { + "description": "Driver breakdown group header: drivers unavailable or with zero net effect." + }, + "driverBreakdownFooter": "เปรียบเทียบแต่ละรายการกับประวัติของคุณเพื่อดูควบคู่กับคะแนน ไม่ใช่ส่วนหนึ่งของคะแนน “ความคลาดเคลื่อนจากการวัด” คือความผันผวนของค่าที่เกิดขึ้นได้เอง", + "@driverBreakdownFooter": { + "description": "Driver breakdown screen footer explaining what the list means." + }, + "driverBreakdownHideHistory": "{label} ซ่อนประวัติ", + "@driverBreakdownHideHistory": { + "description": "Accessibility label for tapping an open driver row to collapse its chart.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "driverBreakdownShowHistory": "{label} แสดงประวัติ", + "@driverBreakdownShowHistory": { + "description": "Accessibility label for tapping a closed driver row to expand its chart.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "driverBreakdownDaysAgo": "{n, plural, other{{n} วันที่แล้ว}}", + "@driverBreakdownDaysAgo": { + "description": "X-axis start label on a driver's history chart, N days before today.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "driverBreakdownToday": "วันนี้", + "@driverBreakdownToday": { + "description": "X-axis end label on a driver's history chart." + }, + "driverBreakdownAbsenceTitle": "ไม่มีรายละเอียดให้แสดง", + "@driverBreakdownAbsenceTitle": { + "description": "Title of the card shown when there is no readiness breakdown for the night." + }, + "driverBreakdownAbsenceAlgoVersion": "อัปเดตล่าสุดเปลี่ยนวิธีคำนวณการฟื้นตัว กำลังคำนวณข้อมูลรายวันของคุณใหม่", + "@driverBreakdownAbsenceAlgoVersion": { + "description": "Absence card body when the breakdown is missing because the algorithm version changed and is rebuilding." + }, + "driverBreakdownAbsenceStale": "แนวโน้มของคุณยังไม่เป็นปัจจุบัน ซิงค์สายรัดเพื่ออัปเดต", + "@driverBreakdownAbsenceStale": { + "description": "Absence card body when the last stored rollup is too old to show." + }, + "driverBreakdownAbsenceNoVersion": "กำลังอัปเดตแนวโน้มของคุณ ใช้เวลาประมาณหนึ่งนาทีหลังซิงค์", + "@driverBreakdownAbsenceNoVersion": { + "description": "Absence card body when the stored rollup has no version stamp." + }, + "driverBreakdownSyncTheBand": "ซิงค์สายรัด", + "@driverBreakdownSyncTheBand": { + "description": "Absence card action button: sync the band to refresh the rollup." + }, + "driverBreakdownAbsenceNoReason": "ไม่มีข้อมูลระบุว่าทำไมเมื่อคืนจึงไม่มีรายละเอียด", + "@driverBreakdownAbsenceNoReason": { + "description": "Absence card body when nothing recorded explains the missing breakdown." + }, + "coachFiguresCouldNotBeDrawn": "วาดภาพประกอบไม่ได้", + "@coachFiguresCouldNotBeDrawn": { + "description": "Fallback title when a coach-sent chart figure has an unrecognized type." + }, + "coachFiguresNoType": "โค้ชส่งภาพประกอบโดยไม่ระบุประเภท", + "@coachFiguresNoType": { + "description": "Body text when the coach sent a figure spec with no 'type' field." + }, + "coachFiguresUnsupportedType": "โค้ชขอภาพประกอบประเภท “{type}” ซึ่งแอปนี้วาดไม่ได้", + "@coachFiguresUnsupportedType": { + "description": "Body text when the coach sent a figure of a type this app cannot render.", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "coachFiguresFigure": "ภาพประกอบ", + "@coachFiguresFigure": { + "description": "Fallback chart title when the coach's figure spec has no title." + }, + "coachFiguresSeriesN": "ชุดข้อมูล {n}", + "@coachFiguresSeriesN": { + "description": "Fallback legend name for an unnamed line/area series, numbered.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "coachFiguresLaneN": "แถว {n}", + "@coachFiguresLaneN": { + "description": "Fallback legend name for an unnamed dual-axis lane, numbered.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "coachFiguresNoSleepSegments": "ไม่มีช่วงการนอน", + "@coachFiguresNoSleepSegments": { + "description": "Empty-state message for a hypnogram figure with no sleep segments." + }, + "coachFiguresNoTimeInZone": "ไม่มีเวลาในโซน", + "@coachFiguresNoTimeInZone": { + "description": "Empty-state message for a heart-rate-zone bar figure with no data." + }, + "coachFiguresMinTotal": "รวม {n} นาที", + "@coachFiguresMinTotal": { + "description": "Footnote under a zone bar figure stating total minutes across zones.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "coachFiguresGauge": "มาตรวัด", + "@coachFiguresGauge": { + "description": "Fallback title/label for a gauge figure with no title or label." + }, + "coachFiguresGaugeNoValue": "โค้ชส่งมาตรวัดโดยไม่มีค่า", + "@coachFiguresGaugeNoValue": { + "description": "Error card body when the coach sent a gauge figure with no value." + }, + "coachFiguresSummary": "สรุป", + "@coachFiguresSummary": { + "description": "Fallback title for a KPI-grid figure with no title." + }, + "coachFiguresEmptySummary": "โค้ชส่งสรุปที่ว่างเปล่า", + "@coachFiguresEmptySummary": { + "description": "Error card body when the coach sent a KPI-grid figure with no cards." + }, + "coachFiguresTable": "ตาราง", + "@coachFiguresTable": { + "description": "Fallback title for a table figure with no title." + }, + "coachFiguresTableNoRows": "โค้ชส่งตารางที่ไม่มีแถวข้อมูล", + "@coachFiguresTableNoRows": { + "description": "Error card body when the coach sent a table figure with no rows." + }, + "circadianDetailTitle": "นาฬิกาชีวภาพ", + "@circadianDetailTitle": { + "description": "Nav title of the body-clock (circadian) detail screen" + }, + "circadianDetailNoNightsTitle": "ยังไม่มีข้อมูลรายคืนให้แสดง", + "@circadianDetailNoNightsTitle": { + "description": "Empty-state title when no nights have been scored yet" + }, + "circadianDetailNoNightsBody": "คำนวณคะแนนแล้ว 0 คืน", + "@circadianDetailNoNightsBody": { + "description": "Empty-state body under circadianDetailNoNightsTitle" + }, + "circadianDetailNoNightsFix": "สวมสายรัดขณะนอน", + "@circadianDetailNoNightsFix": { + "description": "Empty-state suggested fix action" + }, + "circadianDetailSleepTitle": "การนอนในแต่ละคืน", + "@circadianDetailSleepTitle": { + "description": "Chart title for the per-night sleep actogram" + }, + "circadianDetailAsleep": "หลับ", + "@circadianDetailAsleep": { + "description": "Legend label for the actogram's asleep series" + }, + "circadianDetailSleepFootnote": "{count, plural, other{{count} คืน คอลัมน์ละหนึ่งคืน สีเข้มขึ้นเมื่อหลับนานขึ้นในชั่วโมงนั้น}}", + "@circadianDetailSleepFootnote": { + "description": "Footnote under the actogram stating how many nights are drawn", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "circadianDetailYourRhythm": "จังหวะของคุณ", + "@circadianDetailYourRhythm": { + "description": "Section title for the chronotype/jetlag/regularity table" + }, + "circadianDetailWhichNights": "คืนที่ใช้", + "@circadianDetailWhichNights": { + "description": "Section action link to reveal the least-alike night pair" + }, + "circadianDetailHide": "ซ่อน", + "@circadianDetailHide": { + "description": "Toggle action label to collapse an expanded section" + }, + "circadianDetailShow": "แสดง", + "@circadianDetailShow": { + "description": "Toggle action label to expand the rhythm-strength section" + }, + "circadianDetailTodayPredicted": "วันนี้ จากการคาดการณ์", + "@circadianDetailTodayPredicted": { + "description": "Section title for the alertness forecast card" + }, + "circadianDetailRhythmStrength": "ความชัดเจนของจังหวะ", + "@circadianDetailRhythmStrength": { + "description": "Section title for the non-parametric rhythm battery" + }, + "circadianDetailWhenStill": "ขณะที่อยู่นิ่ง", + "@circadianDetailWhenStill": { + "description": "Section title for the daytime HRV-while-still card" + }, + "circadianDetailNoStillTitle": "ยังไม่มีช่วงอยู่นิ่งให้อ่านค่า", + "@circadianDetailNoStillTitle": { + "description": "Empty-state title when no still-moment HRV data exists" + }, + "circadianDetailNoStillBody": "ต้องมีข้อมูลวินาทีที่คุณอยู่นิ่ง แต่ใน {days, plural, other{{days} วันที่ผ่านมา}} มีน้อยเกินกว่าจะรวมได้หนึ่งชั่วโมง", + "@circadianDetailNoStillBody": { + "description": "Empty-state body explaining too few quiet stretches were found", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "circadianDetailStillnessTitle": "ความแปรปรวนระหว่างจังหวะหัวใจขณะอยู่นิ่ง", + "@circadianDetailStillnessTitle": { + "description": "Chart title for the hourly HRV-while-still chart" + }, + "circadianDetailStillnessFootnote": "แต่ละชั่วโมงใช้ค่ากลางของช่วงอยู่นิ่งห้านาทีจำนวน {lo}–{hi} ช่วงใน {days, plural, other{{days} วัน}} และมีข้อมูลพอ {drawn} จาก 24 ชั่วโมง จึงควรอ่านเป็นการอยู่นิ่ง ไม่ใช่ความเครียด", + "@circadianDetailStillnessFootnote": { + "description": "Footnote explaining the HRV-while-still chart's methodology and coverage", + "placeholders": { + "lo": { + "type": "int" + }, + "hi": { + "type": "int" + }, + "days": { + "type": "int" + }, + "drawn": { + "type": "int" + } + } + }, + "circadianDetailForecastTitle": "แนวโน้มของวันนี้", + "@circadianDetailForecastTitle": { + "description": "Chart title for the alertness-shape forecast" + }, + "circadianDetailForecastFootnote": "ไม่มีมาตราส่วน ผลลัพธ์มีเพียงรูปทรงเส้นกราฟ", + "@circadianDetailForecastFootnote": { + "description": "Footnote noting the forecast chart has no numeric scale" + }, + "circadianDetailTroughText": "ช่วงที่ราบที่สุดอยู่ใน {troughLabel} ประมาณ {start}–{end}", + "@circadianDetailTroughText": { + "description": "Sentence naming the predicted flattest/lowest-alertness window of the day", + "placeholders": { + "troughLabel": { + "type": "String" + }, + "start": { + "type": "String" + }, + "end": { + "type": "String" + } + } + }, + "circadianDetailPredictionDisclaimer": "เป็นการคาดการณ์ ไม่ใช่ค่าที่วัด ใช้เฉพาะข้อมูลเมื่อคืน การงีบ กาแฟ หรือสิ่งอื่นวันนี้จะไม่เปลี่ยนผลนี้", + "@circadianDetailPredictionDisclaimer": { + "description": "Disclaimer that the alertness forecast is a prediction, not a measurement" + }, + "circadianDetailAssumedPhaseNote": "ยังหาจุดสูงสุดของนาฬิกาชีวภาพคุณไม่ได้ จึงใช้ค่าเฉลี่ยแทน", + "@circadianDetailAssumedPhaseNote": { + "description": "Appended note when the user's own circadian acrophase is not yet known and an average is used" + }, + "circadianDetailNotADrivingCheck": "ไม่ใช่การประเมินความพร้อมขับรถหรือเครื่องมือประเมินความปลอดภัยในการทำงานเป็นกะ และไม่ได้บอกว่าคุณมีความบกพร่อง", + "@circadianDetailNotADrivingCheck": { + "description": "Safety disclaimer that the forecast is not a fitness-to-drive or shift-safety tool" + }, + "circadianDetailChronotype": "เวลาเข้านอนตามธรรมชาติ", + "@circadianDetailChronotype": { + "description": "Row label: chronotype classification" + }, + "circadianDetailMidSleepFree": "จุดกึ่งกลางการนอนในวันหยุด", + "@circadianDetailMidSleepFree": { + "description": "Row label: mid-sleep time on free days" + }, + "circadianDetailMidSleepWork": "จุดกึ่งกลางการนอนในวันทำงาน", + "@circadianDetailMidSleepWork": { + "description": "Row label: mid-sleep time on working days" + }, + "circadianDetailSocialJetlag": "การเลื่อนเวลานอนช่วงสุดสัปดาห์", + "@circadianDetailSocialJetlag": { + "description": "Row label: social jetlag magnitude" + }, + "circadianDetailLater": "ช้ากว่า", + "@circadianDetailLater": { + "description": "Suffix word appended to the social jetlag value when the free-day clock runs later" + }, + "circadianDetailEarlier": "เร็วกว่า", + "@circadianDetailEarlier": { + "description": "Suffix word appended to the social jetlag value when the free-day clock runs earlier" + }, + "circadianDetailNightsCompared": "จำนวนคืนวันหยุด / วันทำงานที่เปรียบเทียบ", + "@circadianDetailNightsCompared": { + "description": "Row label: count of free vs working nights compared" + }, + "circadianDetailRegularityIndex": "ความสม่ำเสมอของเวลานอน", + "@circadianDetailRegularityIndex": { + "description": "Row label: sleep regularity index score" + }, + "circadianDetailNightsLeastAlike": "คืนที่ต่างกันมากที่สุด", + "@circadianDetailNightsLeastAlike": { + "description": "Row label: the pair of nights with lowest regularity agreement" + }, + "circadianDetailSamePairScale": "คู่เดิม ในมาตราส่วนเดียวกัน", + "@circadianDetailSamePairScale": { + "description": "Row label: that least-alike pair's score on the same 0-100 scale" + }, + "circadianDetailRhythmNotEstablished": "ยังระบุจังหวะของคุณไม่ได้", + "@circadianDetailRhythmNotEstablished": { + "description": "Empty-state title when the rhythm table has no rows yet" + }, + "circadianDetailPairFootnote": "คู่ที่ต่างกันมากที่สุดจาก {count} คู่ การนอนดึกช่วงสุดสัปดาห์คือเวลานอนที่ต่างไป ไม่ใช่คืนที่แย่ลง ไม่นับวันที่บันทึกข้อมูลน้อยเกินไป", + "@circadianDetailPairFootnote": { + "description": "Footnote explaining the least-alike night pair table, out of how many pairs total", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "circadianDetailStability": "ความคงที่ระหว่างวัน", + "@circadianDetailStability": { + "description": "Row label: interdaily stability (IS)" + }, + "circadianDetailFragmentation": "ความไม่ต่อเนื่องระหว่างชั่วโมง", + "@circadianDetailFragmentation": { + "description": "Row label: intradaily variability (IV)" + }, + "circadianDetailAmplitude": "แอมพลิจูดสัมพัทธ์", + "@circadianDetailAmplitude": { + "description": "Row label: relative amplitude (RA)" + }, + "circadianDetailM10Start": "เริ่มช่วง 10 ชั่วโมงที่หัวใจเต้นสูงสุด", + "@circadianDetailM10Start": { + "description": "Row label: start time of the highest-HR 10-hour window (M10)" + }, + "circadianDetailL5Start": "เริ่มช่วง 5 ชั่วโมงที่หัวใจเต้นต่ำสุด", + "@circadianDetailL5Start": { + "description": "Row label: start time of the lowest-HR 5-hour window (L5)" + }, + "circadianDetailRhythmPeak": "จุดสูงสุดของจังหวะ", + "@circadianDetailRhythmPeak": { + "description": "Row label: cosinor-fit rhythm peak time (acrophase)" + }, + "circadianDetailPeakSwing": "ความต่างระหว่างจุดสูงสุดกับค่าเฉลี่ย", + "@circadianDetailPeakSwing": { + "description": "Row label: cosinor amplitude, peak-to-mean swing" + }, + "circadianDetailFitCurve": "ความสอดคล้องกับเส้นโค้ง 24 ชั่วโมง", + "@circadianDetailFitCurve": { + "description": "Row label: adjusted R² of the 24h cosinor fit" + }, + "circadianDetailStrengthNotMeasured": "ยังไม่ได้วัดความชัดเจนของจังหวะ", + "@circadianDetailStrengthNotMeasured": { + "description": "Empty-state title when the rhythm-strength battery has no rows yet" + }, + "circadianDetailStrengthWhy": "ต้องมีข้อมูลติดต่อกันหลายวันที่บันทึกครบทั้ง 24 ชั่วโมง", + "@circadianDetailStrengthWhy": { + "description": "Empty-state reason: needs consecutive fully-recorded days" + }, + "circadianDetailStrengthFootnoteKnown": "จาก {used, plural, other{{used} วันที่บันทึกครบ}} แสดงชั่วโมงที่อัตราการเต้นหัวใจสูงสุดและต่ำสุด ไม่ใช่ช่วงที่คุณทำกิจกรรมมากที่สุด", + "@circadianDetailStrengthFootnoteKnown": { + "description": "Footnote citing how many fully-recorded days the rhythm-strength battery used", + "placeholders": { + "used": { + "type": "int" + } + } + }, + "circadianDetailStrengthFootnoteUnknown": "จากข้อมูลอัตราการเต้นหัวใจหลายวันติดต่อกันที่บันทึกครบ แสดงชั่วโมงที่อัตราการเต้นหัวใจสูงสุดและต่ำสุด ไม่ใช่ช่วงที่ทำกิจกรรมมากที่สุด", + "@circadianDetailStrengthFootnoteUnknown": { + "description": "Footnote for the rhythm-strength battery when the exact day count is unavailable" + }, + "beatsTitle": "จังหวะหัวใจ", + "@beatsTitle": { + "description": "Nav title of the Beats (RR-interval) detail screen" + }, + "beatsNoNightTitle": "ยังไม่มีข้อมูลรายคืนให้วาด", + "@beatsNoNightTitle": { + "description": "Empty-state title when no derived night exists yet" + }, + "beatsNoNightBody": "โทรศัพท์เครื่องนี้ยังไม่ได้คำนวณคะแนนการนอนคืนใด จึงไม่มีข้อมูลจังหวะหัวใจให้แสดง", + "@beatsNoNightBody": { + "description": "Empty-state body explaining there are no beat intervals to plot" + }, + "beatsNoNightFix": "สวมสายรัดขณะนอน แล้วซิงค์", + "@beatsNoNightFix": { + "description": "Empty-state suggested fix action" + }, + "beatsNightOf": "คืนวันที่ {date}", + "@beatsNightOf": { + "description": "Subtitle stating which night's date all panels describe", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "beatsPoincareSection": "แต่ละจังหวะเทียบกับจังหวะก่อนหน้า", + "@beatsPoincareSection": { + "description": "Section title for the Poincaré scatter plot" + }, + "beatsBeatsGoneTitle": "ข้อมูลจังหวะหัวใจของคืนนี้ไม่ได้อยู่ในโทรศัพท์แล้ว", + "@beatsBeatsGoneTitle": { + "description": "Empty-state title when raw beat intervals have been pruned from the phone" + }, + "beatsBeatsGoneBody": "เก็บช่วงเวลาระหว่างจังหวะหัวใจไว้ไม่กี่วันหลังคำนวณคะแนนของคืนนั้นแล้วจึงลบ แต่ค่าที่คำนวณจากข้อมูลเหล่านี้จะเก็บไว้ถาวร", + "@beatsBeatsGoneBody": { + "description": "Empty-state body explaining beat intervals are pruned after a few days but derived numbers persist" + }, + "beatsBeatsGoneMeasured": " — คืนนี้วัดได้ SD1 {sd1} ms, SD2 {sd2} ms", + "@beatsBeatsGoneMeasured": { + "description": "Appended clause reporting the SD1/SD2 values still available even though raw beats are gone", + "placeholders": { + "sd1": { + "type": "String" + }, + "sd2": { + "type": "String" + } + } + }, + "beatsScatterTitle": "แต่ละช่วงเวลาเทียบกับช่วงก่อนหน้า", + "@beatsScatterTitle": { + "description": "Chart title for the Poincaré (beat vs previous beat) scatter" + }, + "beatsScatterFootnote": "จุดบนเส้นทแยงหมายถึงช่วงจังหวะยาวเท่ากับช่วงก่อนหน้า กลุ่มจุดยิ่งกว้างข้ามเส้นนั้น จังหวะหัวใจยิ่งแปรปรวนมาก", + "@beatsScatterFootnote": { + "description": "Footnote explaining how to read the Poincaré scatter's SD1/SD2 axes" + }, + "beatsSd1Label": "SD1", + "@beatsSd1Label": { + "description": "Inline metric label: SD1 (short-term Poincaré axis)" + }, + "beatsSd2Label": "SD2", + "@beatsSd2Label": { + "description": "Inline metric label: SD2 (long-term Poincaré axis)" + }, + "beatsIntervalsLabel": "ช่วงเวลาระหว่างจังหวะ", + "@beatsIntervalsLabel": { + "description": "Inline metric label: count of intervals plotted" + }, + "beatsIntervalsSurvived": "{count, plural, other{เหลือ {count} ช่วงหลังแก้ไขสัญญาณ}}", + "@beatsIntervalsSurvived": { + "description": "Note fragment: how many beat intervals survived artifact correction", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "beatsDroppedArtifact": " — ตัด {count, plural, other{{count} ช่วง}} ที่เป็นสัญญาณรบกวนออก และ{count, plural, other{ไม่นำมารวมในกลุ่มจุด}}", + "@beatsDroppedArtifact": { + "description": "Note fragment appended when some beats were rejected as artifact", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "beatsPulseNotEcg": "เป็นชีพจร ไม่ใช่ ECG ข้อมูลจริงจากคุณ แต่ไม่ใช่ภาพแบบคลื่นไฟฟ้าหัวใจ", + "@beatsPulseNotEcg": { + "description": "Disclaimer that this is pulse-derived data, not an ECG reading" + }, + "beatsMeasuredOn": "วัดด้วย {device} สายรัดต่างชนิดให้ค่าที่ต่างกัน", + "@beatsMeasuredOn": { + "description": "Note fragment naming which strap/device family measured this night", + "placeholders": { + "device": { + "type": "String" + } + } + }, + "beatsVariabilitySection": "ความแปรปรวนตลอดคืน", + "@beatsVariabilitySection": { + "description": "Section title for the night HRV curve panel" + }, + "beatsUnitNights": "คืน", + "@beatsUnitNights": { + "description": "Unit label on the night-variability status card" + }, + "beatsUnitScreenedNotScreened": "คัดกรองแล้ว / ยังไม่คัดกรอง", + "@beatsUnitScreenedNotScreened": { + "description": "Unit label on the rhythm-screen chart (legend describes the two per-day states)" + }, + "beatsVariabilityWhy": "ไม่มีช่วงครึ่งชั่วโมงใดในคืนนี้ที่มีจังหวะหัวใจคุณภาพดีพอจะแสดง HRV", + "@beatsVariabilityWhy": { + "description": "Empty-state reason: no half-hour bin had enough clean beats" + }, + "beatsNoBinsStored": "ไม่ได้เก็บข้อมูลแยกช่วงเวลาของคืนนี้ไว้", + "@beatsNoBinsStored": { + "description": "Empty-state body when literally no bins were stored for the night" + }, + "beatsRmssdTitle": "HRV ในแต่ละช่วงครึ่งชั่วโมง", + "@beatsRmssdTitle": { + "description": "Chart title for the half-hour RMSSD band chart" + }, + "beatsStart": "เริ่ม", + "@beatsStart": { + "description": "X-axis label for the start of the night when no wall-clock origin is known" + }, + "beatsBandFootnote": "แต่ละแท่งแสดงความเชื่อมั่นของช่วงนั้น และขีดด้านในแสดงค่า เว้นว่างเมื่อเหลือจังหวะคุณภาพดีน้อยเกินไป", + "@beatsBandFootnote": { + "description": "Footnote explaining the RMSSD band chart's bar-vs-mark meaning" + }, + "beatsFirstThird": "หนึ่งในสามแรก", + "@beatsFirstThird": { + "description": "Inline metric label: RMSSD in the first third of the night" + }, + "beatsLastThird": "หนึ่งในสามท้าย", + "@beatsLastThird": { + "description": "Inline metric label: RMSSD in the last third of the night" + }, + "beatsDcSection": "ความสามารถในการชะลออัตราการเต้นหัวใจ", + "@beatsDcSection": { + "description": "Section title for the deceleration-capacity (PRSA DC) panel" + }, + "beatsDcWhy": "ยังไม่มีคืนที่เก็บไว้ใดคำนวณค่านี้ได้", + "@beatsDcWhy": { + "description": "Empty-state reason: no stored night has produced a DC value" + }, + "beatsDcNoData": "ยังไม่มีคืนใดคำนวณค่านี้ได้", + "@beatsDcNoData": { + "description": "Empty-state body fallback for deceleration capacity" + }, + "beatsDcChartTitle": "คืนของคุณตามลำดับ", + "@beatsDcChartTitle": { + "description": "Chart title for the deceleration-capacity trend chart" + }, + "beatsDaysAgo": "{count} วันที่แล้ว", + "@beatsDaysAgo": { + "description": "X-axis label for the oldest day shown in a rolling-window chart", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "beatsTodayLabel": "วันนี้", + "@beatsTodayLabel": { + "description": "X-axis label for the most recent day in a rolling-window chart" + }, + "beatsAnchorsLastNight": "จุดอ้างอิงเมื่อคืน", + "@beatsAnchorsLastNight": { + "description": "Inline metric label: PRSA anchor count for the most recent night" + }, + "beatsCleanBeats": "จังหวะคุณภาพดี", + "@beatsCleanBeats": { + "description": "Inline metric label: percentage of beats that were clean" + }, + "beatsDcNote": "เปรียบเทียบเฉพาะกับคืนก่อน ๆ ของคุณ เพราะสัญญาณที่ดีขึ้นอาจทำให้ค่านี้สูงขึ้นได้พอ ๆ กับการเปลี่ยนแปลงของร่างกาย", + "@beatsDcNote": { + "description": "Explanatory note under the deceleration-capacity chart about how to interpret it" + }, + "beatsRhythmSection": "คัดกรองจังหวะหัวใจ", + "@beatsRhythmSection": { + "description": "Section title for the irregular-rhythm screening panel" + }, + "beatsRhythmChartTitle": "หนึ่งช่องต่อวัน", + "@beatsRhythmChartTitle": { + "description": "Chart title for the per-day rhythm-screen strip" + }, + "beatsScreenNotFired": "ไม่พบสัญญาณเตือนจากการคัดกรอง", + "@beatsScreenNotFired": { + "description": "Legend label: the rhythm screen ran and did not flag anything" + }, + "beatsScreenFired": "พบสัญญาณเตือนจากการคัดกรอง", + "@beatsScreenFired": { + "description": "Legend label: the rhythm screen ran and flagged the day" + }, + "beatsNotScreened": "ยังไม่คัดกรอง", + "@beatsNotScreened": { + "description": "Legend label: the rhythm screen did not run that day" + }, + "beatsNoDayScreened": "ไม่มีวันใดในช่วงนี้ได้รับการคัดกรอง", + "@beatsNoDayScreened": { + "description": "Empty-state message when no day in the window was screened at all" + }, + "beatsScreenNote": "เป็นการคัดกรอง ไม่ใช่การตรวจวินิจฉัย\n\nวันที่ไม่มีสัญญาณเตือนไม่ได้ยืนยันว่าปกติ การคัดกรองนี้ตัดความเป็นไปได้ใดออกไม่ได้ วันที่มีแต่เส้นขอบไม่ได้รับการคัดกรองเลย เพราะมีจังหวะคุณภาพดีน้อยเกินไปหรือเคลื่อนไหวมากเกินไป\n\nชีพจรจากข้อมือไม่ใช่ ECG หากคุณมาที่นี่เพราะมีอาการ แพทย์สามารถตรวจอย่างเหมาะสมได้", + "@beatsScreenNote": { + "description": "Multi-paragraph disclaimer that the rhythm strip is a screen, not a diagnosis, and to see a clinician for symptoms" + }, + "beatsScreenedSummary": "คัดกรองแล้ว {screened} จาก {win} วันล่าสุด", + "@beatsScreenedSummary": { + "description": "Summary sentence: how many of the last N days were screened", + "placeholders": { + "screened": { + "type": "int" + }, + "win": { + "type": "int" + } + } + }, + "beatsFiredSummary": "; พบสัญญาณเตือน {fired} วัน", + "@beatsFiredSummary": { + "description": "Appended clause: how many days the screen fired on", + "placeholders": { + "fired": { + "type": "int" + } + } + }, + "beatsNotScreenedNote": " เมื่อคืนไม่ได้คัดกรอง: {note}", + "@beatsNotScreenedNote": { + "description": "Appended clause giving the reason last night specifically was not screened", + "placeholders": { + "note": { + "type": "String" + } + } + }, + "logWorkoutCouldNotLog": "บันทึกรายการนี้ไม่ได้ โปรดลองอีกครั้ง", + "@logWorkoutCouldNotLog": { + "description": "Error snack bar when confirming a detected workout suggestion fails to save" + }, + "logWorkoutCouldNotDismiss": "ปิดรายการนี้ไม่ได้ โปรดลองอีกครั้ง", + "@logWorkoutCouldNotDismiss": { + "description": "Error snack bar when dismissing a detected workout suggestion fails" + }, + "logWorkoutAdjustTimes": "ปรับเวลา", + "@logWorkoutAdjustTimes": { + "description": "Button/screen-title for widening the times on a detected workout before logging it" + }, + "logWorkoutDetectedActivityTitle": "กิจกรรมที่ตรวจพบ", + "@logWorkoutDetectedActivityTitle": { + "description": "Nav bar title on the detected-workout review screen" + }, + "logWorkoutYoursToConfirmSub": "รอคุณยืนยัน", + "@logWorkoutYoursToConfirmSub": { + "description": "Nav bar subtitle (all caps) on the detected-workout review screen" + }, + "logWorkoutReadFailedTitle": "อ่านกิจกรรมที่ตรวจพบไม่ได้", + "@logWorkoutReadFailedTitle": { + "description": "Status card title when reading detected workout suggestions fails" + }, + "logWorkoutReadFailedBody": "ระบบจัดเก็บไม่ตอบกลับ ยังไม่ได้บันทึกหรือปิดรายการใด", + "@logWorkoutReadFailedBody": { + "description": "Status card body when reading detected workout suggestions fails" + }, + "logWorkoutTryAgain": "ลองอีกครั้ง", + "@logWorkoutTryAgain": { + "description": "Retry action label on the failed-read status card" + }, + "logWorkoutReadingSpotted": "กำลังอ่านกิจกรรมที่สายรัดตรวจพบ…", + "@logWorkoutReadingSpotted": { + "description": "Loading message while detected workout suggestions are being read" + }, + "logWorkoutNothingToReviewTitle": "ไม่มีรายการให้ตรวจสอบ", + "@logWorkoutNothingToReviewTitle": { + "description": "Status card title when there are no detected workouts left to review" + }, + "logWorkoutNothingToReviewBody": "รายการนี้อาจบันทึกหรือปิดไปแล้ว", + "@logWorkoutNothingToReviewBody": { + "description": "Status card body when there are no detected workouts left to review" + }, + "logWorkoutHardMinutesTitle": "นี่คือช่วงออกแรงหนัก ไม่ใช่ทั้งการออกกำลังกาย", + "@logWorkoutHardMinutesTitle": { + "description": "Status card title explaining that detection only reports the hard-effort core of a session" + }, + "logWorkoutHardMinutesBody": "ตรวจพบเฉพาะการออกแรงต่อเนื่อง จึงไม่รวมช่วงอบอุ่นร่างกายและพักระหว่างเซ็ต หากจำเป็น ให้ขยายช่วงเวลาก่อนบันทึก", + "@logWorkoutHardMinutesBody": { + "description": "Status card body explaining that detection only reports the hard-effort core of a session" + }, + "logWorkoutMinutesOfEffort": "ออกแรง {mins} นาที", + "@logWorkoutMinutesOfEffort": { + "description": "Duration line on a detected-workout card, e.g. '25 min of effort'", + "placeholders": { + "mins": { + "type": "int" + } + } + }, + "logWorkoutAvgHr": "HR เฉลี่ย", + "@logWorkoutAvgHr": { + "description": "Metric label: average heart rate over a detected bout" + }, + "logWorkoutPeakHr": "HR สูงสุด", + "@logWorkoutPeakHr": { + "description": "Metric label: peak heart rate over a detected bout" + }, + "logWorkoutLooksLike": "ดูเหมือน", + "@logWorkoutLooksLike": { + "description": "Metric label naming the guessed activity type of a detected bout" + }, + "logWorkoutLogIt": "บันทึก", + "@logWorkoutLogIt": { + "description": "Primary button to confirm/log a workout" + }, + "logWorkoutNotAWorkout": "ไม่ใช่การออกกำลังกาย", + "@logWorkoutNotAWorkout": { + "description": "Button to dismiss a detected bout as not a workout" + }, + "logWorkoutToday": "วันนี้", + "@logWorkoutToday": { + "description": "Relative day label for the current calendar day" + }, + "logWorkoutYesterday": "เมื่อวาน", + "@logWorkoutYesterday": { + "description": "Relative day label for the previous calendar day" + }, + "logWorkoutDefaultTitle": "บันทึกการออกกำลังกายย้อนหลัง", + "@logWorkoutDefaultTitle": { + "description": "Default screen title for the manual workout log form when no title is supplied" + }, + "logWorkoutWindowRescoredSub": "คำนวณคะแนนช่วงเวลานี้ใหม่", + "@logWorkoutWindowRescoredSub": { + "description": "Nav bar subtitle (all caps) when retiming an existing logged workout" + }, + "logWorkoutYourOwnTimesSub": "เวลาที่คุณระบุ", + "@logWorkoutYourOwnTimesSub": { + "description": "Nav bar subtitle (all caps) when logging a brand-new manual workout" + }, + "logWorkoutWhenGroup": "เวลา", + "@logWorkoutWhenGroup": { + "description": "Settings group heading over the date/start/end/length rows on the workout form" + }, + "logWorkoutActivityLabel": "กิจกรรม", + "@logWorkoutActivityLabel": { + "description": "Form row label for the workout activity/type picker" + }, + "logWorkoutDateLabel": "วันที่", + "@logWorkoutDateLabel": { + "description": "Form row label for the workout date picker" + }, + "logWorkoutStartedLabel": "เริ่ม", + "@logWorkoutStartedLabel": { + "description": "Form row label for the workout start time picker" + }, + "logWorkoutEndedLabel": "จบ", + "@logWorkoutEndedLabel": { + "description": "Form row label for the workout end time picker" + }, + "logWorkoutLengthLabel": "ระยะเวลา", + "@logWorkoutLengthLabel": { + "description": "Form row label showing the computed workout duration" + }, + "logWorkoutNextMorningSub": "เช้าวันถัดไป", + "@logWorkoutNextMorningSub": { + "description": "Small note under the end-time row when the end falls on the next calendar day" + }, + "logWorkoutWindowInvalidTitle": "บันทึกช่วงเวลานั้นไม่ได้", + "@logWorkoutWindowInvalidTitle": { + "description": "Status card title when the chosen time window fails validation" + }, + "logWorkoutTimesUpdatedTitle": "อัปเดตเวลาแล้ว", + "@logWorkoutTimesUpdatedTitle": { + "description": "Status card title after successfully retiming an existing workout" + }, + "logWorkoutLoggedTitle": "บันทึกการออกกำลังกายแล้ว", + "@logWorkoutLoggedTitle": { + "description": "Status card title after successfully logging a new workout" + }, + "logWorkoutScoreWithBand": "คำนวณคะแนนด้วยอัตราการเต้นหัวใจจากสายรัด", + "@logWorkoutScoreWithBand": { + "description": "Title of the log form when scoring an imported workout from the band's own heart rate." + }, + "logWorkoutImportedHrGone": "ไม่ได้เก็บอัตราการเต้นหัวใจของการออกกำลังกายนี้ไว้แล้ว จึงใช้สายรัดคำนวณคะแนนไม่ได้", + "@logWorkoutImportedHrGone": { + "description": "Shown when an imported workout's window has no stored band heart rate left to score." + }, + "logWorkoutUnscoredSaved": "บันทึกแล้ว ไม่มีอัตราการเต้นหัวใจในช่วงนั้น จึงไม่มีค่าความหนักหรือแคลอรี รายการนี้มีเพียงเวลา", + "@logWorkoutUnscoredSaved": { + "description": "Status card body when a saved workout has no heart-rate data so it could not be scored" + }, + "logWorkoutCouldNotSave": "บันทึกไม่ได้ โปรดลองอีกครั้ง", + "@logWorkoutCouldNotSave": { + "description": "Status card body when saving the workout form fails" + }, + "logWorkoutScoredTitle": "คำนวณคะแนนจากข้อมูลที่สายรัดบันทึก", + "@logWorkoutScoredTitle": { + "description": "Status card title explaining that strain/calories are computed from recorded heart rate" + }, + "logWorkoutScoredBody": "ความหนักและแคลอรีคำนวณจากอัตราการเต้นหัวใจในช่วงนี้ เช่นเดียวกับคะแนนรายวัน ไม่มีการเดาจากระยะเวลา", + "@logWorkoutScoredBody": { + "description": "Status card body explaining that strain/calories are computed from recorded heart rate, not estimated" + }, + "logWorkoutSaving": "กำลังบันทึก…", + "@logWorkoutSaving": { + "description": "Save button label while the workout form is submitting" + }, + "logWorkoutSaveNewTimes": "บันทึกเวลาใหม่", + "@logWorkoutSaveNewTimes": { + "description": "Save button label when retiming an existing workout" + }, + "logWorkoutSearchActivities": "ค้นหากิจกรรม", + "@logWorkoutSearchActivities": { + "description": "Search field hint text in the activity-type picker sheet" + }, + "logWorkoutNoActivityByName": "ไม่มีกิจกรรมชื่อนั้น", + "@logWorkoutNoActivityByName": { + "description": "Empty-state message when the activity search finds no matches" + }, + "logFoodTitle": "บันทึกการกินหนึ่งครั้ง", + "@logFoodTitle": { + "description": "Heading of the log-food bottom sheet" + }, + "logFoodClose": "ปิด", + "@logFoodClose": { + "description": "Accessibility label for the close button on the log-food sheet" + }, + "logFoodIAte": "ฉันกิน{meal}", + "@logFoodIAte": { + "description": "Primary button to log a bare eating occasion, e.g. 'I ate breakfast'", + "placeholders": { + "meal": { + "type": "String" + } + } + }, + "logFoodAgain": "อีกครั้ง", + "@logFoodAgain": { + "description": "Section heading listing recently logged foods for one-tap re-logging" + }, + "logFoodAddNumbers": "เพิ่มตัวเลข", + "@logFoodAddNumbers": { + "description": "Expandable row label to reveal the macro-detail fields" + }, + "logFoodScanBarcode": "สแกนบาร์โค้ด", + "@logFoodScanBarcode": { + "description": "Row label to scan a product barcode" + }, + "logFoodScanSubOn": "สอบถามบาร์โค้ดจาก openfoodfacts.org และเติมข้อมูลเฉพาะที่ผ่านการตรวจสอบ", + "@logFoodScanSubOn": { + "description": "Subtitle under the scan-barcode row when online lookups are already allowed" + }, + "logFoodScanSubOff": "ค้นหาข้อมูลบนบรรจุภัณฑ์ออนไลน์ โดยขออนุญาตก่อน", + "@logFoodScanSubOff": { + "description": "Subtitle under the scan-barcode row when online lookups are off and will be asked about first" + }, + "logFoodLookingUpTitle": "กำลังค้นหาข้อมูล", + "@logFoodLookingUpTitle": { + "description": "Status card title while a barcode lookup is in progress" + }, + "logFoodLookingUpBody": "ช่องข้อมูลจะถูกเติมทันทีที่ได้รับคำตอบ", + "@logFoodLookingUpBody": { + "description": "Status card body while a barcode lookup is in progress" + }, + "logFoodWhatLabel": "อาหาร", + "@logFoodWhatLabel": { + "description": "Text field label for the food description" + }, + "logFoodWhatHint": "ข้าวไก่", + "@logFoodWhatHint": { + "description": "Text field placeholder example for the food description" + }, + "logFoodPortionLabel": "ปริมาณที่กิน", + "@logFoodPortionLabel": { + "description": "Number field label for the eaten portion size in grams" + }, + "logFoodUnknownHint": "ไม่ทราบ", + "@logFoodUnknownHint": { + "description": "Placeholder text in a macro number field when no value is known" + }, + "logFoodEnergyLabel": "พลังงาน", + "@logFoodEnergyLabel": { + "description": "Number field label for energy/calories" + }, + "logFoodProteinLabel": "โปรตีน", + "@logFoodProteinLabel": { + "description": "Number field label for protein" + }, + "logFoodCarbsLabel": "คาร์โบไฮเดรต", + "@logFoodCarbsLabel": { + "description": "Number field label for carbohydrates" + }, + "logFoodFatLabel": "ไขมัน", + "@logFoodFatLabel": { + "description": "Number field label for fat" + }, + "logFoodFibreLabel": "ใยอาหาร", + "@logFoodFibreLabel": { + "description": "Number field label for fibre" + }, + "logFoodBlankHint": "ตัวเลขที่เว้นว่างจะยังว่าง ต้องระบุเฉพาะ “อาหาร”", + "@logFoodBlankHint": { + "description": "Helper text under the macro fields explaining blank values are fine" + }, + "logFoodSayWhatFirst": "ระบุก่อนว่ากินอะไร", + "@logFoodSayWhatFirst": { + "description": "Snack bar shown when trying to save a food entry with no description" + }, + "logFoodConsentTitle": "ค้นหาบาร์โค้ดออนไลน์หรือไม่?", + "@logFoodConsentTitle": { + "description": "Heading of the barcode-lookup consent sheet" + }, + "logFoodConsentBody1": "การสแกนจะส่งบาร์โค้ดไปยัง openfoodfacts.org ซึ่งเป็นฐานข้อมูลอาหารแบบเปิดที่ใช้ฟรี บริการจะเห็นบาร์โค้ดและที่อยู่ IP ของคุณ ไม่มีข้อมูลส่วนตัว มื้ออาหาร หรือสุขภาพออกจากโทรศัพท์ บาร์โค้ดที่เคยสแกนจะอ่านจากสำเนาในเครื่องโดยไม่สอบถามซ้ำ", + "@logFoodConsentBody1": { + "description": "First paragraph of the barcode-lookup consent sheet, explaining what data leaves the phone" + }, + "logFoodConsentBody2": "ตัวเลขมาจากการกรอกของผู้ใช้ทั่วไป และมีข้อมูลผิดอยู่ไม่น้อย ค่าที่ไม่ผ่านการตรวจสอบความสมเหตุสมผลจะเว้นว่าง คุณแก้ไขทุกค่าที่เติมให้ได้ก่อนบันทึก", + "@logFoodConsentBody2": { + "description": "Second paragraph of the barcode-lookup consent sheet, explaining data quality and editability" + }, + "logFoodConsentBody3": "ปิดได้อีกครั้งที่ การตั้งค่า › ความเป็นส่วนตัว คุณยังพิมพ์ตัวเลขจากบรรจุภัณฑ์เองได้เสมอ", + "@logFoodConsentBody3": { + "description": "Third paragraph of the barcode-lookup consent sheet, explaining how to revoke consent" + }, + "logFoodAllowLookups": "อนุญาตให้ค้นหา", + "@logFoodAllowLookups": { + "description": "Consent sheet button to allow online barcode lookups" + }, + "logFoodNotNow": "ไว้ก่อน", + "@logFoodNotNow": { + "description": "Consent sheet button to decline online barcode lookups" + }, + "logFoodBreakfast": "มื้อเช้า", + "@logFoodBreakfast": { + "description": "Meal-type label: breakfast" + }, + "logFoodLunch": "มื้อกลางวัน", + "@logFoodLunch": { + "description": "Meal-type label: lunch" + }, + "logFoodDinner": "มื้อเย็น", + "@logFoodDinner": { + "description": "Meal-type label: dinner" + }, + "logFoodSnack": "ของว่าง", + "@logFoodSnack": { + "description": "Meal-type label: snack (also the default/fallback meal type)" + }, + "logFoodNoNumbersTitle": "ไม่มีตัวเลขสำหรับรายการนี้", + "@logFoodNoNumbersTitle": { + "description": "Status card title when a barcode lookup found the product but no usable nutrition numbers" + }, + "logFoodNoNumbersBody": "Open Food Facts มีสินค้านี้ แต่ไม่มีข้อมูลโภชนาการที่ใช้ได้ หรือข้อมูลไม่ผ่านการตรวจสอบความสมเหตุสมผล", + "@logFoodNoNumbersBody": { + "description": "Status card body when a barcode lookup found the product but no usable nutrition numbers" + }, + "logFoodNotFoundTitle": "ไม่พบใน Open Food Facts", + "@logFoodNotFoundTitle": { + "description": "Status card title when a scanned barcode is not in the product database" + }, + "logFoodNotFoundBody": "ยังไม่มีใครเพิ่มบาร์โค้ดนี้", + "@logFoodNotFoundBody": { + "description": "Status card body when a scanned barcode is not in the product database" + }, + "logFoodFlaggedTitle": "ข้อมูลนี้ถูกระบุว่ามีข้อผิดพลาด", + "@logFoodFlaggedTitle": { + "description": "Status card title when Open Food Facts flags the scanned product record as wrong" + }, + "logFoodFlaggedBody": "Open Food Facts ระบุว่าสินค้านี้มีข้อมูลผิด จึงไม่ได้เติมตัวเลขใด", + "@logFoodFlaggedBody": { + "description": "Status card body when Open Food Facts flags the scanned product record as wrong" + }, + "logFoodUnreachableTitle": "Open Food Facts ไม่ตอบกลับ", + "@logFoodUnreachableTitle": { + "description": "Status card title when the barcode lookup service could not be reached" + }, + "logFoodUnreachableBody": "ติดต่อ openfoodfacts.org เพื่อค้นหาไม่ได้", + "@logFoodUnreachableBody": { + "description": "Status card body when the barcode lookup service could not be reached" + }, + "logFoodRefusedTitle": "ปิดการค้นหาบาร์โค้ดอยู่", + "@logFoodRefusedTitle": { + "description": "Status card title when barcode lookup is turned off in privacy settings" + }, + "logFoodRefusedBody": "ไม่ได้ส่งข้อมูล เปิดได้ที่ การตั้งค่า › ความเป็นส่วนตัว", + "@logFoodRefusedBody": { + "description": "Status card body when barcode lookup is turned off in privacy settings" + }, + "logFoodPortionNoteBase": "Open Food Facts ระบุข้อมูลต่อ 100 กรัม เมื่อเปลี่ยนปริมาณที่กิน ตัวเลขจะปรับตาม", + "@logFoodPortionNoteBase": { + "description": "Note under the portion field explaining nutrition numbers are per 100g and rescale with portion, used when the product has no stated serving size" + }, + "logFoodPortionNoteServing": "Open Food Facts ระบุข้อมูลต่อ 100 กรัม เมื่อเปลี่ยนปริมาณที่กิน ตัวเลขจะปรับตาม หนึ่งหน่วยบริโภคตามบรรจุภัณฑ์คือ {serving}", + "@logFoodPortionNoteServing": { + "description": "Note under the portion field explaining nutrition numbers are per 100g and rescale with portion, including the pack's own stated serving size", + "placeholders": { + "serving": { + "type": "String" + } + } + }, + "logFoodPillOpenFoodFacts": "Open Food Facts", + "@logFoodPillOpenFoodFacts": { + "description": "Provenance pill on a food row: number came from an Open Food Facts barcode scan" + }, + "logFoodPillYours": "ของคุณ", + "@logFoodPillYours": { + "description": "Provenance pill on a food row: numbers were typed in by the user" + }, + "logFoodBareOccasion": "บันทึกแล้ว · ไม่ได้ระบุพลังงาน", + "@logFoodBareOccasion": { + "description": "Detail line on a food row that was logged with no energy/macro numbers, all caps" + }, + "logFoodOpensInBrowser": "{label} เปิดในเบราว์เซอร์ของคุณ", + "@logFoodOpensInBrowser": { + "description": "Accessibility label appended to an external link, e.g. an Open Food Facts credit link", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "dayTimelineChargerOn": "อยู่บนแท่นชาร์จ", + "@dayTimelineChargerOn": { + "description": "Timeline event: the band was placed on the charger." + }, + "dayTimelineChargerOff": "ถอดจากแท่นชาร์จ", + "@dayTimelineChargerOff": { + "description": "Timeline event: the band was taken off the charger." + }, + "dayTimelineDoubleTap": "คุณแตะสายรัดสองครั้ง", + "@dayTimelineDoubleTap": { + "description": "Timeline event: user double-tapped the band." + }, + "dayTimelineRestarted": "สายรัดรีสตาร์ต", + "@dayTimelineRestarted": { + "description": "Timeline event: the band restarted itself." + }, + "dayTimelineBatteryPackAttached": "ติดแบตเตอรี่เสริม", + "@dayTimelineBatteryPackAttached": { + "description": "Timeline event: an external battery pack was attached to the band." + }, + "dayTimelineBatteryPackRemoved": "ถอดแบตเตอรี่เสริม", + "@dayTimelineBatteryPackRemoved": { + "description": "Timeline event: an external battery pack was removed from the band." + }, + "dayTimelineAlarmWentOff": "นาฬิกาปลุกทำงาน", + "@dayTimelineAlarmWentOff": { + "description": "Timeline event: the band's alarm fired." + }, + "dayTimelineAsleep": "หลับ", + "@dayTimelineAsleep": { + "description": "Timeline/legend title for a night's sleep span." + }, + "dayTimelineNap": "งีบ", + "@dayTimelineNap": { + "description": "Timeline title for a nap span." + }, + "dayTimelineWorkout": "ออกกำลังกาย", + "@dayTimelineWorkout": { + "description": "Fallback timeline/legend title for a workout session with no known type." + }, + "dayTimelineBandOffWrist": "ถอดสายรัดจากข้อมือ", + "@dayTimelineBandOffWrist": { + "description": "Timeline title for a stretch the band was off the wrist." + }, + "dayTimelineHighestHr": "อัตราการเต้นหัวใจสูงสุด", + "@dayTimelineHighestHr": { + "description": "Timeline title for the day's highest heart-rate reading." + }, + "dayTimelineLowestHr": "อัตราการเต้นหัวใจต่ำสุด", + "@dayTimelineLowestHr": { + "description": "Timeline title for the day's lowest heart-rate reading." + }, + "dayTimelineBpmAt": "{bpm} bpm เวลา {time}", + "@dayTimelineBpmAt": { + "description": "Timeline detail line for a heart-rate extreme, e.g. '142 bpm at 3:14 PM'.", + "placeholders": { + "bpm": { + "type": "int" + }, + "time": { + "type": "String" + } + } + }, + "dayTimelineTakenAt": "ใช้เมื่อ {time}", + "@dayTimelineTakenAt": { + "description": "Timeline detail line for a medication dose taken at a given time.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "dayTimelineLastAt": "ล่าสุดเวลา {time}", + "@dayTimelineLastAt": { + "description": "Timeline detail suffix for the last occurrence of a timed journal field, e.g. 'last at 9:30 PM'.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "dayTimelineTaggedTitle": "ติดแท็กแล้ว", + "@dayTimelineTaggedTitle": { + "description": "Fallback day-note title when a journal entry has tags but no written note." + }, + "dayTimelineDeviceBounded": "เก็บรายละเอียดแยกอุปกรณ์ไว้เฉพาะวันล่าสุด ก่อน {oldest} จะทราบเพียงว่าอุปกรณ์ใดบันทึก แต่ไม่ทราบค่าที่ส่งมา", + "@dayTimelineDeviceBounded": { + "description": "Copy shown instead of a per-device curve when the day is outside decoded_onehz retention.", + "placeholders": { + "oldest": { + "type": "String" + } + } + }, + "dayTimelineTitle": "รายละเอียดวันของคุณ", + "@dayTimelineTitle": { + "description": "Day timeline screen title." + }, + "dayTimelineSub": "เที่ยงคืนถึงเที่ยงคืน", + "@dayTimelineSub": { + "description": "Day timeline screen subtitle, all-caps." + }, + "dayTimelineHeartRateTitle": "อัตราการเต้นหัวใจ", + "@dayTimelineHeartRateTitle": { + "description": "Title of the day's heart-rate chart." + }, + "dayTimelineMidnight": "เที่ยงคืน", + "@dayTimelineMidnight": { + "description": "X-axis label for midnight on the day chart." + }, + "dayTimelineNoon": "เที่ยงวัน", + "@dayTimelineNoon": { + "description": "X-axis label for noon on the day chart." + }, + "dayTimelineMoving": "เคลื่อนไหว", + "@dayTimelineMoving": { + "description": "Legend label for the movement lane on the day chart." + }, + "dayTimelineNotRecorded": "ไม่ได้บันทึก", + "@dayTimelineNotRecorded": { + "description": "Legend label for unmeasured stretches on the day chart." + }, + "dayTimelineNothingRecordedTitle": "วันนี้ไม่ได้บันทึกข้อมูลใด", + "@dayTimelineNothingRecordedTitle": { + "description": "Empty-state title when a day has no chart and no timeline entries at all." + }, + "dayTimelineNothingRecordedBody": "ไม่มีการนอน การออกกำลังกาย บันทึก หรือเหตุการณ์สายรัดที่มีเวลา วันที่ว่างมักเป็นวันที่ไม่ได้สวมสายรัด", + "@dayTimelineNothingRecordedBody": { + "description": "Empty-state body explaining a day with nothing recorded." + }, + "dayTimelineNoTimeTitle": "ไม่มีข้อมูลใดของวันนี้ระบุเวลา", + "@dayTimelineNoTimeTitle": { + "description": "Empty-state title when a day has notes but nothing with a time attached." + }, + "dayTimelineNoTimeBody": "ข้อมูลที่บันทึกไว้สำหรับวันนี้อยู่ด้านล่าง", + "@dayTimelineNoTimeBody": { + "description": "Empty-state body pointing to the notes section below." + }, + "dayTimelineWhatHappenedSection": "สิ่งที่เกิดขึ้น", + "@dayTimelineWhatHappenedSection": { + "description": "Section heading over the day's timed events list; also reused as a section heading on the journal compose screen for the day's tags." + }, + "dayTimelineAlsoLoggedSection": "ข้อมูลอื่นที่บันทึกวันนี้", + "@dayTimelineAlsoLoggedSection": { + "description": "Section heading over the day's untimed notes." + }, + "dayTimelineNoTimeNote": "ข้อมูลเหล่านี้ผูกกับวันแต่ไม่ได้ระบุเวลา จึงไม่วางบนเส้นเวลา", + "@dayTimelineNoTimeNote": { + "description": "Footnote explaining why untimed notes are not placed on the timeline." + }, + "dayTimelinePatternsNote": "รูปแบบจากบันทึกของคุณ ไม่ใช่สาเหตุ สองสิ่งที่อยู่ใกล้กันที่นี่เพียงเกิดขึ้นในเวลาใกล้กัน หน้านี้บอกได้เท่านั้น", + "@dayTimelinePatternsNote": { + "description": "Footnote reminding the user the timeline shows adjacency, not causation." + }, + "journalComposeNotReady": "ยังไม่พร้อม โปรดเปิดแอปก่อน", + "@journalComposeNotReady": { + "description": "Snackbar shown when trying to add a custom journal field before the app has a repository ready." + }, + "journalComposeSaveFailed": "บันทึกไม่ได้ ตรวจสอบพื้นที่จัดเก็บแล้วลองอีกครั้ง", + "@journalComposeSaveFailed": { + "description": "Snackbar shown when saving a new custom journal field fails." + }, + "journalComposeWhenWasLastOne": "ครั้งล่าสุดเมื่อไร?", + "@journalComposeWhenWasLastOne": { + "description": "Time picker help text when logging the time of the last dose of a journal field." + }, + "journalComposeTitle": "บันทึกประจำวัน", + "@journalComposeTitle": { + "description": "Journal compose screen title." + }, + "journalComposeTodaySection": "วันนี้", + "@journalComposeTodaySection": { + "description": "Section heading over today's journal field steppers." + }, + "journalComposeTrackSomethingElse": "ติดตามอย่างอื่น", + "@journalComposeTrackSomethingElse": { + "description": "Button to define a new custom journal field." + }, + "journalComposeAnythingElseLabel": "เรื่องอื่น ๆ", + "@journalComposeAnythingElseLabel": { + "description": "Label for the free-text journal note field." + }, + "journalComposeTalkItThroughWithAi": "พูดคุยกับ AI", + "@journalComposeTalkItThroughWithAi": { + "description": "Link above the journal note field that opens an AI chat about the day. Shown only when an AI key is configured." + }, + "journalComposeAnythingElseHint": "เขียนสั้น ๆ เกี่ยวกับวันนี้", + "@journalComposeAnythingElseHint": { + "description": "Placeholder hint for the free-text journal note field." + }, + "journalComposeSavingLabel": "กำลังบันทึก", + "@journalComposeSavingLabel": { + "description": "Save button label while the journal entry is being saved." + }, + "journalComposeHowAreYouFeeling": "คุณรู้สึกอย่างไร?", + "@journalComposeHowAreYouFeeling": { + "description": "Mood picker heading." + }, + "journalComposeNotAnsweredYet": "ยังไม่ได้ตอบ", + "@journalComposeNotAnsweredYet": { + "description": "Mood picker subtitle when no mood has been picked yet." + }, + "journalComposeMoodOfFive": "อารมณ์ {value} จาก 5 · แตะซ้ำเพื่อล้าง", + "@journalComposeMoodOfFive": { + "description": "Mood picker subtitle once a mood is picked, e.g. 'Mood 3 of 5 · tap it again to clear'.", + "placeholders": { + "value": { + "type": "int" + } + } + }, + "journalComposeMoodOfFiveSelected": "อารมณ์ {n} จาก 5 เลือกอยู่ กดเพื่อล้าง", + "@journalComposeMoodOfFiveSelected": { + "description": "Accessibility label for the currently selected mood face, which can be tapped again to clear it.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "journalComposeMoodOfFiveLabel": "อารมณ์ {n} จาก 5", + "@journalComposeMoodOfFiveLabel": { + "description": "Accessibility label for an unselected mood face.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "journalComposeNotLogged": "ยังไม่ได้บันทึก", + "@journalComposeNotLogged": { + "description": "Field stepper value shown when a journal field has no value logged." + }, + "journalComposeWhenWasLastField": "{field}ครั้งล่าสุดเมื่อไร", + "@journalComposeWhenWasLastField": { + "description": "Accessibility label for the button that opens a time picker for a journal field's last dose, e.g. 'When was the last Caffeine'.", + "placeholders": { + "field": { + "type": "String" + } + } + }, + "journalComposeAddTimeOfLastOne": "เพิ่มเวลาครั้งล่าสุด", + "@journalComposeAddTimeOfLastOne": { + "description": "Button prompting the user to add the time of the last dose of a field." + }, + "journalComposeLastAt": "ล่าสุดเวลา {time}", + "@journalComposeLastAt": { + "description": "Button label showing the recorded time of the last dose, e.g. 'Last at 9:30 PM'.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "journalComposeIncrease": "เพิ่ม", + "@journalComposeIncrease": { + "description": "Accessibility label for the stepper's increase button." + }, + "journalComposeDecrease": "ลด", + "@journalComposeDecrease": { + "description": "Accessibility label for the stepper's decrease button." + }, + "journalComposeWeightLabel": "น้ำหนัก", + "@journalComposeWeightLabel": { + "description": "Label for the weight row in the journal, and fallback name for the weight field used in error messages." + }, + "journalComposeNotEntered": "ยังไม่ได้กรอก", + "@journalComposeNotEntered": { + "description": "Weight row subtitle when no weight has been entered for the day." + }, + "journalComposeEnteredNotMeasured": "{value} · กรอกเอง ไม่ได้วัด", + "@journalComposeEnteredNotMeasured": { + "description": "Weight row subtitle showing the entered value with a note that it is self-reported, e.g. '70.0 kg · entered, not measured'.", + "placeholders": { + "value": { + "type": "String" + } + } + }, + "journalComposeEnterWeight": "กรอกน้ำหนัก", + "@journalComposeEnterWeight": { + "description": "Accessibility label for the button opening the weight-entry dialog." + }, + "journalComposeEnter": "กรอก", + "@journalComposeEnter": { + "description": "Weight row button label when no weight is entered yet." + }, + "journalComposeChange": "เปลี่ยน", + "@journalComposeChange": { + "description": "Weight row button label when a weight is already entered." + }, + "journalComposeSeeWeightTrend": "ดูแนวโน้มน้ำหนัก", + "@journalComposeSeeWeightTrend": { + "description": "Accessibility label for the link to the weight trend screen." + }, + "journalComposeSeeTheTrend": "ดูแนวโน้ม", + "@journalComposeSeeTheTrend": { + "description": "Link text to the weight trend screen." + }, + "journalComposeWeightToday": "น้ำหนักวันนี้", + "@journalComposeWeightToday": { + "description": "Title of the dialog for entering today's weight." + }, + "journalComposeWeightKgLabel": "น้ำหนัก (กก.)", + "@journalComposeWeightKgLabel": { + "description": "Fallback text-field label for weight in kilograms when no units controller is available." + }, + "journalComposeWeightScaleNote": "ค่าที่คุณหรือเครื่องชั่งอ่านได้ สายรัดไม่ได้วัดค่านี้", + "@journalComposeWeightScaleNote": { + "description": "Note in the weight-entry dialog clarifying the band does not measure weight." + }, + "journalComposeClear": "ล้าง", + "@journalComposeClear": { + "description": "Button to clear today's weight entry." + }, + "journalComposeNotEnoughEntriesTitle": "ข้อมูลยังไม่พอแสดงแนวโน้ม", + "@journalComposeNotEnoughEntriesTitle": { + "description": "Empty-state title on the weight trend screen when fewer than two entries exist." + }, + "journalComposeNotEnoughEntriesBody": "เส้นกราฟคือค่าเฉลี่ยเจ็ดวันจากข้อมูลที่คุณกรอก จึงต้องมีอย่างน้อยสองวัน ไม่มีการเติมค่าระหว่างวัน", + "@journalComposeNotEnoughEntriesBody": { + "description": "Empty-state body explaining the weight trend needs at least two entries." + }, + "journalComposeSevenDayTrend": "แนวโน้มเจ็ดวัน", + "@journalComposeSevenDayTrend": { + "description": "Title of the weight trend chart." + }, + "journalComposeTrendFootnote": "คุณกรอกเอง วันที่ไม่มีข้อมูลจะเว้นว่าง", + "@journalComposeTrendFootnote": { + "description": "Footnote under the weight trend chart." + }, + "journalComposeWeightTrendExplainer": "จากคุณหรือเครื่องชั่ง สายรัดไม่ได้วัดน้ำหนัก เส้นคือค่าเฉลี่ย 7 วัน เพราะน้ำและอาหารเพียงอย่างเดียวทำให้น้ำหนักเปลี่ยนได้ 1–2 กก. {count, plural, other{กรอกแล้ว {count} วัน}}", + "@journalComposeWeightTrendExplainer": { + "description": "Closing explainer under the weight trend chart, ending in a count of days entered.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "nutritionTabToday": "วันนี้", + "@nutritionTabToday": { + "description": "Nutrition screen: sub-tab label for today's log" + }, + "nutritionTabWeek": "สัปดาห์", + "@nutritionTabWeek": { + "description": "Nutrition screen: sub-tab label for the weekly view" + }, + "nutritionTabGoals": "เป้าหมาย", + "@nutritionTabGoals": { + "description": "Nutrition screen: sub-tab label for nutrition goals" + }, + "nutritionLogFood": "บันทึกอาหาร", + "@nutritionLogFood": { + "description": "Nutrition screen: semantic label on the add-food button in the title row" + }, + "nutritionTitle": "โภชนาการ", + "@nutritionTitle": { + "description": "Nutrition screen title" + }, + "nutritionEmptyTodayTitle": "วันนี้ยังไม่ได้บันทึก", + "@nutritionEmptyTodayTitle": { + "description": "Nutrition Today tab: title when nothing has been logged today" + }, + "nutritionEmptyTodayBody": "แตะครั้งเดียวก็นับเป็นบันทึกที่สมบูรณ์", + "@nutritionEmptyTodayBody": { + "description": "Nutrition Today tab: body text under the empty-today title" + }, + "nutritionLogOccasionFix": "บันทึกการกินหนึ่งครั้ง", + "@nutritionLogOccasionFix": { + "description": "Nutrition screen: call-to-action button text to log an eating occasion (used in two empty/low-data states)" + }, + "nutritionOccasionsSection": "ครั้งที่กิน", + "@nutritionOccasionsSection": { + "description": "Nutrition Today tab: section header above the meal rows" + }, + "nutritionAddAction": "เพิ่ม", + "@nutritionAddAction": { + "description": "Nutrition Today tab: 'Add' action link on the Occasions section header" + }, + "nutritionFloorTitle": "พลังงานวันนี้เป็นค่าขั้นต่ำ ไม่ใช่ยอดรวม", + "@nutritionFloorTitle": { + "description": "Nutrition Today tab: title warning that today's energy total is a lower bound" + }, + "nutritionFloorBody": "มี {unknown} จาก {total} ครั้งที่ไม่ระบุพลังงาน ตัวเลขด้านบนจึงเป็นอย่างน้อยที่คุณกิน ไม่ใช่ทั้งหมดที่กิน", + "@nutritionFloorBody": { + "description": "Nutrition Today tab: body explaining how many occasions lack an energy figure", + "placeholders": { + "unknown": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "nutritionAddNumbersFix": "เพิ่มตัวเลขในการกินหนึ่งครั้ง", + "@nutritionAddNumbersFix": { + "description": "Nutrition screen: call-to-action to add missing energy numbers to an occasion (used in two places)" + }, + "nutritionDaysNotCounted": "นับไม่ได้ {excluded} จาก {span} วันล่าสุด", + "@nutritionDaysNotCounted": { + "description": "Nutrition Today tab: observation noting how many of the last N days could not be counted in averages", + "placeholders": { + "excluded": { + "type": "int" + }, + "span": { + "type": "int" + } + } + }, + "nutritionDayCountsRule": "วันจะนับได้เมื่อการกินทุกครั้งระบุพลังงาน", + "@nutritionDayCountsRule": { + "description": "Nutrition Today tab: short rule explaining what makes a day count for averages" + }, + "nutritionDaysLoggedLabel": "วันที่มีบันทึก", + "@nutritionDaysLoggedLabel": { + "description": "Nutrition Week tab: consistency-card label when there are no partial days" + }, + "nutritionPartialExcluded": "บันทึกแล้ว {partial} วันแต่ข้อมูลไม่ครบ จึงไม่นับในค่าเฉลี่ยทั้งหมดด้านล่าง", + "@nutritionPartialExcluded": { + "description": "Nutrition Week tab: consistency-card label naming how many days were partial and excluded from averages", + "placeholders": { + "partial": { + "type": "int" + } + } + }, + "nutritionEnergyByDay": "พลังงานแต่ละวัน", + "@nutritionEnergyByDay": { + "description": "Nutrition Week tab: section header above the daily energy bar chart" + }, + "nutritionSevenDayAvg": "ค่าเฉลี่ยเจ็ดวัน", + "@nutritionSevenDayAvg": { + "description": "Nutrition Week tab: section header above the seven-day nutrient means" + }, + "nutritionNoCompleteDayTitle": "ยังไม่มีวันที่ข้อมูลครบให้เฉลี่ย", + "@nutritionNoCompleteDayTitle": { + "description": "Nutrition Week tab: title shown when there is no complete day yet to average" + }, + "nutritionNoCompleteDayBody": "คุณยังไม่มีวันที่ข้อมูลครบ", + "@nutritionNoCompleteDayBody": { + "description": "Nutrition Week tab: body text under the no-complete-day title" + }, + "nutritionLabelEnergy": "พลังงาน", + "@nutritionLabelEnergy": { + "description": "Nutrition Week tab: row label for the energy mean" + }, + "nutritionLabelProtein": "โปรตีน", + "@nutritionLabelProtein": { + "description": "Nutrition Week tab: row label for the protein mean" + }, + "nutritionLabelCarbs": "คาร์โบไฮเดรต", + "@nutritionLabelCarbs": { + "description": "Nutrition Week tab: row label for the carbs mean" + }, + "nutritionLabelFat": "ไขมัน", + "@nutritionLabelFat": { + "description": "Nutrition Week tab: row label for the fat mean" + }, + "nutritionLabelFibre": "ใยอาหาร", + "@nutritionLabelFibre": { + "description": "Nutrition Week tab: row label for the fibre mean" + }, + "nutritionEnergyBalance": "สมดุลพลังงาน", + "@nutritionEnergyBalance": { + "description": "Nutrition Week tab: section header above the eaten/burned/balance metrics" + }, + "nutritionLabelEaten": "กิน", + "@nutritionLabelEaten": { + "description": "Nutrition Week tab: all-caps inline metric label for energy eaten" + }, + "nutritionLabelBurned": "เผาผลาญ", + "@nutritionLabelBurned": { + "description": "Nutrition screen: all-caps inline metric label for energy burned (used in Week tab and Today card)" + }, + "nutritionLabelBalance": "สมดุล", + "@nutritionLabelBalance": { + "description": "Nutrition Week tab: all-caps inline metric label for the eaten-minus-burned balance" + }, + "nutritionEatenMeanNote": "พลังงานที่กินและเผาผลาญเป็นค่าเฉลี่ยของ {days} วันเดียวกันที่ข้อมูลครบ", + "@nutritionEatenMeanNote": { + "description": "Nutrition Week tab: footnote explaining eaten and burned are both means over the same N complete days", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "nutritionEnergyLoggedTitle": "พลังงานที่บันทึก", + "@nutritionEnergyLoggedTitle": { + "description": "Nutrition Week tab: chart title above the daily energy bars" + }, + "nutritionPartialFootnote": "ข้อมูลไม่ครบ {n} วัน จึงไม่นับในค่าเฉลี่ยด้านล่าง", + "@nutritionPartialFootnote": { + "description": "Nutrition Week tab: chart footnote naming how many partial days were left out of averages", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionNothingLoggedYet": "ยังไม่ได้บันทึกข้อมูล", + "@nutritionNothingLoggedYet": { + "description": "Nutrition Week tab: chart empty-state message when no days have been logged at all" + }, + "nutritionNoEnergyFiguresYet": "ยังไม่มีค่าพลังงาน", + "@nutritionNoEnergyFiguresYet": { + "description": "Nutrition Week tab: chart empty-state message when days are logged but none carry energy figures" + }, + "nutritionDailyEnergy": "พลังงานต่อวัน", + "@nutritionDailyEnergy": { + "description": "Nutrition Goals tab: name of the daily energy target" + }, + "nutritionDailyProtein": "โปรตีนต่อวัน", + "@nutritionDailyProtein": { + "description": "Nutrition Goals tab: name of the daily protein target" + }, + "nutritionEnergyWord": "พลังงาน", + "@nutritionEnergyWord": { + "description": "Nutrition Goals tab: bare noun for energy, used inside sentences (distinct from the 'Daily energy' label so word order/gender in other languages doesn't leak the label's adjective into the noun slot)" + }, + "nutritionProteinWord": "โปรตีน", + "@nutritionProteinWord": { + "description": "Nutrition Goals tab: bare noun for protein, used inside sentences (see nutritionEnergyWord)" + }, + "nutritionYourTargetsSection": "เป้าหมายของคุณ", + "@nutritionYourTargetsSection": { + "description": "Nutrition Goals tab: section header for the user's set targets, also the edit-targets sheet title" + }, + "nutritionHintNone": "ไม่มี", + "@nutritionHintNone": { + "description": "Nutrition Goals tab: placeholder hint text in the empty target number field" + }, + "nutritionNoTargetsTitle": "ยังไม่ได้ตั้งเป้าหมาย", + "@nutritionNoTargetsTitle": { + "description": "Nutrition Goals tab: title shown when the user has set no targets" + }, + "nutritionNoTargetsBody": "เป้าหมายที่นี่คือค่าที่คุณกรอกเอง", + "@nutritionNoTargetsBody": { + "description": "Nutrition Goals tab: body text under the no-targets title" + }, + "nutritionSetTargetFix": "ตั้งเป้าหมาย", + "@nutritionSetTargetFix": { + "description": "Nutrition Goals tab: call-to-action button to set a target" + }, + "nutritionEditAction": "แก้ไข", + "@nutritionEditAction": { + "description": "Nutrition Goals tab: 'Edit' action link on the Your Targets section header" + }, + "nutritionBodySpentToday": "พลังงานที่ร่างกายใช้วันนี้", + "@nutritionBodySpentToday": { + "description": "Nutrition Goals tab: heading over the estimated-expenditure card" + }, + "nutritionEstimatedExpenditure": "พลังงานที่ใช้โดยประมาณ", + "@nutritionEstimatedExpenditure": { + "description": "Nutrition Goals tab: metric row label for estimated calories burned" + }, + "nutritionNotMeasured": "ยังไม่ได้วัด", + "@nutritionNotMeasured": { + "description": "Nutrition Goals tab: value shown when estimated expenditure has no data" + }, + "nutritionExpenditureSub": "วันนี้ จากอัตราการเต้นหัวใจและโปรไฟล์ของคุณ", + "@nutritionExpenditureSub": { + "description": "Nutrition Goals tab: all-caps subtext explaining the expenditure figure's source" + }, + "nutritionRemoveTitle": "ลบ {label} หรือไม่?", + "@nutritionRemoveTitle": { + "description": "Nutrition screen: confirmation sheet title when removing a logged food entry", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "nutritionRemoveBody": "จะลบออกจากวันนี้และทุกค่าเฉลี่ยที่นับรายการนี้ ย้อนกลับไม่ได้", + "@nutritionRemoveBody": { + "description": "Nutrition screen: confirmation sheet body warning the removal cannot be undone" + }, + "nutritionSaveFailed": "ยังไม่บันทึก มื้ออาหารยังอยู่ที่นี่ โปรดลองอีกครั้ง", + "@nutritionSaveFailed": { + "description": "Log food sheet: snackbar when saving a meal fails; the sheet stays open with the input intact" + }, + "nutritionRemoveFailed": "ยังไม่ลบ มื้ออาหารยังอยู่ โปรดลองอีกครั้ง", + "@nutritionRemoveFailed": { + "description": "Log food sheet: snackbar when removing a meal fails after the user confirmed" + }, + "nutritionNothingToMeasure": "ยังไม่มีข้อมูลใช้เทียบ{label}", + "@nutritionNothingToMeasure": { + "description": "Nutrition Goals tab: title shown when a target has no mean to compare against yet", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "nutritionFloorAverageBody": "ทุกวันที่ข้อมูลครบมีการกินที่ไม่ระบุ{nutrient} ค่าเฉลี่ยจึงเป็นได้เพียงค่าขั้นต่ำ", + "@nutritionFloorAverageBody": { + "description": "Nutrition Goals tab: explanation that every complete day lacked this nutrient's figure", + "placeholders": { + "nutrient": { + "type": "String" + } + } + }, + "nutritionCountedNoFigureBody": "นับได้ {count} จาก {span} วันล่าสุด แต่ไม่มีวันใดระบุ{nutrient}", + "@nutritionCountedNoFigureBody": { + "description": "Nutrition Goals tab: explanation that counted days carried no figure for this nutrient", + "placeholders": { + "count": { + "type": "int" + }, + "span": { + "type": "int" + }, + "nutrient": { + "type": "String" + } + } + }, + "nutritionDayCountsRuleFull": "วันจะนับได้เมื่อการกินทุกครั้งระบุตัวเลขและบันทึกจนถึงตอนเย็น ยังไม่มีวันใดใน {span} วันล่าสุดที่ครบเงื่อนไข", + "@nutritionDayCountsRuleFull": { + "description": "Nutrition Goals tab: full rule explaining what makes a day count, when none of the recent days qualify", + "placeholders": { + "span": { + "type": "int" + } + } + }, + "nutritionOnTarget": "ตรงเป้าหมาย", + "@nutritionOnTarget": { + "description": "Nutrition Goals tab: goal-trajectory status text when the mean is within 1 unit of target" + }, + "nutritionRateAbove": "สูงกว่า {amount} {unit}/วัน", + "@nutritionRateAbove": { + "description": "Nutrition Goals tab: goal-trajectory rate text when the mean is above target", + "placeholders": { + "amount": { + "type": "int" + }, + "unit": { + "type": "String" + } + } + }, + "nutritionRateBelow": "ต่ำกว่า {amount} {unit}/วัน", + "@nutritionRateBelow": { + "description": "Nutrition Goals tab: goal-trajectory rate text when the mean is below target", + "placeholders": { + "amount": { + "type": "int" + }, + "unit": { + "type": "String" + } + } + }, + "nutritionMeanOfDays": "{n, plural, other{เฉลี่ยจาก {n} วันที่ข้อมูลครบ}}", + "@nutritionMeanOfDays": { + "description": "Nutrition Goals tab: goal-trajectory footnote naming how many complete days the mean covers", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionLoggedToday": "บันทึกวันนี้", + "@nutritionLoggedToday": { + "description": "Nutrition Today card: all-caps header when no energy figure exists, only an occasion count" + }, + "nutritionEatenToday": "กินวันนี้", + "@nutritionEatenToday": { + "description": "Nutrition Today card: all-caps header when an energy figure exists" + }, + "nutritionAtLeast": "อย่างน้อย", + "@nutritionAtLeast": { + "description": "Nutrition Today card: pill label shown when the energy total is a floor, not an exact total" + }, + "nutritionOccasionsUnit": "{n, plural, other{ครั้ง}}", + "@nutritionOccasionsUnit": { + "description": "Nutrition Today card: unit word next to the raw occasion count when no energy figure exists", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionOccasionsCount": "{n, plural, other{{n} ครั้ง}}", + "@nutritionOccasionsCount": { + "description": "Nutrition Today card: '· N occasions' note shown alongside the energy total", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionLabelBalanceAtLeast": "สมดุลอย่างน้อย", + "@nutritionLabelBalanceAtLeast": { + "description": "Nutrition Today card: all-caps inline metric label for the balance when eaten is only a floor" + }, + "nutritionNotLogged": "ยังไม่ได้บันทึก", + "@nutritionNotLogged": { + "description": "Nutrition screen: 'Not logged' status text (used for a meal row and for the water row)" + }, + "nutritionLoggedNoEnergy": "บันทึกแล้ว {n} ครั้ง · ไม่ได้ระบุพลังงาน", + "@nutritionLoggedNoEnergy": { + "description": "Nutrition meal row: status text when entries exist but none carry an energy figure", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionAtLeastPrefix": "อย่างน้อย ", + "@nutritionAtLeastPrefix": { + "description": "Nutrition meal row: lowercase prefix shown before a kcal total that is a floor, not exact (includes trailing space)" + }, + "nutritionMealBreakfast": "มื้อเช้า", + "@nutritionMealBreakfast": { + "description": "Nutrition screen: meal occasion name, breakfast" + }, + "nutritionMealLunch": "มื้อกลางวัน", + "@nutritionMealLunch": { + "description": "Nutrition screen: meal occasion name, lunch" + }, + "nutritionMealDinner": "มื้อเย็น", + "@nutritionMealDinner": { + "description": "Nutrition screen: meal occasion name, dinner" + }, + "nutritionMealSnacks": "ของว่าง", + "@nutritionMealSnacks": { + "description": "Nutrition screen: meal occasion name, snacks (catch-all bucket)" + }, + "nutritionNotCounted": "ไม่นับ", + "@nutritionNotCounted": { + "description": "Nutrition Week tab: nutrient mean value when the mean could not be counted at all" + }, + "nutritionNotRecorded": "ไม่ได้บันทึก", + "@nutritionNotRecorded": { + "description": "Nutrition Week tab: nutrient mean value when no complete day recorded this nutrient" + }, + "nutritionEveryDayNoFigure": "ทุกวันที่ข้อมูลครบมีการกินที่ไม่ระบุ{label}", + "@nutritionEveryDayNoFigure": { + "description": "Nutrition Week tab: all-caps subtext when every complete day lacked this nutrient's figure", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "nutritionNoDayRecorded": "ไม่มีวันที่ข้อมูลครบใดระบุ{label}", + "@nutritionNoDayRecorded": { + "description": "Nutrition Week tab: all-caps subtext when no complete day recorded this nutrient", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "nutritionMeanOfCompleteDaysCaps": "{n, plural, other{เฉลี่ยจาก {n} วันที่ข้อมูลครบ}}", + "@nutritionMeanOfCompleteDaysCaps": { + "description": "Nutrition Week tab: all-caps subtext naming how many complete days the nutrient mean covers", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionLeftOutAsFloor": " · ไม่นับ {n} วันเพราะเป็นเพียงค่าขั้นต่ำ", + "@nutritionLeftOutAsFloor": { + "description": "Nutrition Week tab: all-caps suffix appended to the mean subtext naming how many days were left out as floors (includes leading ' · ')", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "nutritionWaterLabel": "น้ำ", + "@nutritionWaterLabel": { + "description": "Nutrition Today tab: label on the water tracking row" + }, + "nutritionTapToChange": "แตะ − หรือ + เพื่อปรับ", + "@nutritionTapToChange": { + "description": "Nutrition Today tab: hint under the water label once a value is logged" + }, + "nutritionNoneYet": "ยังไม่มี", + "@nutritionNoneYet": { + "description": "Nutrition Today tab: water amount text when nothing is logged yet" + }, + "nutritionAddWater": "เพิ่มน้ำ", + "@nutritionAddWater": { + "description": "Nutrition Today tab: semantic label on the water plus-step button" + }, + "nutritionRemoveWater": "ลดน้ำ", + "@nutritionRemoveWater": { + "description": "Nutrition Today tab: semantic label on the water minus-step button" + }, + "coachApiFormatHelp": "เลือก API ที่ปลายทางรองรับ Responses รองรับการให้เหตุผลของ OpenAI พร้อมเครื่องมือ", + "@coachApiFormatHelp": { + "description": "Coach AI settings: helper text under the provider API format dropdown (Responses / Chat Completions are API names, keep untranslated)" + }, + "coachApiFormatLabel": "API", + "@coachApiFormatLabel": { + "description": "Coach AI settings: label for the provider API format dropdown" + }, + "coachApiKeyLabel": "คีย์ API", + "@coachApiKeyLabel": { + "description": "Coach AI settings: text field label for a cloud provider's API key" + }, + "coachApiKeyLocalLabel": "คีย์ API (ไม่จำเป็นสำหรับการใช้ในเครื่อง)", + "@coachApiKeyLocalLabel": { + "description": "Coach AI settings: text field label for the API key field when a local provider is selected" + }, + "coachAsking": "กำลังถาม…", + "@coachAsking": { + "description": "Coach AI settings: button label while models are being fetched" + }, + "coachAskLabel": "ถามโค้ช", + "@coachAskLabel": { + "description": "Coach screen: semantic label on the chat input text field" + }, + "coachBaseUrlLabel": "URL หลัก", + "@coachBaseUrlLabel": { + "description": "Coach AI settings: text field label for the provider base URL" + }, + "coachBriefingMenuSub": "ข้อมูลชุดเดียวกับที่ส่งออกจากอุปกรณ์นี้", + "@coachBriefingMenuSub": { + "description": "Coach screen: subtitle on the menu row that opens the AI briefing detail" + }, + "coachBriefingMenuTitle": "สรุปและข้อมูลที่ส่ง", + "@coachBriefingMenuTitle": { + "description": "Coach screen: menu row title that opens the briefing and what-was-sent detail" + }, + "coachChooseModelFix": "เลือกโมเดล", + "@coachChooseModelFix": { + "description": "Coach screen: call-to-action button to open AI setup when no model is configured" + }, + "coachCloudDataNote": "คำถามของคุณและแถวข้อมูลที่โค้ชอ่านจะถูกส่งไปยังปลายทางนี้ ดูข้อมูลที่ส่งจริงได้ใน “ข้อมูลที่ส่ง”", + "@coachCloudDataNote": { + "description": "Coach AI settings: privacy note shown when a cloud provider is selected" + }, + "coachDeleteChat": "ลบ {title}", + "@coachDeleteChat": { + "description": "Coach screen: semantic label on the delete-chat icon in the past-chats menu list", + "placeholders": { + "title": { + "type": "String" + } + } + }, + "coachDeleteIt": "ลบ", + "@coachDeleteIt": { + "description": "Coach screen: confirm-dialog button text for a destructive write action" + }, + "coachDestructiveWarning": "จะลบข้อมูลออกจากอุปกรณ์นี้และย้อนกลับไม่ได้", + "@coachDestructiveWarning": { + "description": "Coach screen: confirm-dialog warning text for a destructive write action" + }, + "coachEndpointUnreachable": "ติดต่อปลายทางนั้นไม่ได้: {error}", + "@coachEndpointUnreachable": { + "description": "Coach AI settings: error message when fetching models from the endpoint fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "coachErrorTitle": "ส่งคำขอไม่สำเร็จ", + "@coachErrorTitle": { + "description": "Coach screen: title on a chat bubble reporting that a tool call failed" + }, + "coachInputHint": "ถามเกี่ยวกับสุขภาพของคุณ…", + "@coachInputHint": { + "description": "Coach screen: placeholder text in the empty chat input field" + }, + "coachIntroBody": "ถามเกี่ยวกับสิ่งที่แอปวัดได้ และให้ช่วยบันทึกอาหาร น้ำ การออกกำลังกาย ยาที่ใช้ และความรู้สึก โดยจะถามก่อนเสมอ", + "@coachIntroBody": { + "description": "Coach screen: intro paragraph shown in the empty-chat welcome card" + }, + "coachKeychainRefused": "พวงกุญแจปฏิเสธคีย์: {error}", + "@coachKeychainRefused": { + "description": "Coach AI settings: error message when the keychain refuses to save the API key", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "coachKeyStillSavedBody": "ครั้งนี้อ่านคีย์จากพวงกุญแจไม่ได้ ซึ่งอาจเกิดขึ้นเมื่อระบบเรียกแอปทำงานขณะโทรศัพท์ล็อกอยู่", + "@coachKeyStillSavedBody": { + "description": "Coach screen: body text explaining why the saved API key could not be read this time" + }, + "coachKeyStillSavedTitle": "คีย์ของคุณยังถูกเก็บไว้", + "@coachKeyStillSavedTitle": { + "description": "Coach screen: title shown when the API key exists but could not be read from the keychain" + }, + "coachListModels": "แสดงรายการโมเดล", + "@coachListModels": { + "description": "Coach AI settings: button label to fetch the list of available models" + }, + "coachLocalDataNote": "คำถามของคุณและแถวข้อมูลที่โค้ชอ่านจะอยู่บนเครื่องของคุณเอง", + "@coachLocalDataNote": { + "description": "Coach AI settings: privacy note shown when a local provider is selected" + }, + "coachLocalSub": "บนเครือข่ายนี้ ไม่มีข้อมูลออกจากเครื่องของคุณ", + "@coachLocalSub": { + "description": "Coach AI settings: subtitle shown under local provider presets (Ollama, LM Studio)" + }, + "coachMenuSemantic": "แชตและการตั้งค่า AI", + "@coachMenuSemantic": { + "description": "Coach screen: semantic label on the top-right menu button (chats and AI settings)" + }, + "coachModelHint": "ค้นหาหรือพิมพ์รหัสโมเดล", + "@coachModelHint": { + "description": "Coach AI settings: placeholder hint in the model search field" + }, + "coachModelSelected": "กำลังบันทึกโมเดล: {model}", + "@coachModelSelected": { + "description": "Coach AI settings: line under the model field naming the model Save will store when nothing is typed", + "placeholders": { + "model": { + "type": "String" + } + } + }, + "coachModelLabel": "โมเดล", + "@coachModelLabel": { + "description": "Coach AI settings: text field label for searching or typing a model id" + }, + "coachModelsFound": "{n, plural, other{พบ {n} โมเดล แตะเพื่อเลือก}}", + "@coachModelsFound": { + "description": "Coach AI settings: status message after fetching the model list, showing how many were found", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "coachNavTitle": "โค้ช", + "@coachNavTitle": { + "description": "Coach screen: nav bar title" + }, + "coachNewChat": "แชตใหม่", + "@coachNewChat": { + "description": "Coach screen: menu row to start a new chat" + }, + "coachNoChatsYet": "ยังไม่มีข้อมูล นี่คือบทสนทนาแรกของคุณ", + "@coachNoChatsYet": { + "description": "Coach screen: message in the past-chats menu list when there is no chat history yet" + }, + "coachNoDataBody": "โค้ชตอบจากข้อมูลรายวันที่คำนวณคะแนนแล้ว แต่โทรศัพท์เครื่องนี้ยังไม่มี สวมสายรัดขณะนอนแล้วซิงค์ตอนเช้า", + "@coachNoDataBody": { + "description": "Coach screen: body text explaining there is no derived data on this device yet" + }, + "coachNoDataTitle": "ยังไม่มีข้อมูลให้อ่าน", + "@coachNoDataTitle": { + "description": "Coach screen: title shown when the coach is configured but there is no data to read yet" + }, + "coachNoModelsListed": "ปลายทางนั้นไม่แสดงโมเดล โปรดพิมพ์ชื่อด้านล่างแทน", + "@coachNoModelsListed": { + "description": "Coach AI settings: status message when the endpoint returned zero models" + }, + "coachNotSetUp": "ยังไม่ได้ตั้งค่า", + "@coachNotSetUp": { + "description": "Coach screen: subtitle shown wherever the coach has no model configured yet" + }, + "coachNotSetUpBody": "เลือกโมเดลบนคอมพิวเตอร์ของคุณ หรือผู้ให้บริการที่รองรับ OpenAI โดยใช้คีย์ของคุณเอง ทั้งสองแบบไม่ส่งข้อมูลผ่าน OpenStrap", + "@coachNotSetUpBody": { + "description": "Coach screen: body text explaining how to set up the coach and its privacy stance" + }, + "coachNotSetUpTitle": "ยังไม่ได้ตั้งค่าโค้ช", + "@coachNotSetUpTitle": { + "description": "Coach screen: title shown when the coach has not been set up" + }, + "coachPastChats": "แชตที่ผ่านมา", + "@coachPastChats": { + "description": "Coach screen: all-caps section header above the list of past chat sessions" + }, + "coachPickModelFirst": "เลือกหรือพิมพ์ชื่อโมเดลก่อน", + "@coachPickModelFirst": { + "description": "Coach AI settings: validation message when saving without a chosen model" + }, + "coachSafeWarning": "จะยังไม่บันทึกจนกว่าคุณจะแตะด้านล่าง", + "@coachSafeWarning": { + "description": "Coach screen: confirm-dialog reassurance text for a non-destructive write action" + }, + "coachSaveIt": "บันทึก", + "@coachSaveIt": { + "description": "Coach screen: confirm-dialog button text for a non-destructive write action" + }, + "coachSendLabel": "ส่ง", + "@coachSendLabel": { + "description": "Coach screen: semantic label on the send-message button" + }, + "coachSetupNavSub": "ใช้โมเดลของคุณเอง", + "@coachSetupNavSub": { + "description": "Coach AI settings: nav bar subtitle" + }, + "coachSetupNavTitle": "การตั้งค่า AI", + "@coachSetupNavTitle": { + "description": "Coach AI settings: nav bar title" + }, + "coachSomethingWrong": "เกิดข้อผิดพลาด: {error}", + "@coachSomethingWrong": { + "description": "Coach screen: generic error message shown in a chat bubble for an unexpected exception", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "coachStarterAteYesterday": "เมื่อวานฉันกินอะไรบ้าง?", + "@coachStarterAteYesterday": { + "description": "Coach screen: example starter prompt about what was eaten yesterday" + }, + "coachStarterHrvChart": "แสดงกราฟ HRV ของฉันในเดือนที่ผ่านมา", + "@coachStarterHrvChart": { + "description": "Coach screen: example starter prompt to chart HRV over the last month" + }, + "coachStarterLogRun": "เช้านี้ฉันวิ่ง 40 นาที ช่วยบันทึกให้หน่อย", + "@coachStarterLogRun": { + "description": "Coach screen: example starter prompt to log a run" + }, + "coachStarterLogWater": "บันทึกน้ำ 500 มล. สำหรับวันนี้", + "@coachStarterLogWater": { + "description": "Coach screen: example starter prompt to log water intake" + }, + "coachStarterRecovery": "วันนี้ฉันฟื้นตัวแค่ไหน เพราะอะไร?", + "@coachStarterRecovery": { + "description": "Coach screen: example starter prompt about today's recovery" + }, + "coachStarterSleep": "สัปดาห์นี้ฉันนอนเป็นอย่างไรบ้าง?", + "@coachStarterSleep": { + "description": "Coach screen: example starter prompt about this week's sleep" + }, + "coachTryAgainFix": "ลองอีกครั้ง", + "@coachTryAgainFix": { + "description": "Coach screen: retry button when the saved API key could not be read" + }, + "coachTryAsking": "ลองถาม", + "@coachTryAsking": { + "description": "Coach screen: section header above the list of example starter prompts" + }, + "coachUntitledChat": "แชตไม่มีชื่อ", + "@coachUntitledChat": { + "description": "Coach screen: fallback title for a past chat session with no generated title" + }, + "coachWhereModelRuns": "ตำแหน่งที่โมเดลทำงาน", + "@coachWhereModelRuns": { + "description": "Coach AI settings: section header above the provider preset list" + }, + "coachYourDataYourModel": "ข้อมูลของคุณ โมเดลของคุณ", + "@coachYourDataYourModel": { + "description": "Coach screen: all-caps headline in the empty-chat welcome card" + }, + "investigateNerdStatsLabel": "สถิติเชิงลึก", + "@investigateNerdStatsLabel": { + "description": "Subtitle on the Investigate (nerd stats) screen header" + }, + "investigateProvenanceLabel": "ที่มาของข้อมูล", + "@investigateProvenanceLabel": { + "description": "Table title: where this day's data came from" + }, + "investigateDayLabel": "วัน", + "@investigateDayLabel": { + "description": "Provenance table row label: the derived day" + }, + "investigateCoverageLabel": "ความครอบคลุม", + "@investigateCoverageLabel": { + "description": "Provenance table row label: wear coverage percent" + }, + "investigateSleepWindowLabel": "ช่วงเวลานอน", + "@investigateSleepWindowLabel": { + "description": "Provenance table row label: sleep window times" + }, + "investigateSourceLabel": "แหล่งข้อมูล", + "@investigateSourceLabel": { + "description": "Provenance table row label: data source" + }, + "investigateSourceOnDevice": "สายรัดบันทึก · คำนวณบนโทรศัพท์นี้", + "@investigateSourceOnDevice": { + "description": "Provenance value: data derived on-device from band records" + }, + "investigateSourceImported": "นำเข้า · {source}", + "@investigateSourceImported": { + "description": "Provenance value: data imported from another source", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "investigateAlgoVersionLabel": "เวอร์ชันอัลกอริทึม", + "@investigateAlgoVersionLabel": { + "description": "Provenance table row label: algorithm version" + }, + "investigateWhatHappenedTitle": "วันนั้นเกิดอะไรขึ้น", + "@investigateWhatHappenedTitle": { + "description": "Link row title to the day timeline screen" + }, + "investigateWhatHappenedSub": "การนอน การออกกำลังกาย มื้ออาหาร และบันทึกตามลำดับเวลา", + "@investigateWhatHappenedSub": { + "description": "Link row subtitle describing the day timeline" + }, + "investigateWhichSensorCounted": "เซ็นเซอร์ที่นับ", + "@investigateWhichSensorCounted": { + "description": "Table title for step-source breakdown" + }, + "investigateStrapPedometer": "สายรัด · เครื่องนับก้าว 100 Hz", + "@investigateStrapPedometer": { + "description": "Step source row: strap's 100 Hz pedometer" + }, + "investigateStrapOnChipCounter": "สายรัด · ตัวนับในชิป", + "@investigateStrapOnChipCounter": { + "description": "Step source row: strap's on-chip step counter" + }, + "investigateStrapCounterFactor": "ตัวนับในชิป · ตัวคูณจากโทรศัพท์", + "@investigateStrapCounterFactor": { + "description": "Step source row: factor learned against the phone that scaled the on-chip counter" + }, + "investigatePhonePedometer": "โทรศัพท์ · เครื่องนับก้าว", + "@investigatePhonePedometer": { + "description": "Step source row: phone pedometer" + }, + "investigateDayTotal": "รวมทั้งวัน", + "@investigateDayTotal": { + "description": "Step source row: total steps for the day" + }, + "investigateStrapChipReported": "ชิปสายรัดรายงาน", + "@investigateStrapChipReported": { + "description": "Step source row: what the strap chip itself reported" + }, + "investigateTimeDomain": "โดเมนเวลา", + "@investigateTimeDomain": { + "description": "HRV table title: time-domain metrics" + }, + "investigateRmssd": "RMSSD", + "@investigateRmssd": { + "description": "HRV metric label: RMSSD (kept as scientific abbreviation)" + }, + "investigateRmssdNightly": "RMSSD รายคืน (เฉลี่ยช่วงละ 5 นาที)", + "@investigateRmssdNightly": { + "description": "HRV metric label: the nightly headline RMSSD, the mean of the RMSSDs of the sleep session's 5-minute windows (RMSSD kept as scientific abbreviation)" + }, + "investigateRmssdStored": "RMSSD รายคืน (ค่าประมาณแบบเดิม)", + "@investigateRmssdStored": { + "description": "HRV metric label: a nightly RMSSD stored by an earlier version of the app, computed by a method other than the 5-minute-window mean (RMSSD kept as scientific abbreviation)" + }, + "investigateSdnn": "SDNN", + "@investigateSdnn": { + "description": "HRV metric label: SDNN (kept as scientific abbreviation)" + }, + "investigateSdann": "SDANN", + "@investigateSdann": { + "description": "HRV metric label: SDANN (kept as scientific abbreviation)" + }, + "investigateSdnnIndex": "ดัชนี SDNN", + "@investigateSdnnIndex": { + "description": "HRV metric label: SDNN index" + }, + "investigatePnn50": "pNN50", + "@investigatePnn50": { + "description": "HRV metric label: pNN50 (kept as scientific abbreviation)" + }, + "investigateLnRmssd": "ln RMSSD", + "@investigateLnRmssd": { + "description": "HRV metric label: natural log of RMSSD" + }, + "investigateBaselineRmssd": "RMSSD ฐานของคุณ", + "@investigateBaselineRmssd": { + "description": "HRV metric label: the user's own baseline RMSSD" + }, + "investigateStabilityCv": "ความคงที่ (CV)", + "@investigateStabilityCv": { + "description": "HRV metric label: coefficient of variation stability" + }, + "investigateStressIndexTitle": "ดัชนีความเครียด", + "@investigateStressIndexTitle": { + "description": "Stress Nerd Stats table title: the Baevsky index behind the score" + }, + "investigateStressIndexSi": "ดัชนี (SI)", + "@investigateStressIndexSi": { + "description": "Stress Nerd Stats row: the Baevsky stress index for the night" + }, + "investigateStressLevel": "ระดับ", + "@investigateStressLevel": { + "description": "Stress Nerd Stats row: low / normal / elevated / high band of the index" + }, + "investigateStressScore": "คะแนน (0–100)", + "@investigateStressScore": { + "description": "Stress Nerd Stats row: the 0-100 score derived from the index" + }, + "investigateFrequencyDomain": "โดเมนความถี่", + "@investigateFrequencyDomain": { + "description": "HRV table title: frequency-domain metrics" + }, + "investigateUlfPower": "กำลังย่าน ULF", + "@investigateUlfPower": { + "description": "HRV metric label: ultra-low-frequency power" + }, + "investigateVlfPower": "กำลังย่าน VLF", + "@investigateVlfPower": { + "description": "HRV metric label: very-low-frequency power" + }, + "investigateLfPower": "กำลังย่าน LF", + "@investigateLfPower": { + "description": "HRV metric label: low-frequency power" + }, + "investigateHfPower": "กำลังย่าน HF", + "@investigateHfPower": { + "description": "HRV metric label: high-frequency power" + }, + "investigateTotalPower": "กำลังรวม", + "@investigateTotalPower": { + "description": "HRV metric label: total spectral power" + }, + "investigateLfHf": "LF / HF", + "@investigateLfHf": { + "description": "HRV metric label: LF/HF ratio" + }, + "investigateLfNormalised": "LF แบบปรับมาตรฐาน", + "@investigateLfNormalised": { + "description": "HRV metric label: normalised LF power" + }, + "investigateHfNormalised": "HF แบบปรับมาตรฐาน", + "@investigateHfNormalised": { + "description": "HRV metric label: normalised HF power" + }, + "investigateHfGated": "HF ถูกระงับตามเกณฑ์", + "@investigateHfGated": { + "description": "HRV metric label: whether HF power passed the artifact gate" + }, + "investigateYes": "ใช่", + "@investigateYes": { + "description": "Generic yes value for a nerd-stats table row" + }, + "investigateNo": "ไม่", + "@investigateNo": { + "description": "Generic no value for a nerd-stats table row" + }, + "investigateNoFrequencySpectrum": "ไม่มีสเปกตรัมโดเมนความถี่ของคืนนี้", + "@investigateNoFrequencySpectrum": { + "description": "Status card title: no frequency-domain spectrum available" + }, + "investigateRecordingTooShort": "บันทึกสั้นเกินกว่าจะแยกย่านความถี่ได้", + "@investigateRecordingTooShort": { + "description": "Status card fallback body: recording too short for spectrum" + }, + "investigateNonLinear": "ไม่เชิงเส้น", + "@investigateNonLinear": { + "description": "HRV table title: non-linear metrics" + }, + "investigateSd1Sleep": "SD1 ขณะนอน", + "@investigateSd1Sleep": { + "description": "HRV metric label: Poincare SD1 during sleep window" + }, + "investigateSd2Sleep": "SD2 ขณะนอน", + "@investigateSd2Sleep": { + "description": "HRV metric label: Poincare SD2 during sleep window" + }, + "investigateSd124h": "SD1 ใน 24 ชม.", + "@investigateSd124h": { + "description": "HRV metric label: Poincare SD1 over 24 hours" + }, + "investigateSd224h": "SD2 ใน 24 ชม.", + "@investigateSd224h": { + "description": "HRV metric label: Poincare SD2 over 24 hours" + }, + "investigateSd1Sd224h": "SD1 / SD2 ใน 24 ชม.", + "@investigateSd1Sd224h": { + "description": "HRV metric label: SD1/SD2 ratio over 24 hours" + }, + "investigateSuccessiveIntervalsOver70ms": "ช่วงติดกันที่ต่างเกิน 70 ms", + "@investigateSuccessiveIntervalsOver70ms": { + "description": "HRV metric label: percent of successive beat intervals differing by over 70 ms" + }, + "investigateIrregularRhythmFlagSleep": "สัญญาณจังหวะหัวใจไม่สม่ำเสมอ ขณะนอน", + "@investigateIrregularRhythmFlagSleep": { + "description": "HRV metric label: irregular-rhythm flag during sleep" + }, + "investigateIrregularRhythmFlag24h": "สัญญาณจังหวะหัวใจไม่สม่ำเสมอ ใน 24 ชม.", + "@investigateIrregularRhythmFlag24h": { + "description": "HRV metric label: irregular-rhythm flag over 24 hours" + }, + "investigateFlagRaised": "พบสัญญาณ", + "@investigateFlagRaised": { + "description": "Value shown when the irregular-rhythm flag was raised" + }, + "investigateFlagClear": "ไม่พบสัญญาณ", + "@investigateFlagClear": { + "description": "Value shown when the irregular-rhythm flag was clear" + }, + "investigateDecelerationCapacity": "ความสามารถในการชะลออัตราการเต้นหัวใจ", + "@investigateDecelerationCapacity": { + "description": "HRV metric label / chart title: deceleration capacity" + }, + "investigateAccelerationCapacity": "ความสามารถในการเร่งอัตราการเต้นหัวใจ", + "@investigateAccelerationCapacity": { + "description": "HRV metric label: acceleration capacity" + }, + "investigateDcAnchors": "จุดอ้างอิง DC", + "@investigateDcAnchors": { + "description": "HRV metric label: number of deceleration-capacity anchor points" + }, + "investigateSignalQuality": "คุณภาพสัญญาณ", + "@investigateSignalQuality": { + "description": "HRV table title: signal quality metrics" + }, + "investigateBeatsAnalysed": "จังหวะที่วิเคราะห์", + "@investigateBeatsAnalysed": { + "description": "Signal quality row: beats analysed" + }, + "investigateBeatsAnalysed24h": "จังหวะที่วิเคราะห์ใน 24 ชม.", + "@investigateBeatsAnalysed24h": { + "description": "Signal quality row: beats analysed over 24 hours" + }, + "investigateNoShapeForNight": "ไม่มีรูปแบบของคืนนี้", + "@investigateNoShapeForNight": { + "description": "Status card title: no night-shape data available" + }, + "investigateTooFewBeatsToBin": "คืนนี้มีจังหวะคุณภาพดีน้อยเกินกว่าจะแบ่งช่วง", + "@investigateTooFewBeatsToBin": { + "description": "Status card fallback body: too few beats to bin the night" + }, + "investigateNightShape": "รูปแบบตลอดคืน", + "@investigateNightShape": { + "description": "Table title: night-shape summary stats" + }, + "investigateBinWidth": "ความกว้างช่วง", + "@investigateBinWidth": { + "description": "Night-shape row: minutes per bin" + }, + "investigateBinsRead": "จำนวนช่วงที่อ่าน", + "@investigateBinsRead": { + "description": "Night-shape row: bins with readable data" + }, + "investigateFirstThird": "หนึ่งในสามแรก", + "@investigateFirstThird": { + "description": "Night-shape row: RMSSD in the first third of the night" + }, + "investigateLastThird": "หนึ่งในสามท้าย", + "@investigateLastThird": { + "description": "Night-shape row: RMSSD in the last third of the night" + }, + "investigateLastThirdOverFirst": "หนึ่งในสามท้าย ÷ หนึ่งในสามแรก", + "@investigateLastThirdOverFirst": { + "description": "Night-shape row: ratio of last third to first third" + }, + "investigateIrregularRhythmScreen": "คัดกรองจังหวะหัวใจไม่สม่ำเสมอ", + "@investigateIrregularRhythmScreen": { + "description": "Chart title: irregular-rhythm screening heat map" + }, + "investigateOneSquarePerDay": "หนึ่งช่องต่อวัน", + "@investigateOneSquarePerDay": { + "description": "Chart unit label: one square per day" + }, + "investigate12WeeksAgo": "12 สัปดาห์ที่แล้ว", + "@investigate12WeeksAgo": { + "description": "Chart x-axis label: 12 weeks before today" + }, + "investigateThisWeek": "สัปดาห์นี้", + "@investigateThisWeek": { + "description": "Chart x-axis label: this week" + }, + "investigateScreenRan": "คัดกรองแล้ว", + "@investigateScreenRan": { + "description": "Chart legend label: day the irregular-rhythm screen ran" + }, + "investigateRhythmStripFootnote": "คัดกรอง {ran} {ran, plural, other{วัน}} พบสัญญาณเตือน {raised} วัน ช่องที่มีแต่เส้นขอบคือวันที่ไม่ได้คัดกรอง แถบที่ไม่พบสัญญาณเตือนไม่ใช่ผลลบ นี่คือการคัดกรองจากช่วงเวลาชีพจร แยกจังหวะเต้นแทรก จังหวะที่ขาดหาย และการขยับสายรัดบนข้อมือออกจากกันไม่ได้", + "@investigateRhythmStripFootnote": { + "description": "Footnote summarising how many days the irregular-rhythm screen ran and flagged", + "placeholders": { + "ran": { + "type": "int" + }, + "raised": { + "type": "int" + } + } + }, + "investigateNoRestingBreathingRate": "ไม่มีอัตราการหายใจขณะพักนอกช่วงนอน", + "@investigateNoRestingBreathingRate": { + "description": "Status card title: no resting breathing rate outside sleep" + }, + "investigateNoRestingBreathingRateBody": "อ่านการหายใจจากช่วงละสามนาทีที่สายรัดพบว่าคุณแทบไม่เคลื่อนไหว นอกช่วงนอน หลายวันไม่มีช่วงเช่นนี้ วันที่ไม่มีหมายถึงคุณเคลื่อนไหว ไม่ใช่มีสิ่งผิดปกติ", + "@investigateNoRestingBreathingRateBody": { + "description": "Status card body explaining resting breathing rate requires stillness" + }, + "investigateBreathingAtRestAwake": "การหายใจขณะพักและตื่นอยู่", + "@investigateBreathingAtRestAwake": { + "description": "Table title: resting breathing rate while awake" + }, + "investigateStillStretchesOutsideSleep": "ช่วงอยู่นิ่งนอกเวลานอน", + "@investigateStillStretchesOutsideSleep": { + "description": "Table row: count of still stretches found outside sleep" + }, + "investigateLowest": "ต่ำสุด", + "@investigateLowest": { + "description": "Table row: lowest resting breathing rate reading" + }, + "investigateNextLowest": "ต่ำรองลงมา", + "@investigateNextLowest": { + "description": "Table row: second-lowest resting breathing rate reading" + }, + "investigateHighestOfThem": "สูงสุดในกลุ่ม", + "@investigateHighestOfThem": { + "description": "Table row: highest of the still-stretch readings" + }, + "investigateFloorNotRateBody": "เป็นค่าต่ำสุด ไม่ใช่อัตราของทั้งวัน อ่านได้เฉพาะช่วงที่แทบไม่เคลื่อนไหว จึงเป็นเพียงไม่กี่นาทีที่นิ่งที่สุดนอกเวลานอน ไม่ได้อธิบายเวลาที่เหลือของวัน และไม่สามารถหาอัตราการหายใจขณะเคลื่อนไหวจากช่วงเวลาจังหวะหัวใจได้", + "@investigateFloorNotRateBody": { + "description": "Explanatory paragraph: resting breathing rate is a floor, not a daily average" + }, + "investigateCycleScreenDidNotRun": "คืนนี้ไม่ได้คัดกรองรูปแบบเป็นรอบ", + "@investigateCycleScreenDidNotRun": { + "description": "Status card title: the heart-rate-cycling screen abstained for the night" + }, + "investigateNotEnoughCleanBeats": "มีจังหวะคุณภาพดีไม่พอให้คัดกรอง", + "@investigateNotEnoughCleanBeats": { + "description": "Status card fallback body: not enough clean beats to run the cycle screen" + }, + "investigateHeartRateCycles": "รอบการเปลี่ยนแปลงอัตราการเต้นหัวใจ", + "@investigateHeartRateCycles": { + "description": "Table title: heart-rate cycling stats for the night" + }, + "investigateCyclesCounted": "จำนวนรอบที่นับ", + "@investigateCyclesCounted": { + "description": "Table row: number of heart-rate cycles counted" + }, + "investigateObservedHoursAnalysed": "ชั่วโมงที่สังเกตและวิเคราะห์", + "@investigateObservedHoursAnalysed": { + "description": "Table row: hours of data analysed for cycling" + }, + "investigateCyclesPerObservedHour": "รอบต่อชั่วโมงที่สังเกต", + "@investigateCyclesPerObservedHour": { + "description": "Table row: cycles per observed hour" + }, + "investigateMeanCycleLength": "ความยาวรอบเฉลี่ย", + "@investigateMeanCycleLength": { + "description": "Table row: mean length of a heart-rate cycle" + }, + "investigateMeanDipDepth": "ขนาดการลดลงเฉลี่ย", + "@investigateMeanDipDepth": { + "description": "Table row: mean depth of the heart-rate dip per cycle" + }, + "investigateCycleLengthQuartiles": "ควอร์ไทล์ความยาวรอบ", + "@investigateCycleLengthQuartiles": { + "description": "Table row: quartiles of cycle length" + }, + "investigateDipDepthQuartiles": "ควอร์ไทล์ขนาดการลดลง", + "@investigateDipDepthQuartiles": { + "description": "Table row: quartiles of dip depth" + }, + "investigateNotEnoughNightsAcross": "จำนวนคืนยังไม่พอเปรียบเทียบข้ามคืน", + "@investigateNotEnoughNightsAcross": { + "description": "Status card title: not enough nights for the multi-night distribution view" + }, + "investigateNeedsSeveralNights": "ต้องมีหลายคืนที่แต่ละคืนมีข้อมูลที่สังเกตได้หลายชั่วโมง", + "@investigateNeedsSeveralNights": { + "description": "Status card fallback body: needs several qualifying nights" + }, + "investigateDroppedIrregular": "{count, plural, other{ไม่นับ {count} คืนเพราะพบสัญญาณเตือนจากการคัดกรองจังหวะหัวใจไม่สม่ำเสมอ}}", + "@investigateDroppedIrregular": { + "description": "Note listing nights excluded because the irregular-rhythm screen flagged them", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "investigateDroppedThin": "{count, plural, other{ไม่นับ {count} คืนเพราะมีชั่วโมงที่สังเกตได้น้อยเกินไป}}", + "@investigateDroppedThin": { + "description": "Note listing nights excluded for too few observed hours", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "investigateAcrossNOwnNights": "จากข้อมูลของคุณเอง {n} คืน", + "@investigateAcrossNOwnNights": { + "description": "Section header: summary across the user's own recent nights", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "investigateCvhrAboveUsual": "ในคืนล่าสุด ๆ รอบการเปลี่ยนแปลงอัตราการเต้นหัวใจที่การคัดกรองนี้นับได้สูงกว่าช่วง {n} คืนก่อนหน้า", + "@investigateCvhrAboveUsual": { + "description": "Sentence: recent heart-rate cycling is running above the user's own usual range", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "investigateCvhrInsideUsual": "ในคืนล่าสุด ๆ รอบการเปลี่ยนแปลงอัตราการเต้นหัวใจที่การคัดกรองนี้นับได้ยังอยู่ในช่วงของ {n} คืนก่อนหน้า", + "@investigateCvhrInsideUsual": { + "description": "Sentence: recent heart-rate cycling has stayed within the user's own usual range", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "investigateCvhrExplainer": "นี่คือรูปแบบชีพจร ไม่ใช่การวัดการหายใจ และไม่ใช่การตรวจวินิจฉัย รูปแบบเดียวกันเกิดได้จากจังหวะไม่สม่ำเสมอ การอยู่บนที่สูง และการนอนขาดช่วง ขณะที่ยาปิดกั้นเบตา เบาหวาน และภาวะทางระบบประสาทอาจทำให้รูปแบบราบลง จึงอาจไม่พบสิ่งใดแม้การหายใจผิดปกติจริง", + "@investigateCvhrExplainer": { + "description": "Paragraph explaining what heart-rate cycling is and is not a measure of" + }, + "investigateCvhrNotNegativeResult": "ดังนั้นการไม่พบสัญญาณไม่ใช่ผลลบหรือการยืนยันว่าปกติ และไม่ได้บอกข้อสรุปของคืนใดคืนหนึ่ง จำนวนรอบในคืนเดียวเปลี่ยนได้ด้วยหลายเหตุผล", + "@investigateCvhrNotNegativeResult": { + "description": "Paragraph clarifying this is not a negative clinical result" + }, + "investigateCvhrSeeClinicianIfSymptoms": "หากคุณกรน ตื่นแล้วยังไม่สดชื่น หรือมีคนเห็นว่าคุณหยุดหายใจขณะนอน แพทย์สามารถตรวจอย่างเหมาะสมได้", + "@investigateCvhrSeeClinicianIfSymptoms": { + "description": "Paragraph advising the user to see a clinician if they have relevant symptoms" + }, + "investigateStageMinutesAsCounted": "นาทีในแต่ละระยะตามที่นับได้", + "@investigateStageMinutesAsCounted": { + "description": "Table title: raw sleep-stage minute counts" + }, + "investigateLight": "หลับตื้น", + "@investigateLight": { + "description": "Sleep stage label: light sleep" + }, + "investigateDeep": "หลับลึก", + "@investigateDeep": { + "description": "Sleep stage label: deep sleep" + }, + "investigateRem": "REM", + "@investigateRem": { + "description": "Sleep stage label: REM sleep" + }, + "investigateAwake": "ตื่น", + "@investigateAwake": { + "description": "Sleep stage label: awake" + }, + "investigateTotalSleep": "เวลานอนรวม", + "@investigateTotalSleep": { + "description": "Table row: total sleep time" + }, + "investigateSegmentationConfidence": "ความเชื่อมั่นในการแบ่งช่วง", + "@investigateSegmentationConfidence": { + "description": "Table row: confidence of the sleep-stage segmentation" + }, + "investigateNotPublished": "ไม่ได้เผยแพร่", + "@investigateNotPublished": { + "description": "Value shown when segmentation confidence is not published" + }, + "investigateNothingComputedForKey": "ยังไม่ได้คำนวณค่าของ key นี้", + "@investigateNothingComputedForKey": { + "description": "Status card title: nothing computed for this metric key" + }, + "investigateNoStoredSeries": "ไม่มีชุดข้อมูลที่เก็บไว้", + "@investigateNoStoredSeries": { + "description": "Status card title: no stored data series for this metric" + }, + "investigateNothingStoredYet": "ยังไม่มีข้อมูล {metric} ที่เก็บไว้", + "@investigateNothingStoredYet": { + "description": "Status card body: nothing stored yet for this metric", + "placeholders": { + "metric": { + "type": "String" + } + } + }, + "investigateSeries": "ชุดข้อมูล", + "@investigateSeries": { + "description": "Table title: generic stored-series summary stats" + }, + "investigateDaysDerived": "วันที่คำนวณแล้ว", + "@investigateDaysDerived": { + "description": "Table row: number of derived days in the series" + }, + "investigateLatest": "ล่าสุด", + "@investigateLatest": { + "description": "Table row: latest value in the series" + }, + "investigateMean": "ค่าเฉลี่ย", + "@investigateMean": { + "description": "Table row: mean value of the series" + }, + "investigateMedian": "มัธยฐาน", + "@investigateMedian": { + "description": "Table row: median value of the series" + }, + "investigateSd": "SD", + "@investigateSd": { + "description": "Table row: standard deviation of the series" + }, + "investigateMin": "ต่ำสุด", + "@investigateMin": { + "description": "Table row: minimum value of the series" + }, + "investigateMax": "สูงสุด", + "@investigateMax": { + "description": "Table row: maximum value of the series" + }, + "investigateUnit": "หน่วย", + "@investigateUnit": { + "description": "Table row: unit of the series" + }, + "investigateUnitless": "ไม่มีหน่วย", + "@investigateUnitless": { + "description": "Value shown when the series has no unit" + }, + "investigateStorage": "พื้นที่จัดเก็บ", + "@investigateStorage": { + "description": "Table row: how the series is stored" + }, + "investigateOneValuePerDerivedDay": "หนึ่งค่าต่อวันที่คำนวณแล้ว", + "@investigateOneValuePerDerivedDay": { + "description": "Value: one stored value per derived day" + }, + "investigateMethodLabel": "วิธีคำนวณ", + "@investigateMethodLabel": { + "description": "Section header for the method/citation panel" + }, + "investigateNotDocumented": "ยังไม่มีคำอธิบาย", + "@investigateNotDocumented": { + "description": "Fallback text when the method is not documented" + }, + "calmBreathingResonanceLabel": "เรโซแนนซ์", + "@calmBreathingResonanceLabel": { + "description": "Pattern name for a custom-paced resonance breathing exercise" + }, + "calmBreathingResonanceDescription": "หายใจเข้าและออกเท่ากันประมาณ {rate} ครั้งต่อนาที เป็นรูปแบบที่มีคะแนนความสอดคล้อง", + "@calmBreathingResonanceDescription": { + "description": "Description of a custom-paced resonance breathing exercise", + "placeholders": { + "rate": { + "type": "String" + } + } + }, + "calmBreathingCloseBreathing": "ปิดการฝึกหายใจ", + "@calmBreathingCloseBreathing": { + "description": "Semantic label for the close button on the breathing screen" + }, + "calmBreathingFinishNow": "จบตอนนี้", + "@calmBreathingFinishNow": { + "description": "Button label to finish the post-session quiet window immediately" + }, + "calmBreathingStop": "หยุด", + "@calmBreathingStop": { + "description": "Button label to stop a breathing session or pre-window" + }, + "calmBreathingEndSession": "จบการฝึก", + "@calmBreathingEndSession": { + "description": "Button label to end an ordinary (non-sweep) breathing session" + }, + "calmBreathingBegin": "เริ่ม", + "@calmBreathingBegin": { + "description": "Button label to begin a breathing session" + }, + "calmBreathingTakeABreath": "หายใจสักครั้ง", + "@calmBreathingTakeABreath": { + "description": "Headline on the breathing setup screen" + }, + "calmBreathingRingLeads": "หายใจตามวงแหวน วางโทรศัพท์ลงได้", + "@calmBreathingRingLeads": { + "description": "Subtitle instructing the user to follow the breathing ring" + }, + "calmBreathingScoredPill": "มีคะแนน", + "@calmBreathingScoredPill": { + "description": "Pill label marking a pattern as coherence-scored" + }, + "calmBreathingHowLong": "นานเท่าไร", + "@calmBreathingHowLong": { + "description": "Section title for choosing session length" + }, + "calmBreathingMinutesSemantic": "{m, plural, other{{m} นาที}}", + "@calmBreathingMinutesSemantic": { + "description": "Semantic label for a minute-duration option button", + "placeholders": { + "m": { + "type": "int" + } + } + }, + "calmBreathingMinutesAbbrev": "{m} นาที", + "@calmBreathingMinutesAbbrev": { + "description": "Abbreviated minute label on a duration option button", + "placeholders": { + "m": { + "type": "int" + } + } + }, + "calmBreathingYourOwnPace": "จังหวะของคุณเอง", + "@calmBreathingYourOwnPace": { + "description": "Section title for the personal-pace sweep feature" + }, + "calmBreathingWindowRowSemantic": "วัดก่อนและหลัง เพิ่มเวลาอีกสี่นาที", + "@calmBreathingWindowRowSemantic": { + "description": "Semantic label for the before/after quiet-window toggle row" + }, + "calmBreathingMeasureBeforeAfter": "วัดก่อนและหลัง · เพิ่ม 4 นาที", + "@calmBreathingMeasureBeforeAfter": { + "description": "Row title for the before/after quiet-window toggle" + }, + "calmBreathingNeedsBandBeatTiming": "ต้องสวมสายรัด เพราะเปรียบเทียบจากช่วงเวลาระหว่างจังหวะหัวใจ", + "@calmBreathingNeedsBandBeatTiming": { + "description": "Body text explaining a feature needs the band connected for beat timing" + }, + "calmBreathingFindYourPace": "หาจังหวะที่หัวใจคุณตอบสนอง", + "@calmBreathingFindYourPace": { + "description": "Row title inviting the user to run the personal-pace sweep" + }, + "calmBreathingSweepIntro": "หกนาที: {rates} ครั้งต่อนาที จังหวะละสองนาที ต้องทดลองสองครั้งแล้วได้ผลตรงกันจึงจะเปลี่ยนค่า", + "@calmBreathingSweepIntro": { + "description": "Body text describing the personal-pace sweep before it has ever run", + "placeholders": { + "rates": { + "type": "String" + } + } + }, + "calmBreathingSweepAgreed": "การทดลองสองครั้งตรงกันที่ {rate} ครั้งต่อนาที และเรโซแนนซ์ใช้จังหวะนี้แล้ว ทดลองซ้ำเพื่อตรวจสอบได้", + "@calmBreathingSweepAgreed": { + "description": "Body text describing the pace two sittings agreed on", + "placeholders": { + "rate": { + "type": "String" + } + } + }, + "calmBreathingPaceOfRate": "จังหวะ {block} จาก {total} · {rate} ครั้งต่อนาที", + "@calmBreathingPaceOfRate": { + "description": "Header shown during a sweep block naming its position and pace", + "placeholders": { + "block": { + "type": "int" + }, + "total": { + "type": "int" + }, + "rate": { + "type": "String" + } + } + }, + "calmBreathingOfClock": "จาก {clock}", + "@calmBreathingOfClock": { + "description": "Label showing the target duration next to the elapsed clock", + "placeholders": { + "clock": { + "type": "String" + } + } + }, + "calmBreathingNoScoreForSession": "ไม่มีคะแนนความสอดคล้องสำหรับการฝึกนี้", + "@calmBreathingNoScoreForSession": { + "description": "Status card / title: no coherence score for this session" + }, + "calmBreathingScoringNeedsBand": "คะแนนต้องใช้ช่วงเวลาจังหวะหัวใจจากสายรัด ขณะนี้ไม่ได้เชื่อมต่อ จึงช่วยนำจังหวะได้แต่จะไม่บันทึกครั้งนี้", + "@calmBreathingScoringNeedsBand": { + "description": "Status card body: scoring needs the band connected" + }, + "calmBreathingBeforeLabel": "ก่อน", + "@calmBreathingBeforeLabel": { + "description": "Header shown during the pre-session quiet window" + }, + "calmBreathingAfterLabel": "หลัง", + "@calmBreathingAfterLabel": { + "description": "Header shown during the post-session quiet window" + }, + "calmBreathingSitStill": "นั่งนิ่งสักครู่", + "@calmBreathingSitStill": { + "description": "Instruction during the pre-session quiet window" + }, + "calmBreathingStaySitting": "นั่งต่อไป", + "@calmBreathingStaySitting": { + "description": "Instruction during the post-session quiet window" + }, + "calmBreathingNothingPacingScored": "หายใจตามปกติของคุณ ไม่มีการนำจังหวะหรือให้คะแนน", + "@calmBreathingNothingPacingScored": { + "description": "Body text reassuring the quiet window is unpaced and unscored" + }, + "calmBreathingPatternNotScored": "ไม่ให้คะแนน {pattern} เรโซแนนซ์เป็นรูปแบบที่ใช้จังหวะตามที่คะแนนนี้ออกแบบมารองรับ", + "@calmBreathingPatternNotScored": { + "description": "Explanation that the current breathing pattern is not coherence-scored", + "placeholders": { + "pattern": { + "type": "String" + } + } + }, + "calmBreathingTooFewBeatTimings": "ช่วงเวลาจังหวะหัวใจคุณภาพดีตลอดการฝึกมีน้อยเกินกว่าจะให้คะแนน", + "@calmBreathingTooFewBeatTimings": { + "description": "Fallback reason: too few clean beat timings to score the session" + }, + "calmBreathingThatIsDone": "เสร็จแล้ว", + "@calmBreathingThatIsDone": { + "description": "Headline shown when a session finishes normally" + }, + "calmBreathingCardiacCoherence": "ความสอดคล้องของจังหวะหัวใจ", + "@calmBreathingCardiacCoherence": { + "description": "Result card title for the coherence score" + }, + "calmBreathingHowStronglyFollowedPace": "อัตราการเต้นหัวใจตอบสนองต่อจังหวะได้ชัดเพียงใด", + "@calmBreathingHowStronglyFollowedPace": { + "description": "Result card subtitle explaining what the coherence score measures" + }, + "calmBreathingStoppedThere": "หยุดแล้ว", + "@calmBreathingStoppedThere": { + "description": "Headline shown when a sweep was aborted early" + }, + "calmBreathingHowStronglyEachPace": "อัตราการเต้นหัวใจตอบสนองต่อแต่ละจังหวะได้ชัดเพียงใด", + "@calmBreathingHowStronglyEachPace": { + "description": "Header for the sweep results table" + }, + "calmBreathingBreathsAMinute": "{rate} ครั้งต่อนาที", + "@calmBreathingBreathsAMinute": { + "description": "A pace expressed in breaths per minute", + "placeholders": { + "rate": { + "type": "String" + } + } + }, + "calmBreathingNotReached": "ยังไม่ถึง", + "@calmBreathingNotReached": { + "description": "Sweep result row value: this block was never reached" + }, + "calmBreathingTooFewCleanBeats": "จังหวะคุณภาพดีน้อยเกินไป", + "@calmBreathingTooFewCleanBeats": { + "description": "Sweep result row value: this block ran but could not be scored" + }, + "calmBreathingRankingExplainer": "จัดอันดับสามจังหวะจากการทดลองครั้งเดียว แต่ละจังหวะเริ่มขณะคุณยังปรับตัวจากจังหวะก่อนหน้า จึงบอกได้เพียงว่าหัวใจตอบสนองต่อจังหวะใดมากที่สุด", + "@calmBreathingRankingExplainer": { + "description": "Footnote explaining the sweep is a ranking with real limits, not a diagnosis" + }, + "calmBreathingVerdictAborted": "คุณหยุดก่อนจบ จึงไม่มีข้อมูลให้เปรียบเทียบ ยังไม่เปลี่ยนค่าใด", + "@calmBreathingVerdictAborted": { + "description": "Verdict text when the sweep was stopped before comparing any paces" + }, + "calmBreathingVerdictCouldNotScore": "อย่างน้อยหนึ่งจังหวะให้คะแนนไม่ได้ จึงจัดอันดับไม่ได้ ยังไม่เปลี่ยนค่าใด", + "@calmBreathingVerdictCouldNotScore": { + "description": "Verdict text when at least one pace could not be scored" + }, + "calmBreathingVerdictTied": "สองจังหวะได้คะแนนเท่ากัน การทดลองครั้งนี้จึงแยกไม่ได้ ยังไม่เปลี่ยนค่าใด", + "@calmBreathingVerdictTied": { + "description": "Verdict text when two paces scored the same and cannot be separated" + }, + "calmBreathingVerdictConfirmed": "ในจังหวะที่ทดสอบ {w} ทำให้คุณตอบสนองชัดที่สุดสองครั้งติดกันแล้ว เรโซแนนซ์จึงใช้จังหวะนั้น", + "@calmBreathingVerdictConfirmed": { + "description": "Verdict text when the winning pace matches the prior agreed pace", + "placeholders": { + "w": { + "type": "String" + } + } + }, + "calmBreathingVerdictFirstWin": "ในจังหวะที่ทดสอบ {w} ทำให้คุณตอบสนองชัดที่สุด ยังไม่ตั้งค่าใด จะเปลี่ยนเมื่อการทดลองสองครั้งเลือกจังหวะเดียวกันเท่านั้น", + "@calmBreathingVerdictFirstWin": { + "description": "Verdict text when a pace won but has not yet been confirmed by a second sitting", + "placeholders": { + "w": { + "type": "String" + } + } + }, + "breathPatternBoxName": "แบบกล่อง", + "@breathPatternBoxName": { + "description": "Pattern name for box breathing (4-4-4-4 count)" + }, + "breathPatternBoxDesc": "นับสี่เท่ากันทุกช่วงรวมการกลั้น ช่วยให้สงบเมื่อคิดฟุ้งซ่าน", + "@breathPatternBoxDesc": { + "description": "Description of box breathing on the pattern picker" + }, + "breathPattern478Name": "4-7-8", + "@breathPattern478Name": { + "description": "Pattern name for the 4-7-8 breathing exercise" + }, + "breathPattern478Desc": "กลั้นนานแล้วผ่อนออกนานกว่า มักใช้เพื่อช่วยเข้านอน", + "@breathPattern478Desc": { + "description": "Description of the 4-7-8 pattern on the pattern picker" + }, + "breathPatternExtendedExhaleName": "ผ่อนออกยาว", + "@breathPatternExtendedExhaleName": { + "description": "Pattern name for the extended-exhale breathing exercise" + }, + "breathPatternExtendedExhaleDesc": "หายใจออกนานเป็นสองเท่าของหายใจเข้า ไม่กลั้น จึงทำต่อเนื่องได้ง่าย", + "@breathPatternExtendedExhaleDesc": { + "description": "Description of the extended-exhale pattern on the pattern picker" + }, + "breathPhaseInhale": "หายใจเข้า", + "@breathPhaseInhale": { + "description": "Instruction shown on the breathing ring during the inhale phase" + }, + "breathPhaseHold": "กลั้น", + "@breathPhaseHold": { + "description": "Instruction shown on the breathing ring during a hold phase" + }, + "breathPhaseExhale": "หายใจออก", + "@breathPhaseExhale": { + "description": "Instruction shown on the breathing ring during the exhale phase" + }, + "breathPhaseWork": "ออกแรง", + "@breathPhaseWork": { + "description": "Instruction shown on the breathing ring during an interval-timer work phase" + }, + "breathPhaseRest": "พัก", + "@breathPhaseRest": { + "description": "Instruction shown on the breathing ring during an interval-timer rest phase" + }, + "metricDetailToday": "วันนี้", + "@metricDetailToday": { + "description": "Range picker chip and headline label for the current day, on the shared metric trend/detail screen." + }, + "metricDetailRange7Days": "7 วัน", + "@metricDetailRange7Days": { + "description": "Range picker chip: 7-day window, on the metric detail screen." + }, + "metricDetailRange30Days": "30 วัน", + "@metricDetailRange30Days": { + "description": "Range picker chip: 30-day window, on the metric detail screen." + }, + "metricDetailRange6Months": "6 เดือน", + "@metricDetailRange6Months": { + "description": "Range picker chip: 6-month window, on the metric detail screen." + }, + "metricDetailRangeYear": "ปี", + "@metricDetailRangeYear": { + "description": "Range picker chip: 1-year window, on the metric detail screen." + }, + "metricDetailLockedNote": "{label} ต้องมีประวัติ {needed} วัน คุณมี {have} วัน", + "@metricDetailLockedNote": { + "description": "Note under the range picker explaining why a wider range is not yet unlocked.", + "placeholders": { + "label": { + "type": "String" + }, + "needed": { + "type": "int" + }, + "have": { + "type": "int" + } + } + }, + "metricDetailNotShownTitle": "ไม่แสดงเป็นแนวโน้ม", + "@metricDetailNotShownTitle": { + "description": "StatusCard title for a metric that cannot be charted as a trend (e.g. skin temperature)." + }, + "metricDetailNothingRecordedToday": "วันนี้ยังไม่มีข้อมูลที่บันทึก", + "@metricDetailNothingRecordedToday": { + "description": "Empty-state title when Today's window has no value for this metric." + }, + "metricDetailNoHistoryYet": "ยังไม่มีประวัติ {metric}", + "@metricDetailNoHistoryYet": { + "description": "Empty-state title when a wider window has no value for this metric yet.", + "placeholders": { + "metric": { + "type": "String" + } + } + }, + "metricDetailNoValueYet": "วันนี้ยังคำนวณค่าไม่ได้", + "@metricDetailNoValueYet": { + "description": "Empty-state body: today has not produced a value and the install has no data at all yet." + }, + "metricDetailNoValueYetWiderRanges": "วันนี้ยังคำนวณค่าไม่ได้ ช่วงเวลาที่กว้างกว่าด้านบนมีวันที่คำนวณได้", + "@metricDetailNoValueYetWiderRanges": { + "description": "Empty-state body: today has not produced a value but wider ranges above have data." + }, + "metricDetailNoValueInWindow": "ไม่มีวันใดในช่วงนี้คำนวณค่าได้", + "@metricDetailNoValueInWindow": { + "description": "Empty-state body for a multi-day window with no value in it." + }, + "metricDetailWearBandFix": "สวมสายรัดขณะนอนเพื่อเริ่มมีชุดข้อมูล", + "@metricDetailWearBandFix": { + "description": "Empty-state fix suggestion telling the user to wear the band overnight." + }, + "metricDetailBreakdownLinkTitle": "รายละเอียด", + "@metricDetailBreakdownLinkTitle": { + "description": "Title of the doorway row from the Steps metric screen (Today only) into the day's step breakdown." + }, + "metricDetailBreakdownLinkSub": "แต่ละช่วงของวันนี้และอุปกรณ์ที่นับ", + "@metricDetailBreakdownLinkSub": { + "description": "Subtitle of the doorway row into the step breakdown screen." + }, + "metricDetailNerdStatsTitle": "สถิติเชิงลึก", + "@metricDetailNerdStatsTitle": { + "description": "Title of the doorway row into the Nerd stats (Investigate) screen, shown on every metric detail screen." + }, + "metricDetailNerdStatsSub": "ตัวเลขเบื้องหลังภาพ", + "@metricDetailNerdStatsSub": { + "description": "Subtitle of the doorway row into Nerd stats." + }, + "metricDetailDailyAverage": "ค่าเฉลี่ยรายวัน · {count} จาก {win} วัน", + "@metricDetailDailyAverage": { + "description": "Caption under the hero number on a multi-day window, showing how many of the window's days had data.", + "placeholders": { + "count": { + "type": "int" + }, + "win": { + "type": "int" + } + } + }, + "metricDetailLatestReading": "ล่าสุด {value} {unit} · {asOf}", + "@metricDetailLatestReading": { + "description": "Caption showing the most recent reading and the day it is from, under the daily-average headline.", + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + }, + "asOf": { + "type": "String" + } + } + }, + "metricDetailAlgoBreakFootnote": "{n, plural, other{เส้นประแสดงจุดที่วิธีคำนวณข้อมูลรายวันเปลี่ยนไป ค่าที่อยู่คนละด้านมาจากคนละเวอร์ชัน}}", + "@metricDetailAlgoBreakFootnote": { + "description": "Chart footnote explaining the dotted vertical line(s) marking an algorithm-version change.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "metricDetailDaysAgoLabel": "{n, plural, other{{n} วันที่แล้ว}}", + "@metricDetailDaysAgoLabel": { + "description": "Left x-axis label on the trend chart, naming how many days ago the leftmost point is.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "metricDetailWornChartTitle": "สวมใส่", + "@metricDetailWornChartTitle": { + "description": "Title of the small wear-time bar chart shown under a long trend." + }, + "metricDetailHoursADayUnit": "ชม. ต่อวัน", + "@metricDetailHoursADayUnit": { + "description": "Unit label on the wear-time bar chart (hours per day)." + }, + "metricDetailWearFootnote": "มีประวัติการสวมใส่ {have} จาก {win} วันนี้ ส่วนที่เหลือเป็นช่องว่างในทั้งสองกราฟ เส้นด้านบนไม่ลากข้ามช่องว่าง", + "@metricDetailWearFootnote": { + "description": "Footnote under the wear-time chart explaining coverage gaps.", + "placeholders": { + "have": { + "type": "int" + }, + "win": { + "type": "int" + } + } + }, + "metricDetailSlotNoRecord": "{day} ไม่มีข้อมูลบันทึก", + "@metricDetailSlotNoRecord": { + "description": "Screen-reader readout for a chart slot with no data, when scrubbing the trend line.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "metricDetailSlotWithValue": "{day} {value} {unit}", + "@metricDetailSlotWithValue": { + "description": "Screen-reader readout for a chart slot with a value, when scrubbing the trend line.", + "placeholders": { + "day": { + "type": "String" + }, + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "metricDetailUsingForX": "ใช้ {device} สำหรับ{metric}", + "@metricDetailUsingForX": { + "description": "Which device currently feeds one metric, under the device filter row.", + "placeholders": { + "device": { + "type": "String" + }, + "metric": { + "type": "String" + } + } + }, + "metricDetailPreferX": "เลือกใช้ {device} ก่อน", + "@metricDetailPreferX": { + "description": "Button: make the selected device win this metric's signal(s).", + "placeholders": { + "device": { + "type": "String" + } + } + }, + "metricDetailHistoryKeepsSource": "วันที่สิ้นสุดแล้วจะยังใช้แหล่งข้อมูลเดิมที่นำมาคำนวณ", + "@metricDetailHistoryKeepsSource": { + "description": "Copy under the device-preference control explaining a priority change is not retroactive." + }, + "metricDetailDimmedCaption": "แสดงวันที่มีการใช้ {device} เส้นกราฟเป็นค่าที่รวมแหล่งข้อมูลแล้ว", + "@metricDetailDimmedCaption": { + "description": "Caption under a metric-detail chart when a device pill is selected and dims non-contributing days.", + "placeholders": { + "device": { + "type": "String" + } + } + }, + "metricDetailSlotNoValueRecording": "{day} ไม่มีค่า · {who}", + "@metricDetailSlotNoValueRecording": { + "description": "Screen-reader readout for a chart slot with no value but something was recording (multi-device only).", + "placeholders": { + "day": { + "type": "String" + }, + "who": { + "type": "String" + } + } + }, + "metricDetailSlotNothingRecording": "{day} ไม่มีอุปกรณ์กำลังบันทึก", + "@metricDetailSlotNothingRecording": { + "description": "Screen-reader readout for a chart slot with no value and nothing recording (multi-device only).", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "metricDetailOpenDay": "เปิด {day}", + "@metricDetailOpenDay": { + "description": "Semantic label for the tappable row that opens a touched day's detail screen.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "metricDetailNoRecordLabel": "ไม่มีข้อมูลบันทึก", + "@metricDetailNoRecordLabel": { + "description": "Value text shown in the touched-day row when that day has no record." + }, + "metricDetailLowest": "ต่ำสุด", + "@metricDetailLowest": { + "description": "Label under the lowest value in the 'your normal range' 3-stat row." + }, + "metricDetailTypical": "ค่าทั่วไป", + "@metricDetailTypical": { + "description": "Label under the median value in the 'your normal range' 3-stat row." + }, + "metricDetailHighest": "สูงสุด", + "@metricDetailHighest": { + "description": "Label under the highest value in the 'your normal range' 3-stat row." + }, + "metricDetailFromDaysCount": "จากข้อมูลของคุณเอง {n} วัน", + "@metricDetailFromDaysCount": { + "description": "Fallback sentence under the 3-stat row when no percentile rank is available.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "metricDetailRankToday": "วันนี้สูงกว่า {pct}% ของวันที่คุณมีข้อมูล", + "@metricDetailRankToday": { + "description": "Where today sits in the user's own history, as the share of their days it is higher than.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "metricDetailRankTodayBand": "วันนี้สูงกว่า {pct}% ของวันที่คุณมีข้อมูล — {band}", + "@metricDetailRankTodayBand": { + "description": "As metricDetailRankToday, plus a qualitative band label.", + "placeholders": { + "pct": { + "type": "int" + }, + "band": { + "type": "String" + } + } + }, + "metricDetailRankFrom": "ค่าวันที่ {date} สูงกว่า {pct}% ของวันที่คุณมีข้อมูล", + "@metricDetailRankFrom": { + "description": "As metricDetailRankToday, for an older reading on a given date.", + "placeholders": { + "date": { + "type": "String" + }, + "pct": { + "type": "int" + } + } + }, + "metricDetailRankFromBand": "ค่าวันที่ {date} สูงกว่า {pct}% ของวันที่คุณมีข้อมูล — {band}", + "@metricDetailRankFromBand": { + "description": "As metricDetailRankFrom, plus a qualitative band label.", + "placeholders": { + "date": { + "type": "String" + }, + "pct": { + "type": "int" + }, + "band": { + "type": "String" + } + } + }, + "metricDetailDaysWithWithout": "{withCount} วันที่มี · {withoutCount} วันที่ไม่มี", + "@metricDetailDaysWithWithout": { + "description": "Row subtitle in the 'what moves it' list: how many logged days had vs. lacked a journal tag.", + "placeholders": { + "withCount": { + "type": "int" + }, + "withoutCount": { + "type": "int" + } + } + }, + "metricDetailPatternsNotCauses": "รูปแบบจากบันทึกของคุณ ไม่ใช่สาเหตุ", + "@metricDetailPatternsNotCauses": { + "description": "Disclaimer under the 'what moves it' journal-correlation list." + }, + "metricDetailChooseDayHelp": "เลือกวัน", + "@metricDetailChooseDayHelp": { + "description": "Help text on the native date picker used to jump to a specific derived day." + }, + "metricDetailPreviousDay": "วันก่อนหน้า", + "@metricDetailPreviousDay": { + "description": "Semantic label for the back arrow on the day-stepper control." + }, + "metricDetailNextDay": "วันถัดไป", + "@metricDetailNextDay": { + "description": "Semantic label for the forward arrow on the day-stepper control." + }, + "metricDetailChooseDayShowing": "เลือกวัน กำลังแสดง {day}", + "@metricDetailChooseDayShowing": { + "description": "Semantic label for the day-stepper's centre label, announcing the day currently shown.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "metricDetailNormalRangeSection": "ช่วงปกติของคุณ", + "@metricDetailNormalRangeSection": { + "description": "Section heading above the lowest/typical/highest 3-stat card." + }, + "metricDetailWhatMovesItSection": "สิ่งที่สัมพันธ์กับการเปลี่ยนแปลง", + "@metricDetailWhatMovesItSection": { + "description": "Section heading above the journal-correlation 'movers' list." + }, + "cycleRemoveLogTitle": "ลบ {date} หรือไม่?", + "@cycleRemoveLogTitle": { + "description": "Confirmation dialog title when deleting a logged cycle day.", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "cycleRemoveLogBody": "วันในรอบ ระยะ และวันที่คาดว่ารอบถัดไปจะเริ่ม ล้วนคำนวณจากวันที่คุณบันทึก บันทึกได้เฉพาะวันนี้ จึงเพิ่มรายการนี้กลับไม่ได้", + "@cycleRemoveLogBody": { + "description": "Confirmation dialog body when deleting a logged cycle day." + }, + "cycleWhatAppliesToYou": "ข้อมูลที่ตรงกับคุณ", + "@cycleWhatAppliesToYou": { + "description": "Title of the reproductive-state picker sheet, and label of the settings row that opens it." + }, + "cyclePreferNotToSay": "ไม่ประสงค์ระบุ", + "@cyclePreferNotToSay": { + "description": "Reproductive-state option: decline to answer." + }, + "cyclePreferNotToSayWhy": "แอปจะไม่แสดงระยะของรอบเดือน", + "@cyclePreferNotToSayWhy": { + "description": "Explanation shown under 'Prefer not to say' in the reproductive-state picker." + }, + "cycleReproCyclingLabel": "ฉันมีรอบเดือนตามธรรมชาติ", + "@cycleReproCyclingLabel": { + "description": "Reproductive-state option: has natural menstrual cycles." + }, + "cycleReproCyclingWhy": "คำนวณระยะจากวันเริ่มที่คุณบันทึก", + "@cycleReproCyclingWhy": { + "description": "Explanation shown under the 'natural cycles' reproductive-state option." + }, + "cycleReproContraceptionLabel": "ใช้ฮอร์โมนคุมกำเนิด", + "@cycleReproContraceptionLabel": { + "description": "Reproductive-state option: uses hormonal contraception." + }, + "cycleReproContraceptionWhy": "ไม่มีการตกไข่ให้ใช้นับ จึงไม่แสดงระยะ แต่ยังบันทึกเลือดออกได้", + "@cycleReproContraceptionWhy": { + "description": "Explanation shown under the 'hormonal contraception' reproductive-state option." + }, + "cycleReproNoneLabel": "ตั้งครรภ์ หลังคลอด หรือไม่มีรอบเดือน", + "@cycleReproNoneLabel": { + "description": "Reproductive-state option: pregnant, postpartum, or not cycling." + }, + "cycleReproNoneWhy": "ไม่แสดงระยะหรือคาดการณ์รอบถัดไป แต่ยังแสดงค่าทางร่างกายของคุณ", + "@cycleReproNoneWhy": { + "description": "Explanation shown under the 'pregnant/postpartum/not cycling' reproductive-state option." + }, + "cycleReproNotSet": "ยังไม่ตั้งค่า", + "@cycleReproNotSet": { + "description": "Fallback label when no reproductive state has been chosen." + }, + "cycleTrackingOffTitle": "ปิดการติดตามรอบเดือนอยู่", + "@cycleTrackingOffTitle": { + "description": "Status card title when cycle tracking is disabled." + }, + "cycleTrackingOffBody": "ข้อมูลอยู่ในโทรศัพท์เครื่องนี้", + "@cycleTrackingOffBody": { + "description": "Status card body when cycle tracking is disabled." + }, + "cycleTurnOnTracking": "เปิดการติดตามรอบเดือน", + "@cycleTurnOnTracking": { + "description": "Button label to enable cycle tracking." + }, + "cycleNoPeriodTitle": "ยังไม่ได้บันทึกประจำเดือน", + "@cycleNoPeriodTitle": { + "description": "Status card title when no period has ever been logged." + }, + "cycleNoPeriodBody": "คำนวณจากวันที่คุณบันทึก", + "@cycleNoPeriodBody": { + "description": "Status card body when no period has ever been logged." + }, + "cycleLogPeriodButton": "บันทึกว่าเริ่มมีประจำเดือนวันนี้", + "@cycleLogPeriodButton": { + "description": "Button label to log a period start today (used both as a status-card fix action and the main button)." + }, + "cycleLogKindStart": "เริ่ม", + "@cycleLogKindStart": { + "description": "Recent-logs row: this entry is a period start (shown uppercased already, so translate as-is)" + }, + "cycleLogKindEnd": "สิ้นสุด", + "@cycleLogKindEnd": { + "description": "Recent-logs row: this entry is a period end (shown uppercased already, so translate as-is)" + }, + "cycleAcrossCyclesTitle": "เปรียบเทียบหลายรอบเดือน", + "@cycleAcrossCyclesTitle": { + "description": "Title for the cycle-history deep-dive card and its detail screen." + }, + "cycleUnitCompleteCycle": "รอบที่ครบแล้ว", + "@cycleUnitCompleteCycle": { + "description": "Unit label under the completed-cycle count, singular." + }, + "cycleUnitCompleteCycles": "รอบที่ครบแล้ว", + "@cycleUnitCompleteCycles": { + "description": "Unit label under the completed-cycle count, plural." + }, + "cycleOpenAction": "เปิด", + "@cycleOpenAction": { + "description": "Action label on the 'Across your cycles' deep-dive card." + }, + "cycleWhatYouNoticedToday": "สิ่งที่คุณสังเกตวันนี้", + "@cycleWhatYouNoticedToday": { + "description": "Section title above today's symptom chips." + }, + "cycleLoggedDays": "วันที่บันทึก", + "@cycleLoggedDays": { + "description": "Section title above the list of recently logged cycle days." + }, + "cycleReproOptionalHint": "ไม่บังคับ แอปจะยังไม่แสดงระยะจนกว่าคุณจะระบุ", + "@cycleReproOptionalHint": { + "description": "Subtitle shown when no reproductive state has been set." + }, + "cycleReproPrivateHint": "มีเพียงคุณกับโทรศัพท์เครื่องนี้ ไม่มีการส่งออก", + "@cycleReproPrivateHint": { + "description": "Subtitle shown once a reproductive state has been set, noting privacy." + }, + "cycleTurnOffTracking": "ปิดการติดตามรอบเดือน", + "@cycleTurnOffTracking": { + "description": "Text button to disable cycle tracking." + }, + "cycleDayInThisCycle": "วันในรอบนี้", + "@cycleDayInThisCycle": { + "description": "Overline label above the current cycle-day number." + }, + "cycleCountedFromLastStart": "นับจากวันเริ่มล่าสุดที่คุณบันทึก", + "@cycleCountedFromLastStart": { + "description": "Caption shown next to the cycle-day number when no median cycle length is known yet." + }, + "cycleOfAboutDays": "จากประมาณ {days} วัน", + "@cycleOfAboutDays": { + "description": "Caption shown next to the cycle-day number, giving the typical cycle length.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "cyclePhaseMenstrual": "ระยะมีประจำเดือน", + "@cyclePhaseMenstrual": { + "description": "Cycle phase pill label: menstrual." + }, + "cyclePhaseFollicular": "ระยะฟอลลิคูลาร์", + "@cyclePhaseFollicular": { + "description": "Cycle phase pill label: follicular." + }, + "cyclePhaseOvulation": "ช่วงตกไข่", + "@cyclePhaseOvulation": { + "description": "Cycle phase pill label: ovulation window." + }, + "cyclePhaseLuteal": "ระยะลูทีล", + "@cyclePhaseLuteal": { + "description": "Cycle phase pill label: luteal." + }, + "cycleNextPeriodBetween": "คาดว่าประจำเดือนรอบถัดไปอยู่ระหว่าง", + "@cycleNextPeriodBetween": { + "description": "Overline label when the next-period prediction is a date range." + }, + "cycleNextPeriodAround": "คาดว่าประจำเดือนรอบถัดไปประมาณ", + "@cycleNextPeriodAround": { + "description": "Overline label when the next-period prediction is a single point date." + }, + "cycleFromOneMeasuredGap": "จากช่วงห่างเพียงช่วงเดียวที่วัดได้ จึงยังบอกความแปรปรวนของรอบเดือนคุณไม่ได้", + "@cycleFromOneMeasuredGap": { + "description": "Trailing clause of the prediction footnote when only one cycle gap has been measured." + }, + "cyclePastEndOfIt": "{days, plural, other{เลยช่วงนี้มา {days} วัน}} · ", + "@cyclePastEndOfIt": { + "description": "Leading clause of the prediction footnote: the predicted window has already passed.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "cycleInsideItNow": "ขณะนี้อยู่ในช่วงนี้ · ", + "@cycleInsideItNow": { + "description": "Leading clause of the prediction footnote: today falls inside the predicted window." + }, + "cycleInDaysRange": "ในอีก {lo}–{hi} วัน · ", + "@cycleInDaysRange": { + "description": "Leading clause of the prediction footnote: the predicted window is still ahead, given as a day range.", + "placeholders": { + "lo": { + "type": "int" + }, + "hi": { + "type": "int" + } + } + }, + "cycleHalfOfMeasuredGaps": "ครึ่งหนึ่งของช่วงห่างที่วัดได้ {n} ช่วงอยู่ภายในช่วงกว้างเท่านี้", + "@cycleHalfOfMeasuredGaps": { + "description": "Trailing clause of the prediction footnote, stating how many measured gaps back the range.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "cycleLeadDaysLate": "{days, plural, other{ช้าไป {days} วัน}} · ", + "@cycleLeadDaysLate": { + "description": "Leading clause used when the single measured-gap prediction is overdue.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "cycleLeadToday": "วันนี้ · ", + "@cycleLeadToday": { + "description": "Leading clause used when the single measured-gap prediction is due today." + }, + "cycleLeadInDays": "{days, plural, other{ในอีก {days} วัน}} · ", + "@cycleLeadInDays": { + "description": "Leading clause used when the single measured-gap prediction is still ahead.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "cycleWhatYouUsuallyNotice": "สิ่งที่คุณมักสังเกตพบ", + "@cycleWhatYouUsuallyNotice": { + "description": "Expandable row label/semantic label for the symptom-shape look-back." + }, + "cycleSymptomShapeSummary": "หนึ่งค่าต่อสัปดาห์ของรอบเดือน นับจากวันเริ่มที่คุณบันทึก ใช้เฉพาะวันที่บันทึก {daysByWeek} วันต่อสัปดาห์จาก {cycles} รอบ", + "@cycleSymptomShapeSummary": { + "description": "Explanatory footer under the symptom-shape breakdown.", + "placeholders": { + "daysByWeek": { + "type": "String" + }, + "cycles": { + "type": "int" + } + } + }, + "cycleRemoveLoggedDay": "ลบวันที่ {date}", + "@cycleRemoveLoggedDay": { + "description": "Semantic label on the remove (X) button next to a logged cycle day.", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "cycleSymptomCramps": "ปวดเกร็งท้อง", + "@cycleSymptomCramps": { + "description": "Symptom chip: cramps." + }, + "cycleSymptomHeadache": "ปวดศีรษะ", + "@cycleSymptomHeadache": { + "description": "Symptom chip: headache." + }, + "cycleSymptomBloating": "ท้องอืด", + "@cycleSymptomBloating": { + "description": "Symptom chip: bloating." + }, + "cycleSymptomFatigue": "อ่อนเพลีย", + "@cycleSymptomFatigue": { + "description": "Symptom chip: fatigue." + }, + "cycleSymptomLowMood": "อารมณ์เศร้า", + "@cycleSymptomLowMood": { + "description": "Symptom chip: low mood." + }, + "cycleSymptomAcne": "สิว", + "@cycleSymptomAcne": { + "description": "Symptom chip: acne." + }, + "cycleSymptomTenderBreasts": "คัดตึงเต้านม", + "@cycleSymptomTenderBreasts": { + "description": "Symptom chip: tender breasts." + }, + "cycleSymptomNausea": "คลื่นไส้", + "@cycleSymptomNausea": { + "description": "Symptom chip: nausea." + }, + "cycleThisCycle": "รอบนี้", + "@cycleThisCycle": { + "description": "Section title for the current-cycle chart on the cycle-history screen." + }, + "cycleByDayOfYourCycle": "ตามวันในรอบเดือน", + "@cycleByDayOfYourCycle": { + "description": "Section title for the by-cycle-day comparison charts." + }, + "cycleHowLongCyclesBeen": "ความยาวรอบเดือนที่ผ่านมา", + "@cycleHowLongCyclesBeen": { + "description": "Section title for the cycle-lengths-over-time chart." + }, + "cycleRestingHeartRate": "อัตราการเต้นหัวใจขณะพัก", + "@cycleRestingHeartRate": { + "description": "Chart title: resting heart rate." + }, + "cycleUnitBpm": "bpm", + "@cycleUnitBpm": { + "description": "Unit abbreviation for beats per minute." + }, + "cycleHrvRmssdTitle": "HRV", + "@cycleHrvRmssdTitle": { + "description": "Chart title: heart-rate variability (RMSSD)." + }, + "cycleUnitMs": "ms", + "@cycleUnitMs": { + "description": "Unit abbreviation for milliseconds." + }, + "cycleNotEnoughDescribeDayTitle": "จำนวนรอบยังไม่พออธิบายแต่ละวันในรอบเดือน", + "@cycleNotEnoughDescribeDayTitle": { + "description": "Status card title when not enough cycles exist to chart cycle-day medians." + }, + "cycleNotEnoughDescribeDayBody": "แต่ละจุดคือค่ากลางของวันเดียวกันจากรอบเดือนของคุณอย่างน้อยสองรอบ ยังไม่มีจุดใดมีข้อมูลครบสองรอบ", + "@cycleNotEnoughDescribeDayBody": { + "description": "Status card body when not enough cycles exist to chart cycle-day medians." + }, + "cycleOwnPastCyclesDescribed": "อธิบายรอบเดือนที่ผ่านมาของคุณ วันที่มีข้อมูลเพียงรอบเดียวจะเว้นว่าง แสดงสิ่งที่เกิดขึ้นแล้ว ไม่ใช่สิ่งที่จะเกิดขึ้น", + "@cycleOwnPastCyclesDescribed": { + "description": "Explanatory footer under the by-cycle-day charts." + }, + "cycleDayOneLabel": "วันที่ 1", + "@cycleDayOneLabel": { + "description": "X-axis label: day 1 of the cycle." + }, + "cycleDayNLabel": "วันที่ {n}", + "@cycleDayNLabel": { + "description": "X-axis label: the last drawn day of the cycle.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "cycleMiddleOfNCycles": "ค่ากลางจาก {n} รอบในแต่ละวัน", + "@cycleMiddleOfNCycles": { + "description": "Chart footnote stating how many cycles each median point is drawn from, when the count is the same for every point.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "cycleMiddleOfRangeCycles": "ค่ากลางจาก {lo} ถึง {hi} รอบในแต่ละวัน", + "@cycleMiddleOfRangeCycles": { + "description": "Chart footnote stating the range of cycles each median point is drawn from, when the count varies.", + "placeholders": { + "lo": { + "type": "int" + }, + "hi": { + "type": "int" + } + } + }, + "cycleNotEnoughCompareTitle": "จำนวนรอบยังไม่พอเปรียบเทียบวันเดียวกัน", + "@cycleNotEnoughCompareTitle": { + "description": "Status card title when there aren't enough previous cycles to compare today against." + }, + "cycleCompareBodyGeneric": "เทียบวันนี้กับวันเดียวกันของรอบก่อน ๆ ของคุณ ต้องมีสามรอบที่นับไปถึงวันนั้น", + "@cycleCompareBodyGeneric": { + "description": "Status card body for the day-against-itself comparison when today's cycle day is unknown." + }, + "cycleCompareBodyWithDay": "เทียบวันนี้กับวันเดียวกันของรอบก่อน ๆ ของคุณ ต้องมีสามรอบที่นับไปถึงวันที่ {day}", + "@cycleCompareBodyWithDay": { + "description": "Status card body for the day-against-itself comparison, naming today's cycle day.", + "placeholders": { + "day": { + "type": "int" + } + } + }, + "cycleNightOfLabel": "คืนวันที่ {date}", + "@cycleNightOfLabel": { + "description": "Overline label naming the night the day-against-itself comparison is about.", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "cycleComparisonNotCorrection": "เป็นการเปรียบเทียบ ไม่ใช่การปรับแก้ คะแนนการฟื้นตัวไม่ได้ปรับตามข้อมูลนี้ และไม่มีคำสั่งให้ฝึกซ้อมที่นี่", + "@cycleComparisonNotCorrection": { + "description": "Disclaimer under the day-against-itself comparison." + }, + "cycleCompareHrvLabel": "HRV", + "@cycleCompareHrvLabel": { + "description": "Short label for HRV used in the day-against-itself comparison line." + }, + "cycleCompareLine": "{label} {z1} เทียบ 3 สัปดาห์ล่าสุด และ {z2} เทียบวันที่ {cycleDay} จาก {n} รอบล่าสุด", + "@cycleCompareLine": { + "description": "One line of the day-against-itself comparison, e.g. 'HRV +1.2 vs your last 3 weeks, -0.3 vs your last 4 day-22s.'", + "placeholders": { + "label": { + "type": "String" + }, + "z1": { + "type": "String" + }, + "z2": { + "type": "String" + }, + "n": { + "type": "int" + }, + "cycleDay": { + "type": "int" + } + } + }, + "cycleLengthsTitle": "ความยาวรอบเดือนของคุณเทียบช่วงที่เผยแพร่", + "@cycleLengthsTitle": { + "description": "Status card title offering to show cycle-length-vs-published-range chart (opt-in)." + }, + "cycleLengthsBody": "ปิดอยู่จนกว่าคุณจะเปิด แสดงเพียงจำนวนวันระหว่างวันเริ่มที่บันทึก เทียบกับช่วงสำหรับผู้ใหญ่ที่เผยแพร่", + "@cycleLengthsBody": { + "description": "Status card body explaining the cycle-length review is opt-in." + }, + "cycleShowIt": "แสดง", + "@cycleShowIt": { + "description": "Button label to opt in and show the cycle-lengths chart." + }, + "cycleNotEnoughLoggedTitle": "ยังบันทึกรอบเดือนไม่เพียงพอ", + "@cycleNotEnoughLoggedTitle": { + "description": "Status card title when too few cycle-length gaps have been logged." + }, + "cycleNotEnoughLoggedBody": "ต้องมีข้อมูลต่อเนื่องยาวนาน ขณะนี้มี {n} จาก {total} ช่วงห่าง ซึ่งต้องบันทึกทุกครั้งที่เริ่มรอบประมาณหนึ่งปี", + "@cycleNotEnoughLoggedBody": { + "description": "Status card body when too few cycle-length gaps have been logged.", + "placeholders": { + "n": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cycleGapTitle": "วันเริ่มรอบเดือนที่บันทึกมีช่วงขาดหาย", + "@cycleGapTitle": { + "description": "Status card title when a suspiciously long gap breaks the cycle-length chart." + }, + "cycleGapBody": "วันเริ่มครั้งหนึ่งห่างจากครั้งก่อนเกิน {days} วัน การลืมบันทึกกับรอบที่ยาวดูเหมือนกัน จึงไม่แสดงกราฟ", + "@cycleGapBody": { + "description": "Status card body when a suspiciously long gap breaks the cycle-length chart.", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "cycleDaysBetweenStarts": "จำนวนวันระหว่างวันเริ่มที่บันทึก", + "@cycleDaysBetweenStarts": { + "description": "Chart title: days between logged period starts." + }, + "cycleUnitDays": "วัน", + "@cycleUnitDays": { + "description": "Unit label for days." + }, + "cycleLegendYourCycles": "รอบเดือนของคุณ", + "@cycleLegendYourCycles": { + "description": "Chart legend entry for the user's own cycle-length bars." + }, + "cycleLegendPublishedRange": "ช่วงที่เผยแพร่", + "@cycleLegendPublishedRange": { + "description": "Chart legend entry for the published cycle-length reference range." + }, + "cycleTwoLinesFootnote": "สองเส้นคือ {low} และ {high} วัน", + "@cycleTwoLinesFootnote": { + "description": "Chart footnote naming the two published reference-range boundary days.", + "placeholders": { + "low": { + "type": "int" + }, + "high": { + "type": "int" + } + } + }, + "cycleLengthChangesReasons": "ความยาวรอบเปลี่ยนได้จากหลายสาเหตุ เช่น ไทรอยด์ ความเครียด น้ำหนัก การคุมกำเนิด หรือ PCOS เป็นประเด็นให้ปรึกษาแพทย์ ไม่ใช่คำตอบ", + "@cycleLengthChangesReasons": { + "description": "Disclaimer under the cycle-length chart about medical causes of variation." + }, + "cycleHideLengths": "ซ่อนความยาวรอบเดือน", + "@cycleHideLengths": { + "description": "Button label to opt back out of the cycle-lengths chart." + }, + "cycleDescriptiveOnly": "ใช้อธิบายข้อมูลเท่านั้น", + "@cycleDescriptiveOnly": { + "description": "Footnote on the current-cycle resting-heart-rate chart." + }, + "cycleNotEnoughDerivedNights": "รอบนี้ยังมีคืนที่คำนวณคะแนนแล้วไม่เพียงพอ", + "@cycleNotEnoughDerivedNights": { + "description": "Empty-state message on the current-cycle chart when too few nights have derived data." + }, + "cycleMdcNoteInsideSpread": " ทุกวันที่นี่อยู่ในความผันผวนระหว่างคืนตามปกติของคุณ ต่างกันมากสุด {s} ขณะที่การเปลี่ยนแปลงจริงขั้นต่ำคือ {n} เป็นเพียงรูปแบบ ไม่ใช่การเปลี่ยนระดับ", + "@cycleMdcNoteInsideSpread": { + "description": "Chart footnote addendum when the drawn swing is smaller than the user's own night-to-night noise.", + "placeholders": { + "s": { + "type": "String" + }, + "n": { + "type": "String" + } + } + }, + "cycleMdcNoteVaries": " คืนของคุณผันผวนได้เอง {n} วันที่ต่างกันน้อยกว่านั้นจึงแยกกันไม่ได้ ความต่างสูงสุดที่นี่คือ {s}", + "@cycleMdcNoteVaries": { + "description": "Chart footnote addendum when the drawn swing exceeds the user's own night-to-night noise.", + "placeholders": { + "n": { + "type": "String" + }, + "s": { + "type": "String" + } + } + }, + "healthTabOverview": "ภาพรวม", + "@healthTabOverview": { + "description": "Health screen sub-tab label: Overview" + }, + "healthTabExplore": "สำรวจ", + "@healthTabExplore": { + "description": "Health screen sub-tab label: Explore" + }, + "healthTabTrends": "แนวโน้ม", + "@healthTabTrends": { + "description": "Health screen sub-tab label: Trends" + }, + "healthTabVitals": "สัญญาณชีพ", + "@healthTabVitals": { + "description": "Health screen sub-tab label: Vitals" + }, + "healthTabLabs": "ผลแล็บ", + "@healthTabLabs": { + "description": "Health screen sub-tab label: Labs" + }, + "healthTitle": "สุขภาพ", + "@healthTitle": { + "description": "Health screen page title" + }, + "healthCouldNotRead": "อ่าน{what}ของคุณไม่ได้", + "@healthCouldNotRead": { + "description": "Read-failure card title, e.g. Could not read your vitals", + "placeholders": { + "what": { + "type": "String" + } + } + }, + "healthReadFailedBody": "โหลดแถวข้อมูลที่เก็บไว้ไม่สำเร็จ ไม่มีการลบข้อมูล เป็นข้อผิดพลาดในการอ่าน", + "@healthReadFailedBody": { + "description": "Read-failure card body" + }, + "healthTryAgain": "ลองอีกครั้ง", + "@healthTryAgain": { + "description": "Read-failure card retry button" + }, + "healthWhatVitals": "สัญญาณชีพ", + "@healthWhatVitals": { + "description": "Noun 'vitals' plugged into the read-failure title" + }, + "healthWhatLabResults": "ผลแล็บ", + "@healthWhatLabResults": { + "description": "Noun 'lab results' plugged into the read-failure title" + }, + "cycleWhatCycleData": "ข้อมูลรอบเดือน", + "@cycleWhatCycleData": { + "description": "Noun 'cycle data' plugged into the read-failure title on the Cycle tab" + }, + "healthMeasuresUnit": "ค่าที่วัด", + "@healthMeasuresUnit": { + "description": "Noun 'measures' — used both as the read-failure title noun and as the Explore consistency-tile unit" + }, + "healthRowRestingHr": "อัตราการเต้นหัวใจขณะพัก", + "@healthRowRestingHr": { + "description": "Overview/Trends/Vitals row label: resting heart rate" + }, + "healthRowHrv": "HRV", + "@healthRowHrv": { + "description": "Overview/Trends row label: HRV" + }, + "healthRowSleep": "การนอน", + "@healthRowSleep": { + "description": "Overview row label and Explore catalogue category title: Sleep" + }, + "healthRowStress": "ความเครียด", + "@healthRowStress": { + "description": "Overview row label and sub-label fallback: Stress" + }, + "healthRowRespRate": "อัตราการหายใจ", + "@healthRowRespRate": { + "description": "Overview/Vitals row label: respiratory rate" + }, + "healthSubOvernight": "ระหว่างคืน", + "@healthSubOvernight": { + "description": "Overview row sub-label: overnight reading" + }, + "healthSubRmssdAsleep": "HRV ขณะหลับ", + "@healthSubRmssdAsleep": { + "description": "Overview HRV row sub-label" + }, + "healthSubLastNight": "เมื่อคืน", + "@healthSubLastNight": { + "description": "Sub-label / chart axis label meaning last night" + }, + "healthSubAsleep": "หลับ", + "@healthSubAsleep": { + "description": "Overview/Vitals row sub-label: asleep reading" + }, + "healthNoMetric": "ไม่มี{name}", + "@healthNoMetric": { + "description": "Empty-state card title for a metric with no value, e.g. 'No resting heart rate'", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "healthWhyReadFromSleep": "อ่านจากการนอน แต่ยังไม่มีคืนที่คำนวณคะแนนแล้ว", + "@healthWhyReadFromSleep": { + "description": "Why-absent reason: resting HR is read from sleep and no night was scored" + }, + "healthWhyReadOnlyFromSleep": "อ่านจากการนอนเท่านั้น แต่ยังไม่มีคืนที่คำนวณคะแนนแล้ว", + "@healthWhyReadOnlyFromSleep": { + "description": "Why-absent reason: HRV/respiratory rate read only from sleep and no night was scored" + }, + "healthWhySleepNotLongEnough": "ไม่ได้บันทึกช่วงนอนที่นานพอให้คำนวณคะแนน", + "@healthWhySleepNotLongEnough": { + "description": "Why-absent reason: no sleep period long enough to score" + }, + "healthWhyReadFromNight": "อ่านจากข้อมูลรายคืน แต่ยังไม่มีคืนที่คำนวณคะแนนแล้ว", + "@healthWhyReadFromNight": { + "description": "Why-absent reason: stress read from the night and no night was scored" + }, + "healthWhyNoReadingLastNight": "ไม่มีค่าที่วัดได้จากเมื่อคืน", + "@healthWhyNoReadingLastNight": { + "description": "Why-absent reason: no respiratory reading from last night" + }, + "healthIllnessRedTitle": "หลายคืนล่าสุดแสดงอัตราการเต้นหัวใจขณะพักสูงขึ้น", + "@healthIllnessRedTitle": { + "description": "Illness observation card title, red/severe state" + }, + "healthIllnessLastNightTitle": "เมื่อคืนอยู่นอกช่วงปกติของคุณ", + "@healthIllnessLastNightTitle": { + "description": "Illness observation card title when the flagged night is last night" + }, + "healthIllnessDayTitle": "{day} อยู่นอกช่วงปกติของคุณ", + "@healthIllnessDayTitle": { + "description": "Illness observation card title when the flagged night is an earlier day", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "healthIllnessBodyNoZ": "อัตราการเต้นหัวใจขณะพักสูงกว่าปกติในหลายคืนล่าสุด ติดตามสัญญาณเดียว จึงแสดงรูปแบบ ไม่ใช่สาเหตุ", + "@healthIllnessBodyNoZ": { + "description": "Illness observation card body when no z-score is available" + }, + "healthIllnessBodyWithZ": "หลายคืนล่าสุดรวมกันแสดงอัตราการเต้นหัวใจขณะพักสูงกว่าปกติ คืนดังกล่าวเพียงคืนเดียว{direction}ค่าปกติอยู่ {z} เท่าของความผันผวนระหว่างคืน เป็นรูปแบบ ไม่ใช่สาเหตุ", + "@healthIllnessBodyWithZ": { + "description": "Illness observation card body including the standard-deviation figure and direction", + "placeholders": { + "z": { + "type": "String" + }, + "direction": { + "type": "String" + } + } + }, + "healthDirectionAbove": "สูงกว่า", + "@healthDirectionAbove": { + "description": "Direction word: above (baseline)" + }, + "healthDirectionBelow": "ต่ำกว่า", + "@healthDirectionBelow": { + "description": "Direction word: below (baseline)" + }, + "healthIllnessAdvice": "ควรสังเกตหากเป็นต่อเนื่องเกินสองสามวัน", + "@healthIllnessAdvice": { + "description": "Illness observation card advice line" + }, + "healthObservationsTitle": "ข้อสังเกต", + "@healthObservationsTitle": { + "description": "Section title over the illness/findings observation card" + }, + "healthSeeAll": "ดูทั้งหมด", + "@healthSeeAll": { + "description": "Section action button: open the full findings log" + }, + "healthNapsTitle": "การงีบ", + "@healthNapsTitle": { + "description": "Section title: Naps" + }, + "healthNoNapReading": "ไม่มีข้อมูลการงีบ", + "@healthNoNapReading": { + "description": "Empty-state title when there is no nap day to name" + }, + "healthNoNapReadingFor": "ไม่มีข้อมูลการงีบของ {day}", + "@healthNoNapReadingFor": { + "description": "Empty-state title when there is no nap reading for a named day", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "healthNapsBody": "การงีบคำนวณจากข้อมูลรายวินาทีชุดเดียวกับส่วนอื่นของวัน แต่วันนี้มีข้อมูลไม่เพียงพอ", + "@healthNapsBody": { + "description": "Empty-state body explaining why naps may be missing" + }, + "healthDaytimeSleep": "การนอนกลางวัน", + "@healthDaytimeSleep": { + "description": "Nap row label" + }, + "healthValueNone": "ไม่มี", + "@healthValueNone": { + "description": "Value shown when zero naps were measured (a measured zero, not absence)" + }, + "healthNoneDetectedOn": "ไม่พบ · {day}", + "@healthNoneDetectedOn": { + "description": "Nap row sub-label when zero naps were detected on a day", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "healthNapCountLabel": "{n, plural, other{งีบ {n} ครั้ง}}", + "@healthNapCountLabel": { + "description": "Nap row sub-label: N naps counted, ICU plural", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "healthAddOrCorrect": "เพิ่มหรือแก้ไข", + "@healthAddOrCorrect": { + "description": "Naps section action button" + }, + "healthNoTrendYet": "ยังไม่มีแนวโน้ม{label}", + "@healthNoTrendYet": { + "description": "Trend card empty-state title", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "healthZeroDaysStored": "เก็บข้อมูลแล้ว 0 วัน", + "@healthZeroDaysStored": { + "description": "Trend card empty-state body" + }, + "healthAsOf": " · ข้อมูล ณ {date}", + "@healthAsOf": { + "description": "Trend card suffix noting the hero number's date when it is not today", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "healthNoBaseline": "ยังไม่มีช่วงปกติ", + "@healthNoBaseline": { + "description": "Trend card delta label when there is no baseline to compare to" + }, + "healthTimeAsleep": "เวลาที่หลับ", + "@healthTimeAsleep": { + "description": "Trends tab sleep trend card label" + }, + "healthVsNeed": "เทียบความต้องการนอน {need}", + "@healthVsNeed": { + "description": "Trend card comparison label against the computed sleep need", + "placeholders": { + "need": { + "type": "String" + } + } + }, + "healthBodyClockTitle": "นาฬิกาชีวภาพ", + "@healthBodyClockTitle": { + "description": "Section title: Body clock" + }, + "healthChronotypeJetlagRegularity": "เวลาเข้านอนตามธรรมชาติ การเลื่อนช่วงสุดสัปดาห์ และความสม่ำเสมอของเวลานอน", + "@healthChronotypeJetlagRegularity": { + "description": "Body clock card subtitle" + }, + "healthChronotypeLabel": "เวลาเข้านอนตามธรรมชาติ", + "@healthChronotypeLabel": { + "description": "Body clock inline-metric label: CHRONOTYPE" + }, + "healthSocialJetlagLabel": "การเลื่อนช่วงสุดสัปดาห์", + "@healthSocialJetlagLabel": { + "description": "Body clock inline-metric label: SOCIAL JETLAG" + }, + "healthRegularityLabel": "ความสม่ำเสมอ", + "@healthRegularityLabel": { + "description": "Body clock inline-metric label: REGULARITY" + }, + "healthConsistencyTitle": "ความสม่ำเสมอ", + "@healthConsistencyTitle": { + "description": "Section title: Consistency" + }, + "healthDaysWithRecord": "วันที่มีคะแนนใน 30 วันล่าสุด", + "@healthDaysWithRecord": { + "description": "Consistency tile caption" + }, + "healthToday": "วันนี้", + "@healthToday": { + "description": "Word 'Today' used as a day label" + }, + "healthRowHeartRate": "อัตราการเต้นหัวใจ", + "@healthRowHeartRate": { + "description": "Vitals row label: heart rate range" + }, + "healthRowSkinTemp": "อุณหภูมิผิว", + "@healthRowSkinTemp": { + "description": "Vitals row label: skin temperature" + }, + "healthVsOwnNights": "เทียบคืนก่อน ๆ ของคุณ", + "@healthVsOwnNights": { + "description": "Skin temperature row sub-label, no dated night" + }, + "healthVsOwnNightsOn": "เทียบคืนก่อน ๆ ของคุณ · {day}", + "@healthVsOwnNightsOn": { + "description": "Skin temperature row sub-label with a dated night", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "healthRowWearTime": "เวลาสวมใส่", + "@healthRowWearTime": { + "description": "Vitals row label: wear time" + }, + "healthTheDay": "วันนั้น", + "@healthTheDay": { + "description": "Phrase 'the day' used in the wear-time coverage sentence when today" + }, + "healthCoverageOf": "{pct}% ของ{day}", + "@healthCoverageOf": { + "description": "Wear-time coverage sentence: N% of the day / of a named day", + "placeholders": { + "pct": { + "type": "int" + }, + "day": { + "type": "String" + } + } + }, + "healthNothingMeasuredDay": "ไม่มีค่าที่วัดได้สำหรับวันนี้", + "@healthNothingMeasuredDay": { + "description": "Vitals empty-state title: nothing measured this day" + }, + "healthNoBandRecordings": "ไม่มีข้อมูลจากสายรัดของวันนี้", + "@healthNoBandRecordings": { + "description": "Vitals empty-state body" + }, + "healthSyncTheBand": "ซิงค์สายรัด", + "@healthSyncTheBand": { + "description": "Vitals empty-state fix button: sync the band" + }, + "healthDeepDivesTitle": "ดูเชิงลึก", + "@healthDeepDivesTitle": { + "description": "Section title: Deep dives" + }, + "healthHeartRateVariability": "ความแปรปรวนของอัตราการเต้นหัวใจ", + "@healthHeartRateVariability": { + "description": "Deep-dive card title: heart rate variability" + }, + "healthTimeFrequencyNonLinear": "เวลา ความถี่ และไม่เชิงเส้น", + "@healthTimeFrequencyNonLinear": { + "description": "Deep-dive card subtitle" + }, + "healthRmssdOfLastNights": "HRV จาก {have} ใน {days} คืนล่าสุด", + "@healthRmssdOfLastNights": { + "description": "HRV preview chart title: RMSSD, N of the last M nights", + "placeholders": { + "have": { + "type": "int" + }, + "days": { + "type": "int" + } + } + }, + "healthNightsAgo": "{n} คืนที่แล้ว", + "@healthNightsAgo": { + "description": "HRV preview chart x-axis label: N nights ago", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "healthOneNightNotTrend": "คืนเดียวยังไม่เป็นแนวโน้ม", + "@healthOneNightNotTrend": { + "description": "HRV preview chart empty message when fewer than two nights are stored" + }, + "healthMeasuresWithHistory": "ค่าที่มีประวัติเก็บไว้ในอุปกรณ์นี้", + "@healthMeasuresWithHistory": { + "description": "Explore tab consistency tile caption" + }, + "healthEachOneOpens": "เปิดแต่ละรายการเพื่อดูกราฟ ช่วงปกติของคุณ และวิธีคำนวณ", + "@healthEachOneOpens": { + "description": "Explore tab intro line explaining what a tap gets you" + }, + "healthCatHeartRhythm": "หัวใจและจังหวะ", + "@healthCatHeartRhythm": { + "description": "Explore catalogue category title: Heart & rhythm" + }, + "healthCatBreathing": "การหายใจ", + "@healthCatBreathing": { + "description": "Explore catalogue category title: Breathing" + }, + "healthCatMovementLoad": "การเคลื่อนไหวและภาระ", + "@healthCatMovementLoad": { + "description": "Explore catalogue category title: Movement & load" + }, + "healthCatBodyWear": "ร่างกายและการสวมใส่", + "@healthCatBodyWear": { + "description": "Explore catalogue category title: Body & wear" + }, + "healthBlurbRestingHr": "อัตราต่ำสุดต่อเนื่องในคืนนั้น", + "@healthBlurbRestingHr": { + "description": "Explore catalogue one-line description for resting heart rate" + }, + "healthBlurbHrv": "ช่วงเวลาระหว่างจังหวะหัวใจแปรปรวนเพียงใดขณะหลับ", + "@healthBlurbHrv": { + "description": "Explore catalogue one-line description for HRV: the nightly mean of the RMSSDs of the sleep session's 5-minute windows" + }, + "healthBlurbHrvCv": "HRV คงที่เพียงใดภายในคืนเดียว", + "@healthBlurbHrvCv": { + "description": "Explore catalogue one-line description for HRV stability: within-night SDNN as a percentage of the mean beat interval (not a night-to-night variability)" + }, + "healthBlurbLfHf": "การกระจายกำลังของช่วงเวลาจังหวะหัวใจในแต่ละความถี่", + "@healthBlurbLfHf": { + "description": "Explore catalogue one-line description for LF/HF" + }, + "healthBlurbDip": "อัตราการเต้นหัวใจลดลงเพียงใดขณะหลับ", + "@healthBlurbDip": { + "description": "Explore catalogue one-line description for heart-rate dip" + }, + "healthBlurbHrr": "ลดลงเร็วเพียงใดในหนึ่งนาทีหลังออกแรง", + "@healthBlurbHrr": { + "description": "Explore catalogue one-line description for heart-rate recovery" + }, + "healthBlurbSleep": "เวลาหลับจากการเคลื่อนไหวและช่วงเวลาจังหวะหัวใจ", + "@healthBlurbSleep": { + "description": "Explore catalogue one-line description for sleep duration" + }, + "healthBlurbEfficiency": "สัดส่วนเวลาหลับต่อเวลาบนเตียง", + "@healthBlurbEfficiency": { + "description": "Explore catalogue one-line description for sleep efficiency" + }, + "healthBlurbDeep": "ความราบของอัตราการเต้นหัวใจใน NREM", + "@healthBlurbDeep": { + "description": "Explore catalogue one-line description for deep sleep" + }, + "healthBlurbRem": "แบ่งระยะจากความแปรปรวนของจังหวะหัวใจและการเคลื่อนไหว", + "@healthBlurbRem": { + "description": "Explore catalogue one-line description for REM sleep" + }, + "healthBlurbNapMin": "การนอนที่ตรวจพบนอกช่วงนอนหลัก", + "@healthBlurbNapMin": { + "description": "Explore catalogue one-line description for nap minutes" + }, + "healthBlurbRespRate": "ครั้งต่อนาที คำนวณจากช่วงเวลาจังหวะหัวใจ", + "@healthBlurbRespRate": { + "description": "Explore catalogue one-line description for respiratory rate" + }, + "healthBlurbBrv": "อัตรานี้แปรปรวนเพียงใดตลอดคืน", + "@healthBlurbBrv": { + "description": "Explore catalogue one-line description for breathing rate variability" + }, + "healthBlurbSpo2": "ค่าของ WHOOP เองที่นำเข้ามา", + "@healthBlurbSpo2": { + "description": "Explore catalogue one-line description for imported blood oxygen" + }, + "healthBlurbSteps": "นับด้วยเครื่องนับก้าว ไม่ใช้แบบจำลองประมาณ", + "@healthBlurbSteps": { + "description": "Explore catalogue one-line description for steps" + }, + "healthBlurbActiveMin": "นาทีของปริมาณการเคลื่อนไหว ไม่ใช่การเคลื่อนที่", + "@healthBlurbActiveMin": { + "description": "Explore catalogue one-line description for active minutes" + }, + "healthBlurbCalories": "พลังงานจากกิจกรรม คำนวณด้วยอัตราการเต้นหัวใจและโปรไฟล์", + "@healthBlurbCalories": { + "description": "Explore catalogue one-line description for calories" + }, + "healthBlurbStrain": "ภาระต่อระบบหัวใจและหลอดเลือดตลอดวัน ช่วง 0–21", + "@healthBlurbStrain": { + "description": "Explore catalogue one-line description for strain" + }, + "healthBlurbTrimp": "คะแนนหัวใจไม่จำกัดเพดาน ความหนักคือมุมมองช่วง 0–21", + "@healthBlurbTrimp": { + "description": "Explore catalogue one-line description for TRIMP" + }, + "healthBlurbSkinTemp": "ความต่างจากคืนล่าสุด ๆ ของคุณ", + "@healthBlurbSkinTemp": { + "description": "Explore catalogue one-line description for skin temperature" + }, + "healthBlurbWear": "นาทีที่มีข้อมูลจากสายรัด", + "@healthBlurbWear": { + "description": "Explore catalogue one-line description for wear time" + }, + "healthNothingMeasuredHere": "ยังไม่มีค่าที่วัดได้ที่นี่", + "@healthNothingMeasuredHere": { + "description": "Explore family empty-state title when no row in the family has history" + }, + "healthNotMeasuredYet": "ยังไม่ได้วัด", + "@healthNotMeasuredYet": { + "description": "Explore family empty-state title when some rows in the family have history" + }, + "healthNoDayProduced": "ยังไม่มีวันใดบนอุปกรณ์นี้คำนวณค่านี้ได้", + "@healthNoDayProduced": { + "description": "Explore family empty-state trailing sentence" + }, + "healthNoLabResults": "ไม่มีผลแล็บ", + "@healthNoLabResults": { + "description": "Labs tab empty-state title" + }, + "healthNoLabResultsBody": "ยังไม่ได้บันทึก สิ่งที่เพิ่มที่นี่จะอยู่ในอุปกรณ์นี้ และสิ่งที่ลบจะถูกนำออกจากอุปกรณ์", + "@healthNoLabResultsBody": { + "description": "Labs tab empty-state body" + }, + "healthLastPanel": "ชุดตรวจล่าสุด {date} · บันทึกเอง", + "@healthLastPanel": { + "description": "Labs tab footer: date of the last logged panel", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "healthMarkersYouNamed": "ตัวชี้วัดที่คุณตั้งชื่อ", + "@healthMarkersYouNamed": { + "description": "Section title over the user's custom lab markers" + }, + "healthAddAResult": "เพิ่มผลตรวจ", + "@healthAddAResult": { + "description": "Button/dialog title: add a lab result" + }, + "healthRangesDifferByLab": "ช่วงอ้างอิงต่างกันตามแล็บ ให้ใช้ช่วงในรายงานของคุณ", + "@healthRangesDifferByLab": { + "description": "Labs tab footer caveat about reference ranges" + }, + "healthRemoveMarkerFrom": "ลบ {marker} ของวันที่ {date}", + "@healthRemoveMarkerFrom": { + "description": "Accessibility label for a lab-result row's remove action", + "placeholders": { + "marker": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "healthNoReferenceInterval": "ไม่มีช่วงอ้างอิง · {date}", + "@healthNoReferenceInterval": { + "description": "Lab result row sub-label when the marker has no reference range", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "healthTypicalRange": "ช่วงทั่วไป {low}–{high} · {date}", + "@healthTypicalRange": { + "description": "Lab result row sub-label showing the typical reference range", + "placeholders": { + "low": { + "type": "String" + }, + "high": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "healthRemoveLabelFrom": "ลบ {label} ของวันที่ {date} หรือไม่?", + "@healthRemoveLabelFrom": { + "description": "Confirm-remove dialog title for a lab result", + "placeholders": { + "label": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "healthRemoveLabBody": "ค่าที่คุณบันทึกสำหรับการเก็บตัวอย่างครั้งนั้นคือ {value} {unit} จะลบออกจากอุปกรณ์นี้และย้อนกลับไม่ได้", + "@healthRemoveLabBody": { + "description": "Confirm-remove dialog body for a lab result, first sentence", + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "healthRemoveLabOlderNote": " ผลวันที่ {date} ยังอยู่ และจะแสดงแทนที่นี่", + "@healthRemoveLabOlderNote": { + "description": "Confirm-remove dialog body addendum noting an older draw remains", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "healthRemovedNoneLeft": "ลบ {label} วันที่ {date} แล้ว ไม่มีผล {label} เหลืออยู่", + "@healthRemovedNoneLeft": { + "description": "Snackbar after removing a lab result when none remain for that marker", + "placeholders": { + "label": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "healthRemovedShowingOlder": "ลบ {label} วันที่ {date} แล้ว กำลังแสดงผลวันที่ {older}", + "@healthRemovedShowingOlder": { + "description": "Snackbar after removing a lab result when an older draw now shows instead", + "placeholders": { + "label": { + "type": "String" + }, + "date": { + "type": "String" + }, + "older": { + "type": "String" + } + } + }, + "healthRemoveTheMarker": "ลบตัวชี้วัด {label}", + "@healthRemoveTheMarker": { + "description": "Accessibility label for removing a custom marker definition", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "healthNothingLoggedUnderIt": "ไม่มีผลที่บันทึกไว้ในตัวชี้วัดนี้", + "@healthNothingLoggedUnderIt": { + "description": "Custom marker row sub-label when it holds zero results" + }, + "healthResultsCount": "{n, plural, other{{n} ผลตรวจ · {unit}}}", + "@healthResultsCount": { + "description": "Custom marker row sub-label: N results, ICU plural", + "placeholders": { + "n": { + "type": "int" + }, + "unit": { + "type": "String" + } + } + }, + "healthStillHoldsResults": "{count, plural, other{{label} ยังมีผลตรวจ {count} รายการ โปรดลบผลก่อน เพราะตัวชี้วัดใช้ระบุชื่อผลเหล่านั้น}}", + "@healthStillHoldsResults": { + "description": "Snackbar refusing to remove a marker definition that still holds results, ICU plural", + "placeholders": { + "count": { + "type": "int" + }, + "label": { + "type": "String" + } + } + }, + "healthRemoveMarkerQ": "ลบ {label} หรือไม่?", + "@healthRemoveMarkerQ": { + "description": "Confirm-remove dialog title for a custom marker definition", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "healthRemoveMarkerBody": "จะนำออกจากรายการตัวชี้วัดและบันทึกค่านี้ไม่ได้อีก ไม่มีค่าที่วัดถูกลบไปด้วย เพราะยังไม่มีผลในรายการนี้", + "@healthRemoveMarkerBody": { + "description": "Confirm-remove dialog body for a custom marker definition" + }, + "healthMarkerLabel": "ตัวชี้วัด", + "@healthMarkerLabel": { + "description": "Add-result dialog: accessibility label for the marker dropdown" + }, + "healthValueUnit": "ค่า ({unit})", + "@healthValueUnit": { + "description": "Add-result dialog: value field label with unit", + "placeholders": { + "unit": { + "type": "String" + } + } + }, + "healthDateDrawn": "วันที่เก็บตัวอย่าง (YYYY-MM-DD)", + "@healthDateDrawn": { + "description": "Add-result dialog: date field label" + }, + "healthValueMustBeNumber": "ค่าต้องเป็นตัวเลขเท่านั้น ไม่รวมหน่วย ยังไม่ได้บันทึก", + "@healthValueMustBeNumber": { + "description": "Add-result dialog validation error: value must be a plain number" + }, + "healthDateFormatError": "วันที่ต้องเป็นรูปแบบ YYYY-MM-DD ยังไม่ได้บันทึก", + "@healthDateFormatError": { + "description": "Add-result dialog validation error: date format" + }, + "healthDateInFuture": "วันที่นั้นอยู่หลังวันนี้ ยังไม่ได้บันทึก", + "@healthDateInFuture": { + "description": "Add-result dialog validation error: draw date after today" + }, + "healthCouldNotSaveIt": "บันทึกไม่ได้: {error}", + "@healthCouldNotSaveIt": { + "description": "Add-result dialog snackbar on save failure", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "homeStepSensorStrapPhone": "สายรัด + โทรศัพท์", + "@homeStepSensorStrapPhone": { + "description": "Step count sensor label: both the strap and phone counted." + }, + "homeStepSensorStrap": "สายรัด", + "@homeStepSensorStrap": { + "description": "Step count sensor label: the strap counted." + }, + "homeStepSensorPhone": "โทรศัพท์", + "@homeStepSensorPhone": { + "description": "Step count sensor label: the phone counted." + }, + "homeOvernightBuilding": "กำลังคำนวณข้อมูลเมื่อคืน", + "@homeOvernightBuilding": { + "description": "Home ring gap reason: last night's data is still being derived." + }, + "homeOvernightNothingYet": "ยังไม่มีข้อมูลเมื่อคืนมาถึงแอป", + "@homeOvernightNothingYet": { + "description": "Home ring gap reason: nothing from last night has synced yet." + }, + "homeMonthJanuary": "มกราคม", + "@homeMonthJanuary": { + "description": "Full month name: January, used in the Home date line." + }, + "homeMonthFebruary": "กุมภาพันธ์", + "@homeMonthFebruary": { + "description": "Full month name: February, used in the Home date line." + }, + "homeMonthMarch": "มีนาคม", + "@homeMonthMarch": { + "description": "Full month name: March, used in the Home date line." + }, + "homeMonthApril": "เมษายน", + "@homeMonthApril": { + "description": "Full month name: April, used in the Home date line." + }, + "homeMonthMay": "พฤษภาคม", + "@homeMonthMay": { + "description": "Full month name: May, used in the Home date line." + }, + "homeMonthJune": "มิถุนายน", + "@homeMonthJune": { + "description": "Full month name: June, used in the Home date line." + }, + "homeMonthJuly": "กรกฎาคม", + "@homeMonthJuly": { + "description": "Full month name: July, used in the Home date line." + }, + "homeMonthAugust": "สิงหาคม", + "@homeMonthAugust": { + "description": "Full month name: August, used in the Home date line." + }, + "homeMonthSeptember": "กันยายน", + "@homeMonthSeptember": { + "description": "Full month name: September, used in the Home date line." + }, + "homeMonthOctober": "ตุลาคม", + "@homeMonthOctober": { + "description": "Full month name: October, used in the Home date line." + }, + "homeMonthNovember": "พฤศจิกายน", + "@homeMonthNovember": { + "description": "Full month name: November, used in the Home date line." + }, + "homeMonthDecember": "ธันวาคม", + "@homeMonthDecember": { + "description": "Full month name: December, used in the Home date line." + }, + "homeMonthJanuaryShort": "ม.ค.", + "@homeMonthJanuaryShort": { + "description": "Abbreviated month name: January, for compact date chips (e.g. \"Tue 11 Jan\")." + }, + "homeMonthFebruaryShort": "ก.พ.", + "@homeMonthFebruaryShort": { + "description": "Abbreviated month name: February, for compact date chips." + }, + "homeMonthMarchShort": "มี.ค.", + "@homeMonthMarchShort": { + "description": "Abbreviated month name: March, for compact date chips." + }, + "homeMonthAprilShort": "เม.ย.", + "@homeMonthAprilShort": { + "description": "Abbreviated month name: April, for compact date chips." + }, + "homeMonthMayShort": "พ.ค.", + "@homeMonthMayShort": { + "description": "Abbreviated month name: May, for compact date chips." + }, + "homeMonthJuneShort": "มิ.ย.", + "@homeMonthJuneShort": { + "description": "Abbreviated month name: June, for compact date chips." + }, + "homeMonthJulyShort": "ก.ค.", + "@homeMonthJulyShort": { + "description": "Abbreviated month name: July, for compact date chips." + }, + "homeMonthAugustShort": "ส.ค.", + "@homeMonthAugustShort": { + "description": "Abbreviated month name: August, for compact date chips." + }, + "homeMonthSeptemberShort": "ก.ย.", + "@homeMonthSeptemberShort": { + "description": "Abbreviated month name: September, for compact date chips." + }, + "homeMonthOctoberShort": "ต.ค.", + "@homeMonthOctoberShort": { + "description": "Abbreviated month name: October, for compact date chips." + }, + "homeMonthNovemberShort": "พ.ย.", + "@homeMonthNovemberShort": { + "description": "Abbreviated month name: November, for compact date chips." + }, + "homeMonthDecemberShort": "ธ.ค.", + "@homeMonthDecemberShort": { + "description": "Abbreviated month name: December, for compact date chips." + }, + "homeWeekdayMonday": "วันจันทร์", + "@homeWeekdayMonday": { + "description": "Full weekday name: Monday, used in the Home date line." + }, + "homeWeekdayTuesday": "วันอังคาร", + "@homeWeekdayTuesday": { + "description": "Full weekday name: Tuesday, used in the Home date line." + }, + "homeWeekdayWednesday": "วันพุธ", + "@homeWeekdayWednesday": { + "description": "Full weekday name: Wednesday, used in the Home date line." + }, + "homeWeekdayThursday": "วันพฤหัสบดี", + "@homeWeekdayThursday": { + "description": "Full weekday name: Thursday, used in the Home date line." + }, + "homeWeekdayFriday": "วันศุกร์", + "@homeWeekdayFriday": { + "description": "Full weekday name: Friday, used in the Home date line." + }, + "homeWeekdaySaturday": "วันเสาร์", + "@homeWeekdaySaturday": { + "description": "Full weekday name: Saturday, used in the Home date line." + }, + "homeWeekdaySunday": "วันอาทิตย์", + "@homeWeekdaySunday": { + "description": "Full weekday name: Sunday, used in the Home date line." + }, + "homeReadinessNotScored": "ยังไม่มีคะแนน", + "@homeReadinessNotScored": { + "description": "Readiness band label when there is no score." + }, + "homeReadinessGoodToGo": "พร้อมลุย", + "@homeReadinessGoodToGo": { + "description": "Readiness band label, top tier." + }, + "homeReadinessSteady": "คงที่", + "@homeReadinessSteady": { + "description": "Readiness band label, second-highest tier." + }, + "homeReadinessTakeItEasy": "ค่อยเป็นค่อยไป", + "@homeReadinessTakeItEasy": { + "description": "Readiness band label, second-lowest tier." + }, + "homeReadinessRestToday": "พักวันนี้", + "@homeReadinessRestToday": { + "description": "Readiness band label, lowest tier." + }, + "homeDriverHrv": "HRV", + "@homeDriverHrv": { + "description": "Readiness driver name: heart rate variability, shown in the Why? row on Home." + }, + "homeDriverRhr": "อัตราการเต้นหัวใจขณะพัก", + "@homeDriverRhr": { + "description": "Readiness driver name: resting heart rate, shown in the Why? row on Home." + }, + "homeDriverResp": "อัตราการหายใจ", + "@homeDriverResp": { + "description": "Readiness driver name: breathing rate, shown in the Why? row on Home." + }, + "homeDriverTemp": "อุณหภูมิผิว", + "@homeDriverTemp": { + "description": "Readiness driver name: skin temperature, shown in the Why? row on Home." + }, + "homeDbRebuiltTitle": "สร้างฐานข้อมูลใหม่เพื่อให้แอปเริ่มทำงาน", + "@homeDbRebuiltTitle": { + "description": "Title of the card shown when the local database had to be rebuilt to start the app." + }, + "homeDbRebuiltNothingRecovered": "อ่านข้อมูลกลับมาไม่ได้", + "@homeDbRebuiltNothingRecovered": { + "description": "Database-rebuilt card: nothing could be salvaged from the old file." + }, + "homeDbRebuiltRecovered": "กู้คืนแล้ว: {list}", + "@homeDbRebuiltRecovered": { + "description": "Database-rebuilt card: list of tables and row counts that were recovered.", + "placeholders": { + "list": { + "type": "String", + "example": "sleep 42 · workouts 3" + } + } + }, + "homeDbRebuiltEmpty": "ว่าง: {list}", + "@homeDbRebuiltEmpty": { + "description": "Database-rebuilt card: list of tables that came back empty.", + "placeholders": { + "list": { + "type": "String", + "example": "nutrition" + } + } + }, + "homeDbRebuiltKept": "เก็บไฟล์เดิมไว้ที่ {path} ไม่มีการลบข้อมูล", + "@homeDbRebuiltKept": { + "description": "Database-rebuilt card: reassurance that the original file was kept, with its path.", + "placeholders": { + "path": { + "type": "String", + "example": "/data/quarantine/old.db" + } + } + }, + "homeWorkoutHoldTitle": "การออกกำลังกายยังดำเนินอยู่", + "@homeWorkoutHoldTitle": { + "description": "Title of the card shown on Home while a workout session is live and derivation is paused." + }, + "homeWorkoutHoldBody": "พักการประมวลผลวันนี้ไว้ขณะออกกำลังกาย สายรัดยังบันทึกอยู่ จบการออกกำลังกายจากแถบด้านล่างเพื่อให้ข้อมูลวันนี้เติมเข้ามา", + "@homeWorkoutHoldBody": { + "description": "Body of the card shown on Home while a workout session is live and derivation is paused." + }, + "homeInsightsRebuildingTitle": "กำลังสร้างข้อสังเกตข้ามวันใหม่", + "@homeInsightsRebuildingTitle": { + "description": "Title of the card shown when the cross-day insights rollup was withheld rather than shown." + }, + "homeInsightsRebuildingAlgoVersion": "อัปเดตล่าสุดเปลี่ยนวิธีคำนวณข้อมูลเหล่านี้", + "@homeInsightsRebuildingAlgoVersion": { + "description": "Reason the cross-day rollup is being rebuilt: the algorithm version changed." + }, + "homeInsightsStaleOverWeek": "อัปเดตแนวโน้มล่าสุดเกินหนึ่งสัปดาห์แล้ว ซิงค์สายรัดเพื่ออัปเดต", + "@homeInsightsStaleOverWeek": { + "description": "Reason the cross-day rollup is being rebuilt: the last rollup is more than a week old." + }, + "homeInsightsStaleOnDay": "อัปเดตแนวโน้มล่าสุดเมื่อ {day} ซิงค์สายรัดเพื่ออัปเดต", + "@homeInsightsStaleOnDay": { + "description": "Reason the cross-day rollup is being rebuilt: names the day the last rollup was built.", + "placeholders": { + "day": { + "type": "String", + "example": "Saturday, 20 May" + } + } + }, + "homeInsightsNoVersionStamp": "กำลังอัปเดตแนวโน้มของคุณ ใช้เวลาประมาณหนึ่งนาทีหลังซิงค์", + "@homeInsightsNoVersionStamp": { + "description": "Reason the cross-day rollup is being rebuilt: the stored rollup has no version stamp." + }, + "homeSyncBand": "ซิงค์สายรัด", + "@homeSyncBand": { + "description": "Call-to-action button label: sync the band." + }, + "homeWhyLabel": "เพราะอะไร?", + "@homeWhyLabel": { + "description": "Short label introducing the readiness driver list on Home." + }, + "homeCalibrating": "กำลังเรียนรู้ช่วงปกติของคุณ", + "@homeCalibrating": { + "description": "Ring value shown while a metric is still building its baseline." + }, + "homeCalibratingNights": "{have} จาก {need} คืน", + "@homeCalibratingNights": { + "description": "Calibration progress caption under a ring, counted in nights.", + "placeholders": { + "have": { + "type": "int" + }, + "need": { + "type": "int" + } + } + }, + "homeCalibratingDays": "{have} จาก {need} วัน", + "@homeCalibratingDays": { + "description": "Calibration progress caption under a ring, counted in days.", + "placeholders": { + "have": { + "type": "int" + }, + "need": { + "type": "int" + } + } + }, + "homeGapNoReason": "ไม่มีข้อมูลระบุว่าเหตุใดจึงไม่มีค่านี้", + "@homeGapNoReason": { + "description": "Fallback reason shown when a ring is empty and nothing explains why." + }, + "homeRingRecovery": "การฟื้นตัว", + "@homeRingRecovery": { + "description": "Home ring label: Recovery (readiness)." + }, + "homeRingStrain": "ความหนัก", + "@homeRingStrain": { + "description": "Home ring label: Strain." + }, + "homeRingSleep": "การนอน", + "@homeRingSleep": { + "description": "Home ring label: Sleep." + }, + "homeRingNoStrain": "ไม่มีค่าความหนัก", + "@homeRingNoStrain": { + "description": "Strain ring value when there is no strain reading." + }, + "homeRingNoSleep": "ไม่มีข้อมูลการนอน", + "@homeRingNoSleep": { + "description": "Sleep ring value when there is no sleep reading." + }, + "homeSleepGapFallback": "ไม่ได้บันทึกคืนที่นอนนานพอให้คำนวณคะแนน", + "@homeSleepGapFallback": { + "description": "Fallback reason the sleep ring is empty: no night long enough to score." + }, + "homeStrainOf21": "จาก 21", + "@homeStrainOf21": { + "description": "Strain ring subtitle: out of the fixed 21-point scale." + }, + "homeSleepNoTarget": "ยังไม่มีเป้าหมาย", + "@homeSleepNoTarget": { + "description": "Sleep ring subtitle when no computed sleep-need target exists yet." + }, + "homeOfSpan": "จาก {duration}", + "@homeOfSpan": { + "description": "Sleep ring subtitle: duration measured against a computed sleep-need target.", + "placeholders": { + "duration": { + "type": "String", + "example": "7h 45m" + } + } + }, + "homeLoadFailedTitle": "อ่านข้อมูลวันนี้ไม่ได้", + "@homeLoadFailedTitle": { + "description": "Title of the card shown when today's data failed to load from the database." + }, + "homeLoadFailedBody": "โหลดข้อมูลประจำวันที่เก็บไว้ไม่สำเร็จ ไม่มีการลบข้อมูล เป็นข้อผิดพลาดในการอ่าน ไม่ใช่ข้อมูลสูญหาย", + "@homeLoadFailedBody": { + "description": "Body of the card shown when today's data failed to load from the database." + }, + "homeDayLoadFailedTitle": "อ่านข้อมูล {day} ไม่ได้", + "@homeDayLoadFailedTitle": { + "description": "Title of the card shown on Home when a past day picked with the day switcher failed to load from the database.", + "placeholders": { + "day": { + "type": "String", + "example": "Wednesday, 15 October" + } + } + }, + "wellnessLoadFailedTitle": "อ่านข้อมูลนี้ไม่ได้", + "@wellnessLoadFailedTitle": { + "description": "Title of the card shown when the Wellness screen or the sleep plan failed to load from the database." + }, + "wellnessLoadFailedBody": "อ่านข้อมูลที่เก็บไว้ไม่สำเร็จ ไม่มีการลบข้อมูล เป็นข้อผิดพลาดในการอ่าน ไม่ใช่ข้อมูลสูญหาย", + "@wellnessLoadFailedBody": { + "description": "Body of the card shown when the Wellness screen or the sleep plan failed to load from the database." + }, + "homeTryAgain": "ลองอีกครั้ง", + "@homeTryAgain": { + "description": "Button label to retry loading today's data." + }, + "homeNothingDerivedTitle": "ยังไม่มีคืนที่คำนวณคะแนนแล้ว", + "@homeNothingDerivedTitle": { + "description": "Title shown on a first-run day with nothing derived yet." + }, + "homeNothingDerivedBody": "สวมสายรัดคืนนี้ แล้วเปิดแอปตอนเช้า", + "@homeNothingDerivedBody": { + "description": "Body shown on a first-run day with nothing derived yet." + }, + "homeSyncedThrough": "ซิงค์ถึง {when}", + "@homeSyncedThrough": { + "description": "Home header line: how far the data we hold reaches, on the band's own clock. {when} is a bare HH:mm when the record is from the day already on screen, or a full day + time otherwise.", + "placeholders": { + "when": { + "type": "String", + "example": "11:06" + } + } + }, + "homeSyncedNever": "ยังไม่มีข้อมูลสายรัด", + "@homeSyncedNever": { + "description": "Home header line when no record has ever been banked from a band." + }, + "homeSyncingTitle": "กำลังซิงค์กับสายรัดของคุณ", + "@homeSyncingTitle": { + "description": "Title shown on a bare day while records are actively arriving from the band." + }, + "homeSyncingBody": "กำลังดึงข้อมูล หากมีข้อมูลสะสมมากอาจใช้เวลาหลายนาที", + "@homeSyncingBody": { + "description": "Body shown on a bare day while records are actively arriving from the band." + }, + "homeAnalyzingTitle": "กำลังคำนวณข้อมูลเมื่อคืน", + "@homeAnalyzingTitle": { + "description": "Title shown on a bare day once the backlog has landed and a derive job is computing today's numbers." + }, + "homeAnalyzingBody": "ได้รับข้อมูลแล้ว ต่อไปคือการนอน การฟื้นตัว และความหนัก", + "@homeAnalyzingBody": { + "description": "Body shown on a bare day once the backlog has landed and a derive job is computing today's numbers." + }, + "homeConnectingTitle": "กำลังเชื่อมต่อสายรัดของคุณ", + "@homeConnectingTitle": { + "description": "Title shown right after tapping Sync the band, before any record has arrived yet." + }, + "homeConnectingBody": "รอสักครู่ โดยปกติใช้เวลาไม่กี่วินาที", + "@homeConnectingBody": { + "description": "Body shown right after tapping Sync the band, before any record has arrived yet." + }, + "homeAskCoach": "ถามโค้ช", + "@homeAskCoach": { + "description": "Semantic label for the button that opens the AI coach on Home." + }, + "homeProfileSettings": "โปรไฟล์และการตั้งค่า", + "@homeProfileSettings": { + "description": "Semantic label for the avatar button that opens Profile and settings." + }, + "homeNothingTodayTitle": "ยังไม่มีข้อมูลที่บันทึกสำหรับวันนี้", + "@homeNothingTodayTitle": { + "description": "Title shown when there is history but nothing recorded for today." + }, + "homeNothingTodayBody": "คืนล่าสุดที่แอปคำนวณคะแนนคือ {day} ยังไม่มีข้อมูลเข้ามาหลังจากนั้น", + "@homeNothingTodayBody": { + "description": "Body shown when there is history but nothing recorded for today, naming the last scored night.", + "placeholders": { + "day": { + "type": "String", + "example": "Saturday, 20 May" + } + } + }, + "homeNoDataThisDayTitle": "ไม่มีข้อมูลของวันนี้", + "@homeNoDataThisDayTitle": { + "description": "Today tab, stepped back to a past day: title shown when that day has nothing recorded." + }, + "homeNoDataThisDayBody": "วันนี้ไม่ได้บันทึกข้อมูล", + "@homeNoDataThisDayBody": { + "description": "Today tab, stepped back to a past day: body shown when that day has nothing recorded." + }, + "homeSomeDayDataMissingTitle": "ข้อมูลบางส่วนของวันนี้ขาดหาย", + "@homeSomeDayDataMissingTitle": { + "description": "Today tab, stepped back to a past day: one card listing every missing reading and why." + }, + "homeReadinessNotScoredTitle": "วันนี้ยังไม่มีคะแนนการฟื้นตัว", + "@homeReadinessNotScoredTitle": { + "description": "Title of the card shown when readiness has no score today." + }, + "homeReadinessNeedBody": "{need} เพื่อเรียนรู้ว่าค่าปกติของคุณเป็นอย่างไร", + "@homeReadinessNeedBody": { + "description": "Body of the readiness-not-scored card, naming what is still needed.", + "placeholders": { + "need": { + "type": "String", + "example": "Needs 2 more nights" + } + } + }, + "homeReadinessNoReason": "ไม่มีข้อมูลระบุเหตุผล", + "@homeReadinessNoReason": { + "description": "Fallback body of the readiness-not-scored card when no reason is recorded." + }, + "homeSeeWhatWasMissing": "ดูข้อมูลที่ขาด", + "@homeSeeWhatWasMissing": { + "description": "Button label opening the readiness detail screen to see what was missing." + }, + "homeAtAGlance": "ดูคร่าว ๆ", + "@homeAtAGlance": { + "description": "Section title on Home for the row of signal cards (heart rate, steps, energy)." + }, + "homeTodaysPlan": "แผนวันนี้", + "@homeTodaysPlan": { + "description": "Section title on Home for the day's remaining plan items." + }, + "homeBreakdownTitle": "รายละเอียดวันของคุณ", + "@homeBreakdownTitle": { + "description": "Link row title: opens the hour-by-hour breakdown of the day." + }, + "homeBreakdownSubtitle": "รายชั่วโมง", + "@homeBreakdownSubtitle": { + "description": "Link row subtitle under the breakdown-of-your-day title." + }, + "homeBriefingTitle": "สรุปประจำวัน", + "@homeBriefingTitle": { + "description": "Link row title under Today's plan: opens the AI briefing screen. Constant regardless of morning/evening period." + }, + "homeBriefingSubtitleEmpty": "แตะเพื่อเขียนสรุปวันนี้", + "@homeBriefingSubtitleEmpty": { + "description": "Link row subtitle under the briefing title when nothing has been generated for today yet." + }, + "homeIllnessRedTitle": "หลายคืนล่าสุดแสดงอัตราการเต้นหัวใจขณะพักสูงขึ้น", + "@homeIllnessRedTitle": { + "description": "Illness watch headline in the red state: accumulated evidence of a raised resting heart rate, which one very high night can produce. Must not claim consecutive nights." + }, + "homeIllnessAmberSameNight": "เมื่อคืนอยู่นอกช่วงปกติของคุณ", + "@homeIllnessAmberSameNight": { + "description": "Illness watch headline when last night sat outside the normal range (amber state, same night)." + }, + "homeIllnessAmberOtherNight": "{day} อยู่นอกช่วงปกติของคุณ", + "@homeIllnessAmberOtherNight": { + "description": "Illness watch headline naming a specific past night that sat outside the normal range.", + "placeholders": { + "day": { + "type": "String", + "example": "Saturday, 20 May" + } + } + }, + "homeIllnessBodyNoZ": "อัตราการเต้นหัวใจขณะพักสูงกว่าปกติในหลายคืนล่าสุด ติดตามสัญญาณเดียว จึงแสดงรูปแบบ ไม่ใช่สาเหตุ", + "@homeIllnessBodyNoZ": { + "description": "Illness watch body text when no standardised-deviation figure is available." + }, + "homeIllnessBodyAbove": "หลายคืนล่าสุดแสดงอัตราการเต้นหัวใจขณะพักสูงกว่าปกติ คืนนั้นสูงกว่าอยู่ {z} เท่าของความผันผวนระหว่างคืน เป็นรูปแบบ ไม่ใช่สาเหตุ", + "@homeIllnessBodyAbove": { + "description": "Illness watch body text when the flagged night's heart rate sat above baseline, with the deviation amount.", + "placeholders": { + "z": { + "type": "String", + "example": "1.8" + } + } + }, + "homeIllnessBodyBelow": "หลายคืนล่าสุดรวมกันแสดงอัตราการเต้นหัวใจขณะพักสูงกว่าปกติ แม้คืนนั้นเพียงคืนเดียวจะต่ำกว่าอยู่ {z} เท่าของความผันผวนระหว่างคืน เป็นรูปแบบ ไม่ใช่สาเหตุ", + "@homeIllnessBodyBelow": { + "description": "Illness watch body text when the flagged night's heart rate sat below baseline, with the deviation amount.", + "placeholders": { + "z": { + "type": "String", + "example": "1.8" + } + } + }, + "homeIllnessAdvice": "ควรสังเกตหากเป็นต่อเนื่องเกินสองสามวัน", + "@homeIllnessAdvice": { + "description": "Illness watch advice line." + }, + "homeHeartRate": "อัตราการเต้นหัวใจ", + "@homeHeartRate": { + "description": "Signal card title: Heart rate." + }, + "homeRestingSub": "ขณะพัก", + "@homeRestingSub": { + "description": "Signal card subtitle: Resting, under the heart rate reading." + }, + "homeNoRestingHr": "ไม่มีอัตราการเต้นหัวใจขณะพัก", + "@homeNoRestingHr": { + "description": "Title of the empty-state card when there is no resting heart rate." + }, + "homeNoRestingHrWhy": "อ่านอัตราการเต้นหัวใจขณะพักจากการนอน แต่ยังไม่ได้บันทึกการนอน", + "@homeNoRestingHrWhy": { + "description": "Reason shown when resting heart rate is absent because no sleep was recorded." + }, + "homeSteps": "ก้าว", + "@homeSteps": { + "description": "Signal card title: Steps." + }, + "homeStepsNone": "ไม่มี", + "@homeStepsNone": { + "description": "Steps card value when no step count was recorded at all." + }, + "homeStepsNotRecorded": "ไม่ได้บันทึก", + "@homeStepsNotRecorded": { + "description": "Steps card subtitle when nothing counted steps at all." + }, + "homeStepsPercentGoal": "{pct}% ของเป้าหมาย", + "@homeStepsPercentGoal": { + "description": "Steps card subtitle: percent of the daily step goal reached.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "homeActiveEnergy": "พลังงานจากกิจกรรม", + "@homeActiveEnergy": { + "description": "Signal card title: Active energy." + }, + "homeCaloriesEstimated": "ค่าประมาณ", + "@homeCaloriesEstimated": { + "description": "Active energy card subtitle when the total is estimated." + }, + "homeCaloriesTotal": "รวม {total}", + "@homeCaloriesTotal": { + "description": "Active energy card subtitle showing the total calories for the day.", + "placeholders": { + "total": { + "type": "String", + "example": "2,340" + } + } + }, + "homeNoEnergyEstimate": "ไม่มีค่าประมาณพลังงาน", + "@homeNoEnergyEstimate": { + "description": "Title of the empty-state card when there is no energy estimate." + }, + "homeStepsLeft": "เหลือ {left} ก้าว", + "@homeStepsLeft": { + "description": "Plan row title: number of steps left to reach the goal.", + "placeholders": { + "left": { + "type": "String", + "example": "2,300" + } + } + }, + "homeMovement": "การเคลื่อนไหว", + "@homeMovement": { + "description": "Plan row category label: Movement." + }, + "homeGoalSteps": "เป้าหมาย {goal}", + "@homeGoalSteps": { + "description": "Plan row meta text: the step goal total.", + "placeholders": { + "goal": { + "type": "String", + "example": "10,000" + } + } + }, + "homeStepGoalMet": "ถึงเป้าหมายก้าวแล้ว", + "@homeStepGoalMet": { + "description": "Plan row title when the step goal has been met." + }, + "homeStrainTargetMet": "ถึงเป้าหมายความหนักแล้ว", + "@homeStrainTargetMet": { + "description": "Plan row title when the strain target has been met." + }, + "homeAimForStrain": "ตั้งเป้าความหนัก {aim}", + "@homeAimForStrain": { + "description": "Plan row title: strain target to aim for.", + "placeholders": { + "aim": { + "type": "String", + "example": "11.4" + } + } + }, + "homeTraining": "การฝึก", + "@homeTraining": { + "description": "Plan row category label: Training." + }, + "homeSleepNeedRow": "นอน {duration}", + "@homeSleepNeedRow": { + "description": "Plan row title: computed sleep need for tonight.", + "placeholders": { + "duration": { + "type": "String", + "example": "7h 45m" + } + } + }, + "homeTonight": "คืนนี้", + "@homeTonight": { + "description": "Plan row category label: Tonight." + }, + "homeNeed": "ต้องการ", + "@homeNeed": { + "description": "Plan row meta text when no bedtime has been computed yet." + }, + "homeBedTime": "เข้านอน {time}", + "@homeBedTime": { + "description": "Plan row meta text: the recommended bedtime.", + "placeholders": { + "time": { + "type": "String", + "example": "10:40 PM" + } + } + }, + "homeNoPlanTitle": "ยังไม่มีแผนสำหรับวันนี้", + "@homeNoPlanTitle": { + "description": "Title of the empty-state card when there is no plan for today yet." + }, + "homeNoPlanWhyStale": "กำลังอัปเดตแนวโน้มของคุณ ใช้เวลาประมาณหนึ่งนาทีหลังซิงค์", + "@homeNoPlanWhyStale": { + "description": "Reason there is no plan: the cross-day rollup they come from is being rebuilt." + }, + "homeNoPlanWhyNone": "ยังไม่มีค่าใดมีข้อมูลเพียงพอ", + "@homeNoPlanWhyNone": { + "description": "Reason there is no plan: no baselines are established yet." + }, + "homeGreetingStillUp": "ยังไม่นอน", + "@homeGreetingStillUp": { + "description": "Home greeting for very late night hours (before 5am)." + }, + "homeGreetingMorning": "สวัสดีตอนเช้า", + "@homeGreetingMorning": { + "description": "Home greeting for morning hours." + }, + "homeGreetingAfternoon": "สวัสดีตอนบ่าย", + "@homeGreetingAfternoon": { + "description": "Home greeting for afternoon hours." + }, + "homeGreetingEvening": "สวัสดีตอนเย็น", + "@homeGreetingEvening": { + "description": "Home greeting for evening hours." + }, + "wellnessTitle": "สุขภาวะ", + "@wellnessTitle": { + "description": "Wellness screen title" + }, + "wellnessTabMind": "จิตใจ", + "@wellnessTabMind": { + "description": "Wellness sub-tab label: Mind" + }, + "wellnessTabRecovery": "แผนการนอน", + "@wellnessTabRecovery": { + "description": "Wellness sub-tab label: Recovery" + }, + "wellnessTabHabits": "นิสัย", + "@wellnessTabHabits": { + "description": "Wellness sub-tab label: Habits" + }, + "wellnessTabMedication": "ยา", + "@wellnessTabMedication": { + "description": "Wellness sub-tab label: Medication" + }, + "wellnessTabCycle": "รอบเดือน", + "@wellnessTabCycle": { + "description": "Wellness sub-tab label: Cycle" + }, + "wellnessStartASitting": "เริ่มฝึก", + "@wellnessStartASitting": { + "description": "Hero card label to start a breathing sitting, all caps" + }, + "wellnessExercisesNoun": "แบบฝึก", + "@wellnessExercisesNoun": { + "description": "Noun for the count of breathing exercises on the start card" + }, + "wellnessPickOneAndGo": "เลือกแล้วเริ่มได้เลย", + "@wellnessPickOneAndGo": { + "description": "Start card subtitle when no breathing sitting has been done yet" + }, + "wellnessLastMinutes": "ล่าสุด: {count} นาที", + "@wellnessLastMinutes": { + "description": "Start card subtitle showing minutes of the last breathing sitting", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "wellnessWriteTheDayDown": "จดเรื่องราววันนี้", + "@wellnessWriteTheDayDown": { + "description": "Action card title opening the journal compose screen" + }, + "wellnessOpen": "เปิด", + "@wellnessOpen": { + "description": "Generic 'Open' button/CTA label on action cards" + }, + "wellnessStressLastNight": "ความเครียดเมื่อคืน", + "@wellnessStressLastNight": { + "description": "Section title for last night's stress reading" + }, + "wellnessNoStressTitle": "ไม่มีค่าความเครียดเมื่อคืน", + "@wellnessNoStressTitle": { + "description": "Status card title when there is no stress reading for last night" + }, + "wellnessNoStressBody": "อ่านความเครียดจากช่วงเวลาจังหวะหัวใจขณะพักระหว่างคืน แต่เมื่อคืนไม่สามารถหาค่าได้", + "@wellnessNoStressBody": { + "description": "Status card body explaining why there is no stress reading" + }, + "wellnessAutonomicTension": "ระดับความเครียด", + "@wellnessAutonomicTension": { + "description": "Label on the stress signal card" + }, + "wellnessStressLevelLow": "ต่ำ", + "@wellnessStressLevelLow": { + "description": "Stress card sub-label: the 'low' band (shown uppercased)" + }, + "wellnessStressLevelNormal": "ปกติ", + "@wellnessStressLevelNormal": { + "description": "Stress card sub-label: the 'normal' band (shown uppercased)" + }, + "wellnessStressLevelElevated": "สูงขึ้น", + "@wellnessStressLevelElevated": { + "description": "Stress card sub-label: the 'elevated' band (shown uppercased)" + }, + "wellnessStressLevelHigh": "สูง", + "@wellnessStressLevelHigh": { + "description": "Stress card sub-label: the 'high' band (shown uppercased)" + }, + "wellnessJournalDefaultSubtitle": "สิ่งที่คุณอยากจำเกี่ยวกับวันนี้", + "@wellnessJournalDefaultSubtitle": { + "description": "Journal subtitle when no custom fields are configured" + }, + "wellnessJournalSubtitleShort": "{fields} และข้อความบันทึก", + "@wellnessJournalSubtitleShort": { + "description": "Journal subtitle listing up to 4 field names before 'and a note'", + "placeholders": { + "fields": { + "type": "String" + } + } + }, + "wellnessJournalSubtitleLong": "{fields} และอีก {more} รายการ พร้อมข้อความบันทึก", + "@wellnessJournalSubtitleLong": { + "description": "Journal subtitle listing first 4 field names plus a count of more fields", + "placeholders": { + "fields": { + "type": "String" + }, + "more": { + "type": "int" + } + } + }, + "wellnessTurnInBy": "เข้านอนภายใน {time}", + "@wellnessTurnInBy": { + "description": "Sleep recommendation headline naming a target bedtime", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "wellnessDebtBody": "คุณนอนขาดไป {debt} เทียบกับความต้องการของตัวเอง และคืนนี้ต้องการ {need}", + "@wellnessDebtBody": { + "description": "Sleep recommendation body stating sleep debt and tonight's need", + "placeholders": { + "debt": { + "type": "String" + }, + "need": { + "type": "String" + } + } + }, + "wellnessSeeWhatLastNightCost": "ดูผลจากการนอนเมื่อคืน", + "@wellnessSeeWhatLastNightCost": { + "description": "Sleep recommendation call-to-action text" + }, + "wellnessWhatChargedAndDrained": "สิ่งที่ช่วยเติมและลดพลังของคุณ", + "@wellnessWhatChargedAndDrained": { + "description": "Section title for readiness drivers" + }, + "wellnessNoDriversTitle": "ยังไม่มีรายละเอียดการฟื้นตัว", + "@wellnessNoDriversTitle": { + "description": "Status card title when no readiness drivers are available yet" + }, + "wellnessNoDriversBody": "ต้องมีจำนวนคืนเพียงพอเพื่อเรียนรู้ค่าปกติของคุณ", + "@wellnessNoDriversBody": { + "description": "Status card body explaining readiness drivers need more nights of data" + }, + "wellnessSleepNeedTonight": "ความต้องการนอนคืนนี้", + "@wellnessSleepNeedTonight": { + "description": "Section title for tonight's sleep need" + }, + "wellnessNoSleepNeedTitle": "ยังไม่มีค่าความต้องการนอน", + "@wellnessNoSleepNeedTitle": { + "description": "Status card title when no sleep need estimate exists" + }, + "wellnessNoSleepNeedBody": "ไม่มีข้อมูลระบุว่าเหตุใดจึงไม่มีค่าความต้องการนอนคืนนี้", + "@wellnessNoSleepNeedBody": { + "description": "Status card fallback body when there is no reason recorded for missing sleep need" + }, + "wellnessTonightsNeed": "ความต้องการคืนนี้", + "@wellnessTonightsNeed": { + "description": "Metric row label for tonight's sleep need duration" + }, + "wellnessSleepDebt": "หนี้การนอน", + "@wellnessSleepDebt": { + "description": "Metric row label for accumulated sleep debt" + }, + "wellnessAddedForStrain": "เพิ่มจากความหนัก", + "@wellnessAddedForStrain": { + "description": "Metric row label for minutes added to sleep need for strain" + }, + "wellnessCreditedFromNaps": "หักจากการงีบ", + "@wellnessCreditedFromNaps": { + "description": "Metric row label for minutes credited from naps" + }, + "wellnessTargetBedtime": "เวลาเข้านอนเป้าหมาย", + "@wellnessTargetBedtime": { + "description": "Metric row label for the recommended bedtime" + }, + "wellnessTargetWake": "เวลาตื่นเป้าหมาย", + "@wellnessTargetWake": { + "description": "Metric row label for the recommended wake time" + }, + "wellnessRemoveHabitSemantic": "ลบ {label}", + "@wellnessRemoveHabitSemantic": { + "description": "Accessibility label on the trash icon that removes a habit", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "wellnessDaysYouDidIt": "วันที่คุณทำ", + "@wellnessDaysYouDidIt": { + "description": "Consistency widget label counting days a habit was done" + }, + "wellnessAddAHabit": "เพิ่มนิสัย", + "@wellnessAddAHabit": { + "description": "Button label to add a new habit, also used as the add-habit dialog title" + }, + "wellnessWhatYouLogTitle": "สิ่งที่คุณบันทึกเทียบกับค่าของคุณ", + "@wellnessWhatYouLogTitle": { + "description": "Action card title linking to journal findings analysis" + }, + "wellnessWhatYouLogSubtitle": "ปริมาณ ความต่างของนิสัย และวันในสัปดาห์", + "@wellnessWhatYouLogSubtitle": { + "description": "Action card subtitle describing what the journal findings screen covers" + }, + "wellnessRemoveHabitConfirmTitle": "ลบ {label} หรือไม่?", + "@wellnessRemoveHabitConfirmTitle": { + "description": "Confirmation sheet title asking to remove a habit", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "wellnessRemoveHabitConfirmBody": "จะหยุดถามรายการนี้ วันที่บันทึกไว้แล้วยังอยู่", + "@wellnessRemoveHabitConfirmBody": { + "description": "Confirmation sheet body explaining removing a habit keeps recorded history" + }, + "wellnessHabitHint": "เดินหลังมื้อกลางวัน", + "@wellnessHabitHint": { + "description": "Placeholder example text in the add-habit name field" + }, + "wellnessAlreadyTrack": "คุณติดตาม “{name}” อยู่แล้ว", + "@wellnessAlreadyTrack": { + "description": "Snackbar message shown when a duplicate habit/field name is entered", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "wellnessNothingScheduledTitle": "ไม่มีรายการตามกำหนด", + "@wellnessNothingScheduledTitle": { + "description": "Status card title when no medications are scheduled at all" + }, + "wellnessNothingScheduledBody": "เพิ่มสิ่งที่คุณใช้และเวลา", + "@wellnessNothingScheduledBody": { + "description": "Status card body prompting to add a medication" + }, + "wellnessAddAMedication": "เพิ่มยา", + "@wellnessAddAMedication": { + "description": "Button/fix label to add a medication, also used as the add-medication dialog title" + }, + "wellnessNothingDueTodayTitle": "วันนี้ไม่มีรายการถึงเวลา", + "@wellnessNothingDueTodayTitle": { + "description": "Status card title when medications exist but none are due today" + }, + "wellnessNothingDueTodayBody": "สิ่งที่คุณใช้มีกำหนดในวันหรือเวลาอื่น", + "@wellnessNothingDueTodayBody": { + "description": "Status card body explaining medications are scheduled for other days/times" + }, + "wellnessAdherence": "การใช้ยาตามกำหนด", + "@wellnessAdherence": { + "description": "Section title for medication adherence" + }, + "wellnessNothingToScoreTitle": "ยังไม่มีข้อมูลให้คำนวณคะแนน", + "@wellnessNothingToScoreTitle": { + "description": "Status card title when no doses have come due yet for adherence" + }, + "wellnessNothingToScoreBody": "ยังไม่มียามื้อใดถึงเวลาตามกำหนด", + "@wellnessNothingToScoreBody": { + "description": "Status card body explaining adherence has nothing to score yet" + }, + "wellnessTakenOfScheduled": "จำนวนที่ใช้แล้วจากรายการตามกำหนดในเจ็ดวันล่าสุด", + "@wellnessTakenOfScheduled": { + "description": "Consistency widget label describing doses taken vs scheduled in the last 7 days" + }, + "wellnessDosesUnit": "มื้อยา", + "@wellnessDosesUnit": { + "description": "Unit word for the adherence consistency bar, counting doses not days" + }, + "wellnessUndoSkipped": "ยกเลิกการข้าม", + "@wellnessUndoSkipped": { + "description": "Sheet action label to undo marking a dose as skipped" + }, + "wellnessSkippedOnPurpose": "ตั้งใจข้าม", + "@wellnessSkippedOnPurpose": { + "description": "Sheet action label to mark a dose as deliberately skipped" + }, + "wellnessBackToNotTaken": "กลับเป็นยังไม่ได้ใช้", + "@wellnessBackToNotTaken": { + "description": "Sheet action subtitle when undoing a skipped dose" + }, + "wellnessRecordedAsDecision": "บันทึกว่าเป็นการตัดสินใจ ไม่ใช่ลืมใช้", + "@wellnessRecordedAsDecision": { + "description": "Sheet action subtitle when marking a dose as skipped on purpose" + }, + "wellnessWhichDaysDue": "วันที่กำหนดให้ใช้", + "@wellnessWhichDaysDue": { + "description": "Sheet action label to view/edit which days a medication is due" + }, + "wellnessRemoveMedTitle": "ลบ {label}", + "@wellnessRemoveMedTitle": { + "description": "Sheet action label to remove a medication", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "wellnessRemoveMedBody": "จะหยุดกำหนดเวลา รายการที่ทำเครื่องหมายไว้ยังอยู่", + "@wellnessRemoveMedBody": { + "description": "Sheet action subtitle explaining removing a medication keeps marked doses" + }, + "wellnessRemoveMedConfirmTitle": "ลบ {label} หรือไม่?", + "@wellnessRemoveMedConfirmTitle": { + "description": "Confirmation sheet title asking to remove a medication", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "wellnessRemoveMedConfirmBody": "จะหยุดกำหนดเวลาและไม่นับในการใช้ยาตามกำหนด รายการที่ทำเครื่องหมายไว้ยังอยู่", + "@wellnessRemoveMedConfirmBody": { + "description": "Confirmation sheet body explaining medication removal stops scheduling and adherence counting but keeps marked doses" + }, + "wellnessMedHint": "วิตามินดี", + "@wellnessMedHint": { + "description": "Placeholder example text in the add-medication name field" + }, + "wellnessNameLabel": "ชื่อ", + "@wellnessNameLabel": { + "description": "Text field label for entering a habit or medication name" + }, + "wellnessAdd": "เพิ่ม", + "@wellnessAdd": { + "description": "Confirm button label in the add-name dialog" + }, + "wellnessEveryDay": "ทุกวัน", + "@wellnessEveryDay": { + "description": "Days-due summary meaning every day of the week" + }, + "wellnessWeekdays": "วันธรรมดา", + "@wellnessWeekdays": { + "description": "Days-due summary meaning Monday through Friday" + }, + "wellnessWeekends": "สุดสัปดาห์", + "@wellnessWeekends": { + "description": "Days-due summary meaning Saturday and Sunday" + }, + "wellnessMon": "จ.", + "@wellnessMon": { + "description": "Abbreviated weekday name: Monday" + }, + "wellnessTue": "อ.", + "@wellnessTue": { + "description": "Abbreviated weekday name: Tuesday" + }, + "wellnessWed": "พ.", + "@wellnessWed": { + "description": "Abbreviated weekday name: Wednesday" + }, + "wellnessThu": "พฤ.", + "@wellnessThu": { + "description": "Abbreviated weekday name: Thursday" + }, + "wellnessFri": "ศ.", + "@wellnessFri": { + "description": "Abbreviated weekday name: Friday" + }, + "wellnessSat": "ส.", + "@wellnessSat": { + "description": "Abbreviated weekday name: Saturday" + }, + "wellnessSun": "อา.", + "@wellnessSun": { + "description": "Abbreviated weekday name: Sunday" + }, + "wellnessWhenYouTakeIt": "เวลาที่ใช้", + "@wellnessWhenYouTakeIt": { + "description": "Heading in the medication schedule picker sheet" + }, + "wellnessChangeTheTime": "เปลี่ยนเวลา", + "@wellnessChangeTheTime": { + "description": "Accessibility label for the time picker row in the schedule sheet" + }, + "wellnessWhichDays": "วันใดบ้าง", + "@wellnessWhichDays": { + "description": "All-caps section label in the schedule picker for choosing weekdays" + }, + "wellnessPickAtLeastOneDay": "เลือกอย่างน้อยหนึ่งวัน", + "@wellnessPickAtLeastOneDay": { + "description": "Validation hint when no weekday is selected in the schedule picker" + }, + "wellnessDueDays": "กำหนดใช้ {days}", + "@wellnessDueDays": { + "description": "Schedule picker summary of which days the dose is due", + "placeholders": { + "days": { + "type": "String" + } + } + }, + "wellnessMoreForMed": "เพิ่มเติมสำหรับ {label}", + "@wellnessMoreForMed": { + "description": "Accessibility label for the overflow/more menu button on a medication row", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "wellnessMedAtTime": "{label} เวลา {time}", + "@wellnessMedAtTime": { + "description": "Accessibility label for a medication dose row: the medication name and its scheduled time", + "placeholders": { + "label": { + "type": "String" + }, + "time": { + "type": "String" + } + } + }, + "wellnessStateTaken": "ใช้แล้ว", + "@wellnessStateTaken": { + "description": "Dose state word: taken" + }, + "wellnessStateSkipped": "ข้ามแล้ว", + "@wellnessStateSkipped": { + "description": "Dose state word: skipped" + }, + "wellnessStateNotTaken": "ยังไม่ได้ใช้", + "@wellnessStateNotTaken": { + "description": "Dose state word: not taken (missed)" + }, + "wellnessStateDueLater": "ยังไม่ถึงเวลา", + "@wellnessStateDueLater": { + "description": "Dose state word: due later (upcoming)" + }, + "wellnessMarkDone": "ทำเครื่องหมายว่าเสร็จ", + "@wellnessMarkDone": { + "description": "Accessibility label on an unchecked dose/habit check control" + }, + "wellnessWhatYouLogScreenTitle": "สิ่งที่คุณบันทึก", + "@wellnessWhatYouLogScreenTitle": { + "description": "Screen title for the journal findings detail screen" + }, + "wellnessNothingSeparatedTitle": "ยังไม่พบความแตกต่างชัดเจน", + "@wellnessNothingSeparatedTitle": { + "description": "Status card title when no journal findings cleared statistical significance" + }, + "wellnessNothingSeparatedBody": "เปรียบเทียบทุกสิ่งที่บันทึกกับการฟื้นตัว HRV อัตราการเต้นหัวใจขณะพัก และประสิทธิภาพการนอน ยังไม่มีสิ่งใดผ่านเกณฑ์", + "@wellnessNothingSeparatedBody": { + "description": "Status card body explaining what journal findings are tested against" + }, + "wellnessTheDaysYouDidIt": "วันที่คุณทำสิ่งนั้น", + "@wellnessTheDaysYouDidIt": { + "description": "Section title for binary habit findings in journal findings" + }, + "wellnessHowMuchAndWhatFollowed": "ปริมาณและสิ่งที่ตามมา", + "@wellnessHowMuchAndWhatFollowed": { + "description": "Section title for numeric dose-response findings in journal findings" + }, + "wellnessLinkNeverCause": "เป็นความสัมพันธ์ในข้อมูลของคุณ ไม่ใช่สาเหตุ วันที่คุณทำสิ่งหนึ่งอาจมีลักษณะเช่นนั้นอยู่แล้ว", + "@wellnessLinkNeverCause": { + "description": "Disclaimer text below journal findings emphasizing correlation not causation" + }, + "wellnessWhichDayOfWeek": "วันใดในสัปดาห์", + "@wellnessWhichDayOfWeek": { + "description": "Section title for the weekday effect card" + }, + "wellnessHigher": "สูงกว่า", + "@wellnessHigher": { + "description": "Direction word: higher, used when composing a finding sentence" + }, + "wellnessLower": "ต่ำกว่า", + "@wellnessLower": { + "description": "Direction word: lower, used when composing a finding sentence" + }, + "wellnessHeadlineBinary": "ใน {n} วันที่บันทึก {field} ค่า{outcome}{direction} {amount}", + "@wellnessHeadlineBinary": { + "description": "Finding headline for a binary (habit) journal field, e.g. 'On the 5 days you logged X, Y ran 3 higher'", + "placeholders": { + "n": { + "type": "String" + }, + "field": { + "type": "String" + }, + "outcome": { + "type": "String" + }, + "amount": { + "type": "String" + }, + "direction": { + "type": "String" + } + } + }, + "wellnessHeadlineNoSlope": "ใน {n} วันที่บันทึก {field} ปริมาณที่มากขึ้นสัมพันธ์กับ{outcome}ที่{direction}", + "@wellnessHeadlineNoSlope": { + "description": "Finding headline for a numeric field with only a rank correlation (no slope)", + "placeholders": { + "n": { + "type": "String" + }, + "field": { + "type": "String" + }, + "direction": { + "type": "String" + }, + "outcome": { + "type": "String" + } + } + }, + "wellnessHeadlineSlope": "ใน {n} วันที่บันทึก {field} ค่า{outcome}{direction} {amount} ต่อ {step}", + "@wellnessHeadlineSlope": { + "description": "Finding headline for a numeric field with a per-unit slope", + "placeholders": { + "n": { + "type": "String" + }, + "field": { + "type": "String" + }, + "outcome": { + "type": "String" + }, + "amount": { + "type": "String" + }, + "direction": { + "type": "String" + }, + "step": { + "type": "String" + } + } + }, + "wellnessMatchedSameDay": "เทียบกับค่าของวันเดียวกัน", + "@wellnessMatchedSameDay": { + "description": "Finding detail: the field was matched against the same day's numbers" + }, + "wellnessMatchedNightFollowed": "เทียบกับคืนถัดมา", + "@wellnessMatchedNightFollowed": { + "description": "Finding detail: the field was matched against the following night" + }, + "wellnessMatchedNightEnded": "เทียบกับคืนที่สิ้นสุดในเช้าวันนั้น", + "@wellnessMatchedNightEnded": { + "description": "Finding detail: the field was matched against the night that just ended" + }, + "wellnessAgainstDaysYouDidNot": "เทียบกับ {n} วันที่คุณไม่ได้ทำ", + "@wellnessAgainstDaysYouDidNot": { + "description": "Finding detail prefix comparing against days a habit was not done", + "placeholders": { + "n": { + "type": "String" + } + } + }, + "wellnessRangeTo": "{lo} ถึง {hi}", + "@wellnessRangeTo": { + "description": "Confidence interval range phrase, e.g. '0.10 to 0.40'", + "placeholders": { + "lo": { + "type": "String" + }, + "hi": { + "type": "String" + } + } + }, + "wellnessRankCorrelation": "สหสัมพันธ์อันดับ {rho}{ci} ", + "@wellnessRankCorrelation": { + "description": "Finding detail stating the rank correlation coefficient and its confidence interval", + "placeholders": { + "rho": { + "type": "String" + }, + "ci": { + "type": "String" + } + } + }, + "wellnessCaffeineCaveat": "นับเฉพาะคาเฟอีนครั้งสุดท้ายของวัน กินสองถ้วยหรือห้าถ้วยจึงดูเหมือนกัน วันที่ยาวนานและเครียดอาจทำให้ทั้งดื่มกาแฟดึกและนอนไม่ดี", + "@wellnessCaffeineCaveat": { + "description": "Extra caveat paragraph shown for the last-caffeine-of-day finding" + }, + "wellnessHourLater": "ชั่วโมงที่ช้าลง", + "@wellnessHourLater": { + "description": "Unit phrase for caffeine timing slope, e.g. 'per hour later'" + }, + "wellnessPointUnit": "คะแนน", + "@wellnessPointUnit": { + "description": "Fallback singular unit word when a journal field has no unit" + }, + "wellnessNotEnoughWeeksTitle": "จำนวนสัปดาห์ยังไม่พอ", + "@wellnessNotEnoughWeeksTitle": { + "description": "Status card title when there is not yet enough data for the weekday effect" + }, + "wellnessNotEnoughWeeksBody": "การเทียบวันทั้งเจ็ดต้องมีข้อมูลอย่างน้อยแปดสัปดาห์ โดยมีแต่ละวันในสัปดาห์อย่างน้อยห้าครั้ง", + "@wellnessNotEnoughWeeksBody": { + "description": "Status card body explaining the weekday effect needs eight weeks of data" + }, + "wellnessNoDayStandsOutTitle": "ไม่มีวันใดในสัปดาห์โดดเด่น", + "@wellnessNoDayStandsOutTitle": { + "description": "Status card title when no weekday stands out as significant" + }, + "wellnessNoDayStandsOutBody": "เมื่อคำนึงถึงการตรวจครบทั้งเจ็ดวันแล้ว ไม่มีวันใดต่างจากอีกหกวันอย่างชัดเจน", + "@wellnessNoDayStandsOutBody": { + "description": "Status card body explaining no weekday cleared the multiple-comparison bar" + }, + "wellnessWeekdayHeadline": "{weekday}: การฟื้นตัว{direction}ปกติของคุณ {delta}", + "@wellnessWeekdayHeadline": { + "description": "Finding headline naming which weekday's readiness differs from the median", + "placeholders": { + "weekday": { + "type": "String" + }, + "delta": { + "type": "String" + }, + "direction": { + "type": "String" + } + } + }, + "wellnessWeekdayDetail": "จากวันนั้น {n} วัน วันในสัปดาห์ไม่ใช่สาเหตุ แต่เป็นช่วงที่คุณทำสิ่งต่าง ๆ ข้อมูลนี้ไม่ใช่คำแนะนำ", + "@wellnessWeekdayDetail": { + "description": "Finding detail giving the sample size and the correlation-not-causation caveat for the weekday effect", + "placeholders": { + "n": { + "type": "String" + } + } + }, + "wellnessPluralMonday": "วันจันทร์", + "@wellnessPluralMonday": { + "description": "Plural weekday name used in the weekday-effect headline: Mondays" + }, + "wellnessPluralTuesday": "วันอังคาร", + "@wellnessPluralTuesday": { + "description": "Plural weekday name used in the weekday-effect headline: Tuesdays" + }, + "wellnessPluralWednesday": "วันพุธ", + "@wellnessPluralWednesday": { + "description": "Plural weekday name used in the weekday-effect headline: Wednesdays" + }, + "wellnessPluralThursday": "วันพฤหัสบดี", + "@wellnessPluralThursday": { + "description": "Plural weekday name used in the weekday-effect headline: Thursdays" + }, + "wellnessPluralFriday": "วันศุกร์", + "@wellnessPluralFriday": { + "description": "Plural weekday name used in the weekday-effect headline: Fridays" + }, + "wellnessPluralSaturday": "วันเสาร์", + "@wellnessPluralSaturday": { + "description": "Plural weekday name used in the weekday-effect headline: Saturdays" + }, + "wellnessPluralSunday": "วันอาทิตย์", + "@wellnessPluralSunday": { + "description": "Plural weekday name used in the weekday-effect headline: Sundays" + }, + "sleepDetailNavTitle": "การนอน", + "@sleepDetailNavTitle": { + "description": "Nav bar title of the Sleep detail screen." + }, + "sleepDetailNoNightTitle": "ไม่มีข้อมูลรายคืนให้แสดง", + "@sleepDetailNoNightTitle": { + "description": "Status card title when the stepped-to day has no night recorded." + }, + "sleepDetailNoNightBody": "ไม่มีช่วงข้อมูลจากสายรัดที่ยาวพอให้คำนวณคะแนน", + "@sleepDetailNoNightBody": { + "description": "Status card body explaining why there is no night." + }, + "sleepDetailNoNightFix": "สวมสายรัดขณะนอนแล้วซิงค์ตอนเช้า", + "@sleepDetailNoNightFix": { + "description": "Suggested fix line on the no-night status card." + }, + "sleepDetailStagesSection": "ระยะการนอน", + "@sleepDetailStagesSection": { + "description": "Section header for the sleep stage breakdown." + }, + "sleepDetailVersusUsualSection": "เทียบปกติของคุณ", + "@sleepDetailVersusUsualSection": { + "description": "Section header comparing last night to the user's own recent nights." + }, + "sleepDetailUnusualLastNight": "สิ่งที่ต่างจากปกติเมื่อคืน", + "@sleepDetailUnusualLastNight": { + "description": "Section header when the unusual-findings section is about last night." + }, + "sleepDetailUnusualOnDay": "สิ่งที่ต่างจากปกติเมื่อ {day}", + "@sleepDetailUnusualOnDay": { + "description": "Section header when the unusual-findings section is about a past day, not last night.", + "placeholders": { + "day": { + "type": "String" + } + } + }, + "sleepDetailOvernightSection": "สัญญาณระหว่างคืน", + "@sleepDetailOvernightSection": { + "description": "Section header for the overnight signal charts (HR, HRV, breathing, temp)." + }, + "sleepDetailTonightSection": "คืนนี้", + "@sleepDetailTonightSection": { + "description": "Section header for the one-takeaway sleep coaching card." + }, + "sleepDetailTotalSleep": "เวลานอนรวม", + "@sleepDetailTotalSleep": { + "description": "Caption under the big total-sleep-duration number." + }, + "sleepDetailInBed": "อยู่บนเตียง", + "@sleepDetailInBed": { + "description": "Inline metric label: time spent in bed." + }, + "sleepDetailWatched": "เวลาที่สังเกตได้", + "@sleepDetailWatched": { + "description": "Inline metric label: time the band actually recorded." + }, + "sleepDetailAsleepOfThat": "หลับในช่วงนั้น", + "@sleepDetailAsleepOfThat": { + "description": "Inline metric label for asleep percentage when a 'watched' window is also shown." + }, + "sleepDetailAsleep": "หลับ", + "@sleepDetailAsleep": { + "description": "Inline metric label for asleep percentage (efficiency)." + }, + "sleepDetailWatchedExplain": "สังเกตได้ {watched} จาก {inBed} ที่คุณอยู่บนเตียง เวลาที่เหลือไม่ได้วัด เวลาหลับและสัดส่วนระยะด้านล่างอ้างอิงเฉพาะช่วงที่สังเกตได้", + "@sleepDetailWatchedExplain": { + "description": "Explanatory sentence under the total-sleep card about the watched vs. in-bed window.", + "placeholders": { + "watched": { + "type": "String" + }, + "inBed": { + "type": "String" + } + } + }, + "sleepDetailWindowMine": "คุณกำหนดช่วงนี้เอง", + "@sleepDetailWindowMine": { + "description": "Label when the user has set/confirmed the sleep window themselves." + }, + "sleepDetailWindowFallback": "อนุมานช่วงนี้จากอัตราการเต้นหัวใจ", + "@sleepDetailWindowFallback": { + "description": "Label when the sleep window was inferred from heart rate as a fallback." + }, + "sleepDetailStagedByRing": "อุปกรณ์ของคุณแบ่งระยะการนอน", + "@sleepDetailStagedByRing": { + "description": "Chip on a night whose window and stages came from the user's ring rather than our own detection." + }, + "sleepDetailWindowAuto": "แบ่งระยะช่วงนี้จากสัญญาณ", + "@sleepDetailWindowAuto": { + "description": "Label when the sleep window was auto-staged from the signals." + }, + "sleepDetailWindowFallbackBody": "การแบ่งระยะหาขอบเขตไม่ได้ เวลานี้จึงเป็นการประมาณที่ดีที่สุด", + "@sleepDetailWindowFallbackBody": { + "description": "Explanation shown under the fallback window label." + }, + "sleepDetailWindowSol": "จากจุดเริ่มช่วงที่กำหนดจนถึงหลับ: {band}", + "@sleepDetailWindowSol": { + "description": "Sentence stating sleep-onset latency for a user-confirmed window.", + "placeholders": { + "band": { + "type": "String" + } + } + }, + "sleepDetailConfirmTimes": "เวลานี้ถูกต้อง", + "@sleepDetailConfirmTimes": { + "description": "Button: confirm the inferred sleep window times are correct." + }, + "sleepDetailChangeTimes": "เปลี่ยนเวลา", + "@sleepDetailChangeTimes": { + "description": "Button: change an already user-set sleep window." + }, + "sleepDetailSetTimesMyself": "กำหนดเวลาเอง", + "@sleepDetailSetTimesMyself": { + "description": "Button: set the sleep window times manually for the first time." + }, + "sleepDetailBackToAutomatic": "กลับไปใช้อัตโนมัติ", + "@sleepDetailBackToAutomatic": { + "description": "Button: revert a manual sleep window override back to automatic staging." + }, + "sleepDetailNotSleep": "ไม่ใช่การนอน", + "@sleepDetailNotSleep": { + "description": "Button: reject this window entirely — it was not sleep at all." + }, + "sleepDetailEditNaps": "การงีบ", + "@sleepDetailEditNaps": { + "description": "Button: go to the Naps screen for this day, to log or remove a nap." + }, + "sleepDetailRejectedTitle": "ระบุว่าไม่ใช่การนอนแล้ว", + "@sleepDetailRejectedTitle": { + "description": "Status card title for a night the user rejected outright as not sleep." + }, + "sleepDetailRejectedBody": "คุณระบุว่าช่วงนี้ไม่ใช่การนอน จึงไม่คำนวณคะแนนให้", + "@sleepDetailRejectedBody": { + "description": "Status card body for a night the user rejected outright as not sleep." + }, + "sleepDetailUndoRejection": "ย้อนกลับ — ใช้อัตโนมัติ", + "@sleepDetailUndoRejection": { + "description": "Button: undo a not-sleep rejection and return the day to automatic staging." + }, + "sleepDetailIWasAsleep": "ฉันหลับอยู่", + "@sleepDetailIWasAsleep": { + "description": "Button on a night with no sleep found: enter the bed and wake times yourself." + }, + "sleepDetailReanalysing": "กำลังวิเคราะห์คืนนี้ใหม่…", + "@sleepDetailReanalysing": { + "description": "Progress label shown while the night is being re-derived after a window edit." + }, + "sleepDetailCorrectionFailedTitle": "ยังไม่ได้ใช้การแก้ไขนั้น", + "@sleepDetailCorrectionFailedTitle": { + "description": "Status card title when a sleep window correction failed to apply." + }, + "sleepDetailBedTimeHelp": "เวลาที่ขึ้นเตียง", + "@sleepDetailBedTimeHelp": { + "description": "Help text on the time picker for when the user got into bed." + }, + "sleepDetailWakeTimeHelp": "เวลาที่ลุกจากเตียง", + "@sleepDetailWakeTimeHelp": { + "description": "Help text on the time picker for when the user got up." + }, + "sleepDetailReanalyseFailed": "ยังไม่ได้วิเคราะห์คืนนี้ใหม่ เพราะมีงานอื่นทำอยู่หรือการวิเคราะห์ไม่สำเร็จ บันทึกเวลาแล้ว โปรดเปิด “ข้อมูลของคุณ” แล้วแตะ “วิเคราะห์ทั้งหมดอีกครั้ง”", + "sleepDetailWindowUnrecorded": "บันทึกเวลาแล้ว แต่สายรัดไม่ได้บันทึกเกือบตลอดช่วงนั้น เพราะถอดจากข้อมือหรือกำลังชาร์จ จึงไม่มีข้อมูลรายคืนให้คำนวณคะแนน", + "sleepDetailWindowNoSleep": "บันทึกเวลาแล้ว แต่ข้อมูลสายรัดในช่วงนั้นไม่แสดงการนอนให้คำนวณคะแนน", + "sleepDetailNightUnrecorded": "อัตราการเต้นหัวใจบ่งชี้การนอนหนึ่งคืน แต่สายรัดบันทึกการเคลื่อนไหวได้น้อยเกินไปเกือบตลอดช่วง จึงไม่มีข้อมูลรายคืนให้คำนวณคะแนน", + "@sleepDetailNightUnrecorded": { + "description": "Shown on an automatically detected night with no sleep, when heart rate found a night but the band recorded too little movement data across it to stage one." + }, + "@sleepDetailWindowUnrecorded": { + "description": "Shown after the user set their own sleep window (e.g. \"I was asleep\") and the band recorded too little of it to stage a night." + }, + "@sleepDetailWindowNoSleep": { + "description": "Shown after the user set their own sleep window and the band recorded it, but staging found no sleep in it." + }, + "sleepDetailCorrectionUnavailable": "ข้อมูลบันทึกรายละเอียดของคืนนี้ไม่ได้อยู่ในโทรศัพท์แล้ว จึงแก้ไขการนอนไม่ได้", + "sleepDetailCorrectionEveningPruned": "ข้อมูลช่วงเย็นก่อนคืนนี้ไม่ได้อยู่ในโทรศัพท์แล้ว จึงใช้ได้เฉพาะเวลาเข้านอนหลังเที่ยงคืน หรือ “ไม่ใช่การนอน”", + "@sleepDetailCorrectionEveningPruned": { + "description": "Shown on the oldest night still kept, or after a correction there was refused: the evening part of the night has been pruned, so a bedtime before midnight, confirming the detected times, or reverting to automatic cannot be applied." + }, + "@sleepDetailCorrectionUnavailable": { + "description": "Shown instead of the sleep correction buttons, or after one was refused, when the night's raw recordings have been pruned and it can no longer be re-analysed." + }, + "@sleepDetailReanalyseFailed": { + "description": "Fallback error message when re-analysis after a window edit could not be confirmed." + }, + "sleepDetailNoHypnogramTitle": "ไม่มีกราฟระยะการนอนของคืนนี้", + "@sleepDetailNoHypnogramTitle": { + "description": "Status card title when no hypnogram data exists for the night." + }, + "sleepDetailNoHypnogramBody": "การแบ่งระยะต้องใช้การเคลื่อนไหวและช่วงเวลาจังหวะหัวใจ แต่ขาดอย่างใดอย่างหนึ่ง", + "@sleepDetailNoHypnogramBody": { + "description": "Status card body explaining why no hypnogram is available." + }, + "sleepDetailThroughTheNight": "ตลอดคืน", + "@sleepDetailThroughTheNight": { + "description": "Chart title for the hypnogram and the overnight signals chart." + }, + "sleepDetailUnitStage": "ระยะ", + "@sleepDetailUnitStage": { + "description": "Unit label on the hypnogram chart frame." + }, + "sleepDetailTapDragCycles": "{n, plural, other{แตะหรือลากกราฟเพื่อดูแต่ละช่วงเวลา {n} รอบ}}", + "@sleepDetailTapDragCycles": { + "description": "Hint sentence under the hypnogram, stating the sleep-cycle count with no average available.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "sleepDetailTapDragCyclesAvg": "{n, plural, other{แตะหรือลากกราฟเพื่อดูแต่ละช่วงเวลา {n} รอบ เฉลี่ย {avg}}}", + "@sleepDetailTapDragCyclesAvg": { + "description": "Hint sentence under the hypnogram, stating the sleep-cycle count and its average length.", + "placeholders": { + "n": { + "type": "int" + }, + "avg": { + "type": "String" + } + } + }, + "sleepDetailTapDragNone": "แตะหรือลากกราฟเพื่อดูแต่ละช่วงเวลาของคืน", + "@sleepDetailTapDragNone": { + "description": "Hint sentence under the hypnogram when there were no complete sleep cycles." + }, + "sleepDetailNoWakeups": "ไม่พบการตื่นนานตั้งแต่ 5 นาที ข้อมือตรวจไม่พบช่วงที่สั้นกว่านี้", + "@sleepDetailNoWakeups": { + "description": "Sentence describing a night with zero qualifying wake-ups." + }, + "sleepDetailAtLeastWakeups": "{n, plural, other{ตื่นนานตั้งแต่ 5 นาทีอย่างน้อย {n} ครั้ง ข้อมือตรวจไม่พบช่วงที่สั้นกว่านี้}}", + "@sleepDetailAtLeastWakeups": { + "description": "Sentence stating a floor count of wake-ups of 5+ minutes.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "sleepDetailLongestStretch": "ช่วงต่อเนื่องยาวที่สุด {longest}", + "@sleepDetailLongestStretch": { + "description": "Sentence stating the longest unbroken sleep stretch of the night.", + "placeholders": { + "longest": { + "type": "String" + } + } + }, + "sleepDetailHypnogramLabel": "กราฟระยะการนอน", + "@sleepDetailHypnogramLabel": { + "description": "Accessibility label for the hypnogram scrubber control." + }, + "sleepDetailPercentThroughNight": "ผ่านไป {pct}% ของคืน", + "@sleepDetailPercentThroughNight": { + "description": "Screen-reader description of scrub position when the night's clock times are unknown.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "sleepDetailNotMeasured": "ยังไม่ได้วัด", + "@sleepDetailNotMeasured": { + "description": "Lowercase, mid-sentence: describes an instant the band was not recording, used in the scrubber's spoken description." + }, + "sleepDetailScrubAt": "{at} {stage}", + "@sleepDetailScrubAt": { + "description": "Combines the scrubbed time and the stage/measurement state into one spoken sentence.", + "placeholders": { + "at": { + "type": "String" + }, + "stage": { + "type": "String" + } + } + }, + "sleepDetailHeartRate": "อัตราการเต้นหัวใจ", + "@sleepDetailHeartRate": { + "description": "Label for the heart-rate signal, used as a metric label and as a chart lane legend." + }, + "sleepDetailHrv": "HRV", + "@sleepDetailHrv": { + "description": "Label for the heart-rate-variability signal." + }, + "sleepDetailBreathing": "การหายใจ", + "@sleepDetailBreathing": { + "description": "Label for the breathing-rate signal (title case)." + }, + "sleepDetailTemp": "อุณหภูมิ", + "@sleepDetailTemp": { + "description": "Short label for skin temperature in the scrub readout card." + }, + "sleepDetailTempRelative": "อุณหภูมิ (สัมพัทธ์)", + "@sleepDetailTempRelative": { + "description": "Short label for the scrub readout card's skin-temperature value, which is a relative sensor deviation from that day's median, not degrees. Keep the 'relative' meaning." + }, + "sleepDetailNotMeasuredCap": "ยังไม่ได้วัด", + "@sleepDetailNotMeasuredCap": { + "description": "Capitalized, standalone label shown in place of a stage pill when the instant was not recorded." + }, + "sleepDetailNoSignalAtMoment": "ไม่มีสัญญาณที่บันทึกไว้ ณ เวลานี้", + "@sleepDetailNoSignalAtMoment": { + "description": "Message shown in the scrub card when no signal is available at the scrubbed instant." + }, + "sleepDetailStageAwake": "ตื่น", + "@sleepDetailStageAwake": { + "description": "Sleep stage name: Awake." + }, + "sleepDetailStageRem": "REM", + "@sleepDetailStageRem": { + "description": "Sleep stage name: REM." + }, + "sleepDetailStageLight": "หลับตื้น", + "@sleepDetailStageLight": { + "description": "Sleep stage name: Light sleep." + }, + "sleepDetailStageDeep": "หลับลึก", + "@sleepDetailStageDeep": { + "description": "Sleep stage name: Deep sleep." + }, + "sleepDetailDeep": "หลับลึก", + "@sleepDetailDeep": { + "description": "Short row label for deep sleep in the stage breakdown table." + }, + "sleepDetailLight": "หลับตื้น", + "@sleepDetailLight": { + "description": "Short row label for light sleep in the stage breakdown table." + }, + "sleepDetailNoStageSplitTitle": "ไม่มีข้อมูลแบ่งระยะของคืนนี้", + "@sleepDetailNoStageSplitTitle": { + "description": "Status card title when no stage breakdown could be computed." + }, + "sleepDetailNoStageSplitBody": "ไม่มีช่วงเวลาจังหวะหัวใจตลอดช่วง", + "@sleepDetailNoStageSplitBody": { + "description": "Status card body explaining why no stage breakdown is available." + }, + "sleepDetailStageRangeExplain": "แต่ละระยะแสดงเป็นช่วงค่า ยิ่งสังเกตได้ชัด ช่วงยิ่งแคบ หลับลึกมีช่วงกว้างที่สุด ส่วนการตื่นแสดงค่าเดียว ดูจำนวนนาทีที่แน่นอนได้ในสถิติเชิงลึก", + "@sleepDetailStageRangeExplain": { + "description": "Explanatory footnote under the stage breakdown table about ranges vs. counts." + }, + "sleepDetailTimeAsleep": "เวลาที่หลับ", + "@sleepDetailTimeAsleep": { + "description": "Row label in the 'against your usual' comparison: total time asleep." + }, + "sleepDetailAskEnough": "คุณนอนพอหรือไม่?", + "@sleepDetailAskEnough": { + "description": "Against-your-usual row for time asleep, phrased as a plain question." + }, + "sleepDetailAskDeep": "คุณหลับลึกเท่าปกติหรือไม่?", + "@sleepDetailAskDeep": { + "description": "Against-your-usual row for deep sleep, phrased as a plain question." + }, + "sleepDetailAskSleptThrough": "คุณหลับตลอดเวลาบนเตียงหรือไม่?", + "@sleepDetailAskSleptThrough": { + "description": "Against-your-usual row for sleep efficiency (asleep while in bed), phrased as a plain question." + }, + "sleepDetailAskOnTime": "คุณหลับตรงเวลาปกติหรือไม่?", + "@sleepDetailAskOnTime": { + "description": "Against-your-usual row for sleep onset time, phrased as a plain question." + }, + "sleepDetailShorterThanUsual": "สั้นกว่าปกติ", + "@sleepDetailShorterThanUsual": { + "description": "Verdict phrase: this night's sleep duration was shorter than usual." + }, + "sleepDetailLongerThanUsual": "ยาวกว่าปกติ", + "@sleepDetailLongerThanUsual": { + "description": "Verdict phrase: this night's sleep duration was longer than usual." + }, + "sleepDetailLessThanUsual": "น้อยกว่าปกติ", + "@sleepDetailLessThanUsual": { + "description": "Verdict phrase: this night's deep sleep was less than usual." + }, + "sleepDetailMoreThanUsual": "มากกว่าปกติ", + "@sleepDetailMoreThanUsual": { + "description": "Verdict phrase: this night's deep sleep was more than usual." + }, + "sleepDetailAsleepWhileInBed": "หลับขณะอยู่บนเตียง", + "@sleepDetailAsleepWhileInBed": { + "description": "Row label in the 'against your usual' comparison: sleep efficiency." + }, + "sleepDetailLowerThanUsual": "ต่ำกว่าปกติ", + "@sleepDetailLowerThanUsual": { + "description": "Verdict phrase: sleep efficiency was lower than usual." + }, + "sleepDetailHigherThanUsual": "สูงกว่าปกติ", + "@sleepDetailHigherThanUsual": { + "description": "Verdict phrase: sleep efficiency was higher than usual." + }, + "sleepDetailPointsDelta": "{n} จุดเปอร์เซ็นต์", + "@sleepDetailPointsDelta": { + "description": "Verdict prefix: how far sleep efficiency was from the usual median, in percentage points; followed by the lower/higher-than-usual phrase.", + "placeholders": { + "n": { + "type": "String" + } + } + }, + "sleepDetailFellAsleep": "หลับเมื่อ", + "@sleepDetailFellAsleep": { + "description": "Row label in the 'against your usual' comparison: sleep onset time." + }, + "sleepDetailEarlierThanUsual": "เร็วกว่าปกติ", + "@sleepDetailEarlierThanUsual": { + "description": "Verdict phrase: fell asleep earlier than usual." + }, + "sleepDetailLaterThanUsual": "ช้ากว่าปกติ", + "@sleepDetailLaterThanUsual": { + "description": "Verdict phrase: fell asleep later than usual." + }, + "sleepDetailNotEnoughNightsTitle": "จำนวนคืนยังไม่พอเปรียบเทียบ", + "@sleepDetailNotEnoughNightsTitle": { + "description": "Status card title when there is not yet enough history to compare against." + }, + "sleepDetailNightsSoFar": "ขณะนี้ {have} จาก {min} คืน", + "@sleepDetailNightsSoFar": { + "description": "Progress line: how many nights of history exist versus the minimum needed.", + "placeholders": { + "have": { + "type": "int" + }, + "min": { + "type": "int" + } + } + }, + "sleepDetailBarExplain": "แท่งแสดงช่วงกึ่งกลางครึ่งหนึ่งของคืนก่อน ๆ ของคุณ", + "@sleepDetailBarExplain": { + "description": "Footnote explaining that the comparison bar is the user's own middle-50% range." + }, + "sleepDetailLessThanAny": "{noun} {value} — น้อยกว่าทุกคืนใน {count} คืนล่าสุด ซึ่งต่ำสุดคือ {lowest}", + "@sleepDetailLessThanAny": { + "description": "Insight card body: a measure was the lowest across the recent-night history.", + "placeholders": { + "noun": { + "type": "String" + }, + "value": { + "type": "String" + }, + "count": { + "type": "int" + }, + "lowest": { + "type": "String" + } + } + }, + "sleepDetailMoreThanAny": "{noun} {value} — มากกว่าทุกคืนใน {count} คืนล่าสุด ซึ่งสูงสุดคือ {highest}", + "@sleepDetailMoreThanAny": { + "description": "Insight card body: a measure was the highest across the recent-night history.", + "placeholders": { + "noun": { + "type": "String" + }, + "value": { + "type": "String" + }, + "count": { + "type": "int" + }, + "highest": { + "type": "String" + } + } + }, + "sleepDetailYouSlept": "คุณนอน", + "@sleepDetailYouSlept": { + "description": "Noun phrase used as the subject of the total-sleep-duration extreme sentence, e.g. 'You slept 5h 10m'." + }, + "sleepDetailShortestNightLately": "คืนที่นอนสั้นที่สุดช่วงนี้", + "@sleepDetailShortestNightLately": { + "description": "Insight card title: shortest night in the recent record." + }, + "sleepDetailLongestNightLately": "คืนที่นอนยาวที่สุดช่วงนี้", + "@sleepDetailLongestNightLately": { + "description": "Insight card title: longest night in the recent record." + }, + "sleepDetailSleepingHrHighTitle": "อัตราการเต้นหัวใจขณะนอนสูง", + "@sleepDetailSleepingHrHighTitle": { + "description": "Insight card title: sleeping heart rate was elevated versus baseline." + }, + "sleepDetailSleepingHrHighBody": "สูงกว่าปกติ {bpm} bpm พบได้หลังดื่มแอลกอฮอล์ กินดึก ออกกำลังกายหนัก หรือเริ่มติดเชื้อ เป็นค่าที่วัด ไม่ใช่การวินิจฉัย", + "@sleepDetailSleepingHrHighBody": { + "description": "Insight card body explaining the elevated sleeping heart rate.", + "placeholders": { + "bpm": { + "type": "String" + } + } + }, + "sleepDetailNothingStoodOut": "ไม่พบสิ่งที่โดดเด่น", + "@sleepDetailNothingStoodOut": { + "description": "Reassurance line shown when nothing unusual was found in the night." + }, + "sleepDetailSleepingHr": "HR ขณะนอน", + "@sleepDetailSleepingHr": { + "description": "All-caps inline metric label: average sleeping heart rate." + }, + "sleepDetailLowest": "ต่ำสุด", + "@sleepDetailLowest": { + "description": "All-caps inline metric label: lowest heart rate reached overnight." + }, + "sleepDetailBreathingCaps": "การหายใจ", + "@sleepDetailBreathingCaps": { + "description": "All-caps inline metric label for breathing rate summary." + }, + "sleepDetailSkinTemp": "อุณหภูมิผิว", + "@sleepDetailSkinTemp": { + "description": "Chart lane legend label for skin temperature." + }, + "sleepDetailSleepNeedNotEstablished": "ยังระบุความต้องการนอนไม่ได้", + "@sleepDetailSleepNeedNotEstablished": { + "description": "Status card title when sleep need has not yet been established." + }, + "sleepDetailYourNeedIs": "คุณต้องการนอน {need}", + "@sleepDetailYourNeedIs": { + "description": "Reason fragment stating the user's computed sleep need.", + "placeholders": { + "need": { + "type": "String" + } + } + }, + "sleepDetailYouAreDown": "คุณนอนขาดไป {debt}", + "@sleepDetailYouAreDown": { + "description": "Reason fragment stating how far behind the user's sleep debt is.", + "placeholders": { + "debt": { + "type": "String" + } + } + }, + "sleepDetailLightsOut": "ปิดไฟนอน", + "@sleepDetailLightsOut": { + "description": "Small caption under the recommended bedtime clock time." + }, + "sleepDetailToAimFor": "เป้าหมาย", + "@sleepDetailToAimFor": { + "description": "Small caption under the sleep-need duration when no bedtime is recommended." + }, + "sleepDetailNoPersonalRangeYet": "ยังไม่มีช่วงส่วนตัว — {count} จาก {min} คืน", + "@sleepDetailNoPersonalRangeYet": { + "description": "Message shown on a comparison row before enough personal history exists.", + "placeholders": { + "count": { + "type": "int" + }, + "min": { + "type": "int" + } + } + }, + "sleepDetailNotFarEnoughToCall": "ต่างจากปกติไม่มากพอจะสรุป", + "@sleepDetailNotFarEnoughToCall": { + "description": "Verdict phrase when a fuzzy measurement's interval overlaps the usual band." + }, + "sleepDetailTypicalForYou": "เป็นปกติสำหรับคุณ", + "@sleepDetailTypicalForYou": { + "description": "Verdict phrase when a measured value falls within the user's usual range." + }, + "sleepDetailVerdictSummary": "{verdict} · ปกติ {lo}–{hi} จาก {n} คืน", + "@sleepDetailVerdictSummary": { + "description": "Footnote combining the verdict phrase with the usual range and night count.", + "placeholders": { + "verdict": { + "type": "String" + }, + "lo": { + "type": "String" + }, + "hi": { + "type": "String" + }, + "n": { + "type": "int" + } + } + }, + "sleepDetailNoOvernightTitle": "ไม่มีเส้นสัญญาณระหว่างคืน", + "@sleepDetailNoOvernightTitle": { + "description": "Status card title when no overnight signal lines were recorded." + }, + "sleepDetailNoOvernightBody": "ไม่มีข้อมูลระหว่างคืนมาถึงวันนี้", + "@sleepDetailNoOvernightBody": { + "description": "Status card body explaining why no overnight signals exist." + }, + "sleepDetailSolUnder15": "ไม่ถึง 15 นาที", + "@sleepDetailSolUnder15": { + "description": "Sleep-onset-latency band label for under 15 minutes." + }, + "sleepDetailSolOverHour": "เกินหนึ่งชั่วโมง", + "@sleepDetailSolOverHour": { + "description": "Sleep-onset-latency band label for over an hour." + }, + "sleepDetailSolRange": "{lo}–{hi} นาที", + "@sleepDetailSolRange": { + "description": "15-minute sleep-onset-latency band label, e.g. '15–30 minutes'.", + "placeholders": { + "lo": { + "type": "int" + }, + "hi": { + "type": "int" + } + } + }, + "workoutTabForYou": "สำหรับคุณ", + "@workoutTabForYou": { + "description": "Workout screen sub-tab label" + }, + "workoutTabActivities": "กิจกรรม", + "@workoutTabActivities": { + "description": "Workout screen sub-tab label" + }, + "workoutTabHistory": "ประวัติ", + "@workoutTabHistory": { + "description": "Workout screen sub-tab label" + }, + "workoutScreenTitle": "ออกกำลังกาย", + "@workoutScreenTitle": { + "description": "Workout screen title" + }, + "workoutStartSessionLabel": "เริ่มการออกกำลังกาย", + "@workoutStartSessionLabel": { + "description": "Hero start card label on For You tab" + }, + "workoutActivitiesNoun": "กิจกรรม", + "@workoutActivitiesNoun": { + "description": "Noun used beside the activity count on the start card" + }, + "workoutThisWeek": "สัปดาห์นี้", + "@workoutThisWeek": { + "description": "Section header and stat label for the current week" + }, + "workoutTrainingLoad": "ภาระการฝึก", + "@workoutTrainingLoad": { + "description": "Section header over the fitness/fatigue card" + }, + "metricHeartEffortTitle": "ภาระหัวใจ", + "@metricHeartEffortTitle": { + "description": "Title of the per-day heart-rate effort chart (time in each zone, harder zones weighted more). Daily, so not called training load." + }, + "workoutTodaysStrainAction": "ความหนักวันนี้", + "@workoutTodaysStrainAction": { + "description": "Link action under Training load section, opens day strain detail" + }, + "workoutMechanicalLoadTitle": "ภาระเชิงกล", + "@workoutMechanicalLoadTitle": { + "description": "Chart title for weekly strength tonnage" + }, + "workoutKgLiftedUnit": "กก. ที่ยก", + "@workoutKgLiftedUnit": { + "description": "Unit label on the tonnage chart" + }, + "workoutTonnageFootnoteIntro": "จำนวนครั้ง × น้ำหนัก รวมเซ็ตที่คุณบันทึกน้ำหนักไว้ ", + "@workoutTonnageFootnoteIntro": { + "description": "First sentence of the tonnage chart footnote" + }, + "workoutTonnageFootnotePartial": "ไม่รวมเซ็ตที่ไม่ระบุน้ำหนัก จึงเป็นค่าขั้นต่ำ ไม่ใช่ยอดรวม ", + "@workoutTonnageFootnotePartial": { + "description": "Conditional clause inserted into the tonnage footnote when some sets had no weight" + }, + "workoutTonnageFootnoteOutro": "ถูกต้องตามที่กรอก แต่ใช้เทียบข้ามท่าไม่ได้ จึงไม่นำไปใช้ในความหนักและการฟื้นตัว", + "@workoutTonnageFootnoteOutro": { + "description": "Closing sentence of the tonnage chart footnote" + }, + "workoutOverreachHeadline": "ภาระ 7 วันล่าสุดเป็น {ratio} เท่าของค่าปกติหกสัปดาห์ และอัตราการเต้นหัวใจขณะพักสูง {nightsElevated} จาก {nightsConsidered} คืน", + "@workoutOverreachHeadline": { + "description": "Overreach coincidence card headline, ratio is a formatted decimal string", + "placeholders": { + "ratio": { + "type": "String" + }, + "nightsElevated": { + "type": "int" + }, + "nightsConsidered": { + "type": "int" + } + } + }, + "workoutOverreachBody": "ค่าสองอย่างชี้ไปในทางเดียวกัน การเจ็บป่วย เดินทาง อยู่บนที่สูง แอลกอฮอล์ หรือนอนไม่ดีล้วนทำให้เกิดได้ ข้อมูลนี้แยกสาเหตุไม่ได้", + "@workoutOverreachBody": { + "description": "Overreach coincidence card body text" + }, + "workoutNoLoadTitle": "ยังไม่มีภาระการฝึก", + "@workoutNoLoadTitle": { + "description": "StatusCard title when fitness/fatigue has not computed yet" + }, + "workoutNoLoadBody": "สมรรถภาพและความล้าเป็นค่าเฉลี่ย 42 วันและ 7 วัน ต้องมีข้อมูลการออกกำลังกายประมาณสองสัปดาห์", + "@workoutNoLoadBody": { + "description": "Default StatusCard body when fitness/fatigue has not computed yet" + }, + "workoutFitnessLabel": "สมรรถภาพ", + "@workoutFitnessLabel": { + "description": "Small caption under the CTL number on the load card" + }, + "workoutDailyLoadTitle": "ภาระหัวใจแต่ละวัน", + "@workoutDailyLoadTitle": { + "description": "Chart title for daily TRIMP" + }, + "workoutTrimpUnit": "คะแนน", + "@workoutTrimpUnit": { + "description": "Chart unit label, training-impulse acronym" + }, + "workoutDailyLoadFootnoteIntro": "คะแนนหัวใจไม่จำกัดเพดาน คำนวณจากนาทีในแต่ละโซน โซนหนักมีน้ำหนักมากกว่า ส่วนความหนักใช้อัตราการเต้นหัวใจเดียวกันแสดงในช่วง 0–21 ", + "@workoutDailyLoadFootnoteIntro": { + "description": "First sentence of the daily load chart footnote" + }, + "workoutDailyLoadAllDays": "เจ็ดวันล่าสุด", + "@workoutDailyLoadAllDays": { + "description": "Daily load footnote when all seven days have data" + }, + "workoutDailyLoadPartialDays": "คำนวณค่าได้ {days} จากเจ็ดวันล่าสุด", + "@workoutDailyLoadPartialDays": { + "description": "Daily load footnote when only some of the last seven days have data", + "placeholders": { + "days": { + "type": "int" + } + } + }, + "workoutFatigueLabel": "ความล้า", + "@workoutFatigueLabel": { + "description": "Inline metric label on the load card" + }, + "workoutFormLabel": "ความพร้อม", + "@workoutFormLabel": { + "description": "Inline metric label on the load card" + }, + "workoutNotYet": "ยังไม่มี", + "@workoutNotYet": { + "description": "Placeholder value when fatigue/form has not computed" + }, + "workoutFormFresh": "สดชื่น", + "@workoutFormFresh": { + "description": "Coggan form band name" + }, + "workoutFormSteady": "คงที่", + "@workoutFormSteady": { + "description": "Coggan form band name" + }, + "workoutFormBuilding": "กำลังพัฒนา", + "@workoutFormBuilding": { + "description": "Coggan form band name" + }, + "workoutFormOverreaching": "ฝึกเกินการฟื้นตัว", + "@workoutFormOverreaching": { + "description": "Coggan form band name" + }, + "workoutSearchActivitiesLabel": "ค้นหากิจกรรม", + "@workoutSearchActivitiesLabel": { + "description": "Semantic label on the activity search bar" + }, + "workoutSearchActivitiesCount": "{count, plural, other{ค้นหา {count} กิจกรรม}}", + "@workoutSearchActivitiesCount": { + "description": "Search bar placeholder text showing the catalogue size", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "workoutQuickStartHeader": "เริ่มด่วน", + "@workoutQuickStartHeader": { + "description": "Section header over the quick-start activity tiles" + }, + "workoutCalorieNeedWeightTitle": "การประมาณแคลอรีต้องใช้น้ำหนักของคุณ", + "@workoutCalorieNeedWeightTitle": { + "description": "StatusCard title shown when profile has no weight set" + }, + "workoutAddWeightFix": "เพิ่มน้ำหนักในโปรไฟล์", + "@workoutAddWeightFix": { + "description": "Fix action label on the missing-weight card" + }, + "workoutCalorieEstimatesTitle": "ตัวเลขแคลอรีเป็นค่าประมาณ", + "@workoutCalorieEstimatesTitle": { + "description": "StatusCard title reminding calories are estimated" + }, + "workoutSuggestionsTitle": "{n, plural, other{ตรวจพบการออกแรง {n} ครั้งที่ยังไม่ได้บันทึก}}", + "@workoutSuggestionsTitle": { + "description": "Title of the detected-but-unlogged effort card on History", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "workoutSuggestionsBody": "สายรัดพบการออกแรงต่อเนื่อง แต่ไม่มีการเริ่มบันทึก จะยังไม่บันทึกจนกว่าคุณจะยืนยัน", + "@workoutSuggestionsBody": { + "description": "Body text on the detected-but-unlogged effort card" + }, + "workoutReviewFix": "{n, plural, other{ตรวจสอบ}}", + "@workoutReviewFix": { + "description": "Fix action label on the detected-but-unlogged effort card", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "workoutLogPastTitle": "มีกิจกรรมที่สายรัดพลาดหรือไม่?", + "@workoutLogPastTitle": { + "description": "Title of the log-a-past-workout card" + }, + "workoutLogPastBody": "กรอกเวลาเอง แล้วคำนวณคะแนนจากอัตราการเต้นหัวใจที่บันทึกในช่วงนั้น เช่นเดียวกับการออกกำลังกายอื่น", + "@workoutLogPastBody": { + "description": "Body text of the log-a-past-workout card" + }, + "workoutLogPastFix": "บันทึกการออกกำลังกายย้อนหลัง", + "@workoutLogPastFix": { + "description": "Fix action label on the log-a-past-workout card" + }, + "workoutNoSessionsTitle": "ยังไม่มีการออกกำลังกายที่บันทึก", + "@workoutNoSessionsTitle": { + "description": "Empty-state title on History tab" + }, + "workoutNoSessionsBody": "การออกกำลังกายจะปรากฏที่นี่เมื่อคุณเริ่มบันทึก", + "@workoutNoSessionsBody": { + "description": "Empty-state body on History tab" + }, + "workoutStartWorkoutFix": "เริ่มออกกำลังกาย", + "@workoutStartWorkoutFix": { + "description": "Fix action label on the empty History state" + }, + "workoutTrackedLabel": "ติดตามแล้ว", + "@workoutTrackedLabel": { + "description": "Summary stat tile label, total sessions tracked" + }, + "workoutWeeklyLoadLabel": "ภาระรายสัปดาห์", + "@workoutWeeklyLoadLabel": { + "description": "Summary stat tile label, this week's strain load" + }, + "workoutNoneLabel": "ไม่มี", + "@workoutNoneLabel": { + "description": "Summary stat tile value when weekly load is absent" + }, + "workoutImportedThisWeekNote": "การออกกำลังกาย {count} ครั้งในสัปดาห์นี้มาจาก {storeName} นับรวมที่นี่แต่ไม่รวมภาระรายสัปดาห์ เพราะไม่มีอัตราการเต้นหัวใจมาด้วย", + "@workoutImportedThisWeekNote": { + "description": "Explanatory note under the weekly summary row when some sessions were imported", + "placeholders": { + "count": { + "type": "int" + }, + "storeName": { + "type": "String" + } + } + }, + "workoutAutoImportOnLabel": "เปิดนำเข้าอัตโนมัติอยู่ แตะเพื่อปิด", + "@workoutAutoImportOnLabel": { + "description": "Semantic label on the auto-import toggle when on" + }, + "workoutAutoImportOffLabel": "ปิดนำเข้าอัตโนมัติอยู่ แตะเพื่อเปิด", + "@workoutAutoImportOffLabel": { + "description": "Semantic label on the auto-import toggle when off" + }, + "workoutImportFromStore": "นำเข้าจาก {storeName}", + "@workoutImportFromStore": { + "description": "Import card row title naming the health store", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutFetchNowLabel": "ดึงข้อมูลการออกกำลังกายตอนนี้", + "@workoutFetchNowLabel": { + "description": "Semantic label on the manual refresh icon" + }, + "workoutImportDenied": "{storeName} ไม่อนุญาตให้อ่านการออกกำลังกาย จึงไม่ได้อ่านข้อมูล", + "@workoutImportDenied": { + "description": "Import status note when the health store denies permission", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutImportEmpty": "ไม่ได้รับข้อมูล {storeName} ไม่มีการออกกำลังกายในช่วงเวลาที่อนุญาตให้แชร์", + "@workoutImportEmpty": { + "description": "Import status note when the health store has nothing to sync", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutImportNoRoutes": " {storeName} ไม่อนุญาตให้แชร์เส้นทาง จึงไม่มีพิกัด", + "@workoutImportNoRoutes": { + "description": "Import result clause when the store cannot share GPS routes at all", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutImportNoneWithRoute": " ไม่มีรายการใดบันทึกเส้นทางไว้", + "@workoutImportNoneWithRoute": { + "description": "Import result clause when routes are supported but none of the imported workouts had one" + }, + "workoutImportSomeWithRoute": " มีเส้นทางมาด้วย {count} รายการ", + "@workoutImportSomeWithRoute": { + "description": "Import result clause reporting how many imported workouts had a route", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "workoutImportBroughtIn": "{count, plural, other{นำเข้าการออกกำลังกายแล้ว {count} ครั้ง}}", + "@workoutImportBroughtIn": { + "description": "Import result headline reporting how many workouts were imported", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "workoutImportFailed": "ไม่สำเร็จ: {error}", + "@workoutImportFailed": { + "description": "Import status note when the sync throws", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "workoutMorningAfterTitle": "เช้าวันถัดมา", + "@workoutMorningAfterTitle": { + "description": "Section header over the session-cost history" + }, + "workoutMorningAfterBody": "ประวัติของคุณเอง ไม่ใช่กฎของกิจกรรมนั้น เช้าเหล่านี้ยังได้รับผลจากช่วงเย็นก่อนหน้าด้วย ข้อมูลนี้ไม่ใช่เหตุผลให้ข้ามการออกกำลังกาย", + "@workoutMorningAfterBody": { + "description": "Disclaimer under the morning-after rows" + }, + "workoutAfterActivity": "หลัง{name}", + "@workoutAfterActivity": { + "description": "Morning-after row label naming the activity type", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "workoutUnchangedLabel": "ไม่เปลี่ยนแปลง", + "@workoutUnchangedLabel": { + "description": "Morning-after row value when the effect is inside noise" + }, + "workoutRestingHeartRateLabel": "อัตราการเต้นหัวใจขณะพัก", + "@workoutRestingHeartRateLabel": { + "description": "Morning-after row sub-label for the RHR metric" + }, + "workoutHrvLabel": "HRV", + "@workoutHrvLabel": { + "description": "Morning-after row sub-label for the HRV metric" + }, + "workoutMorningCount": "{n, plural, other{{n} เช้า}}", + "@workoutMorningCount": { + "description": "Sample-size count in the morning-after row sub-label", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "workoutInsideRangeSuffix": " · อยู่ในช่วงความผันผวนระหว่างคืน", + "@workoutInsideRangeSuffix": { + "description": "Suffix appended to a morning-after row when the effect does not exceed MDC" + }, + "workoutDeleteSessionLabel": "ลบการออกกำลังกายนี้", + "@workoutDeleteSessionLabel": { + "description": "Semantic label on the history row delete icon" + }, + "workoutStrainLabel": "ความหนัก", + "@workoutStrainLabel": { + "description": "Small caption beside the strain number on a history row" + }, + "workoutTimeInZonesTitle": "เวลาในแต่ละโซน", + "@workoutTimeInZonesTitle": { + "description": "Chart title on the history row zone bar" + }, + "workoutFixTimesOnSessionLabel": "แก้เวลาการออกกำลังกายนี้", + "@workoutFixTimesOnSessionLabel": { + "description": "Semantic label on the retime control of a history row" + }, + "workoutFixTimes": "แก้เวลา", + "@workoutFixTimes": { + "description": "Retime button text on a history row, and title of the retime screen" + }, + "workoutTimeStatLabel": "เวลา", + "@workoutTimeStatLabel": { + "description": "Session stat row label for duration" + }, + "workoutDistanceStatLabel": "ระยะทาง", + "@workoutDistanceStatLabel": { + "description": "Session stat row label for distance" + }, + "workoutCaloriesStatLabel": "แคลอรี", + "@workoutCaloriesStatLabel": { + "description": "Session stat row label for calories" + }, + "workoutNotCostedValue": "ยังไม่ได้คำนวณ", + "@workoutNotCostedValue": { + "description": "Session stat row value when calories were not estimated" + }, + "workoutMaxHrStatLabel": "HR สูงสุด", + "@workoutMaxHrStatLabel": { + "description": "Session stat row label for peak heart rate" + }, + "workoutNoReadingValue": "ไม่มีค่าที่วัดได้", + "@workoutNoReadingValue": { + "description": "Session stat row value when the band recorded nothing" + }, + "workoutConfirmDeleteTitle": "ลบ{activity}นี้หรือไม่?", + "@workoutConfirmDeleteTitle": { + "description": "Confirm-delete dialog title naming the session's activity type", + "placeholders": { + "activity": { + "type": "String" + } + } + }, + "workoutDeleteBodyOwn": "จะหายไปจาก OpenStrap สำเนาใน {storeName} ถ้ามี จะยังอยู่", + "@workoutDeleteBodyOwn": { + "description": "Confirm-delete dialog body for a session this band recorded", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutDeleteBodyImported": "จะหายไปจาก OpenStrap และไม่นำเข้าซ้ำ ต้นฉบับใน {storeName} ยังอยู่", + "@workoutDeleteBodyImported": { + "description": "Confirm-delete dialog body for an imported session", + "placeholders": { + "storeName": { + "type": "String" + } + } + }, + "workoutWhenToday": "วันนี้ {time}", + "@workoutWhenToday": { + "description": "History row timestamp for a session started today", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "workoutWhenYesterday": "เมื่อวาน {time}", + "@workoutWhenYesterday": { + "description": "History row timestamp for a session started yesterday", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "workoutWeekdayLetterMon": "จ.", + "@workoutWeekdayLetterMon": { + "description": "Single-letter weekday abbreviation (Mon) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterTue": "อ.", + "@workoutWeekdayLetterTue": { + "description": "Single-letter weekday abbreviation (Tue) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterWed": "พ.", + "@workoutWeekdayLetterWed": { + "description": "Single-letter weekday abbreviation (Wed) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterThu": "พฤ.", + "@workoutWeekdayLetterThu": { + "description": "Single-letter weekday abbreviation (Thu) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterFri": "ศ.", + "@workoutWeekdayLetterFri": { + "description": "Single-letter weekday abbreviation (Fri) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterSat": "ส.", + "@workoutWeekdayLetterSat": { + "description": "Single-letter weekday abbreviation (Sat) used in the This-week strip and small charts" + }, + "workoutWeekdayLetterSun": "อา.", + "@workoutWeekdayLetterSun": { + "description": "Single-letter weekday abbreviation (Sun) used in the This-week strip and small charts" + }, + "workoutWeekdayAbbrMon": "จ.", + "@workoutWeekdayAbbrMon": { + "description": "Three-letter weekday abbreviation (Mon) used in the History row date" + }, + "workoutWeekdayAbbrTue": "อ.", + "@workoutWeekdayAbbrTue": { + "description": "Three-letter weekday abbreviation (Tue) used in the History row date" + }, + "workoutWeekdayAbbrWed": "พ.", + "@workoutWeekdayAbbrWed": { + "description": "Three-letter weekday abbreviation (Wed) used in the History row date" + }, + "workoutWeekdayAbbrThu": "พฤ.", + "@workoutWeekdayAbbrThu": { + "description": "Three-letter weekday abbreviation (Thu) used in the History row date" + }, + "workoutWeekdayAbbrFri": "ศ.", + "@workoutWeekdayAbbrFri": { + "description": "Three-letter weekday abbreviation (Fri) used in the History row date" + }, + "workoutWeekdayAbbrSat": "ส.", + "@workoutWeekdayAbbrSat": { + "description": "Three-letter weekday abbreviation (Sat) used in the History row date" + }, + "workoutWeekdayAbbrSun": "อา.", + "@workoutWeekdayAbbrSun": { + "description": "Three-letter weekday abbreviation (Sun) used in the History row date" + }, + "activitySetupRouteLabel": "เส้นทาง", + "@activitySetupRouteLabel": { + "description": "Label for the GPS route row on the activity setup screen" + }, + "activitySetupRouteDetail": "บันทึกเมื่อใช้ตำแหน่งได้ และเก็บในโทรศัพท์นี้", + "@activitySetupRouteDetail": { + "description": "Detail text under the route row on the activity setup screen" + }, + "activitySetupHeartRateLabel": "อัตราการเต้นหัวใจ", + "@activitySetupHeartRateLabel": { + "description": "Label for the heart rate row on the activity setup screen" + }, + "activitySetupBandConnected": "เชื่อมต่อสายรัดแล้ว", + "@activitySetupBandConnected": { + "description": "Detail text when the band is connected, shown under the heart rate row" + }, + "activitySetupNoBandConnected": "ไม่มีสายรัดเชื่อมต่อ", + "@activitySetupNoBandConnected": { + "description": "Detail text when no band is connected, shown under the heart rate row" + }, + "activitySetupPrivateLabel": "การออกกำลังกายส่วนตัว", + "@activitySetupPrivateLabel": { + "description": "Label for the private-session toggle on the activity setup screen" + }, + "activitySetupWorkLabel": "ออกแรง", + "@activitySetupWorkLabel": { + "description": "Label for the work-interval stepper on the interval activity setup screen" + }, + "activitySetupRestLabel": "พัก", + "@activitySetupRestLabel": { + "description": "Label for the rest-interval stepper on the interval activity setup screen" + }, + "activitySetupRoundsLabel": "รอบ", + "@activitySetupRoundsLabel": { + "description": "Label for the round-count stepper on the interval activity setup screen" + }, + "activitySetupPrivateDetail": "ซ่อนจากสรุปและการส่งออก", + "@activitySetupPrivateDetail": { + "description": "Detail text under the private-session toggle" + }, + "activitySetupCaloriesNeedWeight": "แคลอรีต้องใช้น้ำหนักของคุณ", + "@activitySetupCaloriesNeedWeight": { + "description": "Shown instead of a calorie estimate when the user has no weight on file" + }, + "activitySetupNoMetEstimate": "ยังไม่ประมาณล่วงหน้า กิจกรรมนี้ไม่มีระดับการใช้พลังงานที่เผยแพร่ แคลอรีจะคำนวณจากอัตราการเต้นหัวใจเมื่อมีโปรไฟล์และช่วงอัตราการเต้นหัวใจของคุณ", + "@activitySetupNoMetEstimate": { + "description": "Shown instead of a calorie estimate when the activity has no published MET (e.g. General workout, Padel)" + }, + "activitySummaryCalorieNoMet": "ประมาณจากอัตราการเต้นหัวใจและน้ำหนักของคุณ กิจกรรมนี้ไม่มีระดับการใช้พลังงานที่เผยแพร่ จึงไม่นำมาใช้", + "@activitySummaryCalorieNoMet": { + "description": "Calorie basis line on the summary screen for a session whose activity has no published MET (e.g. General workout, Padel)" + }, + "activitySetupCalorieEstimate": "ประมาณ {est} kcal ต่อ {minutes} นาที จากระดับการใช้พลังงานของกิจกรรม ({met} เท่าของขณะพัก) และน้ำหนักของคุณ", + "@activitySetupCalorieEstimate": { + "description": "Calorie estimate line on the activity setup screen, e.g. 'About 250 kcal per 30 min, from 8.0 MET and your weight.'", + "placeholders": { + "est": { + "type": "int" + }, + "minutes": { + "type": "int" + }, + "met": { + "type": "String" + } + } + }, + "activitySetupTrackSets": "เซ็ต จำนวนครั้ง และน้ำหนัก — คุณบันทึกเอง", + "@activitySetupTrackSets": { + "description": "What this session type will record — strength training tracked by sets" + }, + "activitySetupTrackDistanceGps": "ระยะทาง เพซ และอัตราการเต้นหัวใจ", + "@activitySetupTrackDistanceGps": { + "description": "What this session type will record — distance-based activity with GPS" + }, + "activitySetupTrackTime": "เวลาและอัตราการเต้นหัวใจ", + "@activitySetupTrackTime": { + "description": "What this session type will record — time-based activity" + }, + "activitySetupTrackInterval": "รอบและอัตราการเต้นหัวใจ", + "@activitySetupTrackInterval": { + "description": "What this session type will record — interval/rounds-based activity" + }, + "activitySetupTrackStillness": "เวลา การหายใจ และอัตราการเต้นหัวใจ", + "@activitySetupTrackStillness": { + "description": "What this session type will record — stillness activity like yoga or breathwork" + }, + "activitySetupSessionRunningTitle": "มีการออกกำลังกายกำลังดำเนินอยู่แล้ว", + "@activitySetupSessionRunningTitle": { + "description": "Status card title when the user tries to start a session while one is already live" + }, + "activitySetupSessionRunningBody": "เริ่มพร้อมกันได้ครั้งเดียวเท่านั้น", + "@activitySetupSessionRunningBody": { + "description": "Status card body when the user tries to start a session while one is already live" + }, + "activitySetupOpenRunningSession": "เปิดการออกกำลังกายที่กำลังดำเนินอยู่", + "@activitySetupOpenRunningSession": { + "description": "Status card action button to jump to the already-running session" + }, + "activitySetupStart": "เริ่ม", + "@activitySetupStart": { + "description": "Button label to start a new activity session" + }, + "activityPickerTitle": "เลือกกิจกรรม", + "@activityPickerTitle": { + "description": "Nav bar title on the activity picker screen" + }, + "activityPickerSearchLabel": "ค้นหากิจกรรม", + "@activityPickerSearchLabel": { + "description": "Accessibility label for the activity search field" + }, + "activityPickerSearchHint": "ค้นหา {count} กิจกรรม", + "@activityPickerSearchHint": { + "description": "Placeholder hint in the activity search field, e.g. 'Search 73 activities'", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "activityPickerNoMatchTitle": "ไม่พบกิจกรรมที่ตรงกัน", + "@activityPickerNoMatchTitle": { + "description": "Status card title when a search finds no matching activity" + }, + "activityPickerNoMatchBody": "รายการมีประมาณเจ็ดสิบกิจกรรมที่มีค่าพลังงานเผยแพร่ เลือกกิจกรรมที่ใกล้เคียงที่สุด", + "@activityPickerNoMatchBody": { + "description": "Status card body when a search finds no matching activity" + }, + "activityPickerQuickStart": "เริ่มด่วน", + "@activityPickerQuickStart": { + "description": "Section heading over the quick-start row when the user has no activity history" + }, + "activityPickerRecent": "ล่าสุด", + "@activityPickerRecent": { + "description": "Section heading over the recent-activities row" + }, + "activityPickerCalorieEstimatesTitle": "ตัวเลขแคลอรีเป็นค่าประมาณ", + "@activityPickerCalorieEstimatesTitle": { + "description": "Status card title explaining that calorie figures are estimates" + }, + "activityPickerMetValue": "{met} เท่าของขณะพัก", + "@activityPickerMetValue": { + "description": "MET value shown on an activity row when no calorie estimate is available, e.g. '8.0 MET'", + "placeholders": { + "met": { + "type": "String" + } + } + }, + "activityPickerKcalPer30": "{kcal} kcal / 30 นาที", + "@activityPickerKcalPer30": { + "description": "Calorie estimate shown on an activity row, e.g. '250 kcal / 30 min'", + "placeholders": { + "kcal": { + "type": "int" + } + } + }, + "dayStrainToday": "วันนี้", + "@dayStrainToday": { + "description": "Day strain screen sub-header when the shown day is today" + }, + "dayStrainTitle": "ความหนักรายวัน", + "@dayStrainTitle": { + "description": "Day strain screen title, and the strain metric label shown inline" + }, + "dayStrainNoTraceTitle": "ไม่มีเส้นความหนักของวันนี้", + "@dayStrainNoTraceTitle": { + "description": "Status card title when a day has no strain score and no per-minute trace" + }, + "dayStrainNoMinuteTraceTitle": "ไม่มีข้อมูลรายนาทีของวันนี้", + "@dayStrainNoMinuteTraceTitle": { + "description": "Status card title when a day has a strain score but no per-minute trace stored" + }, + "dayStrainNoReasonBody": "ไม่มีข้อมูลระบุว่าเหตุใดวันนี้จึงไม่มีค่าความหนัก", + "@dayStrainNoReasonBody": { + "description": "Fallback body text when no strain trace exists and no reason was given by the backend" + }, + "dayStrainScoredNoTraceBody": "ความหนักวันนี้คือ {strain} แต่ไม่ได้เก็บข้อมูลนาทีขณะตื่นที่ใช้คำนวณของวันนี้ไว้", + "@dayStrainScoredNoTraceBody": { + "description": "Body text when a day has a strain score but no per-minute curve stored", + "placeholders": { + "strain": { + "type": "String" + } + } + }, + "dayStrainWearBandFix": "สวมสายรัดตลอดวัน", + "@dayStrainWearBandFix": { + "description": "Suggested fix action on the no-strain-trace card, shown when the band never saw the day" + }, + "dayStrainChartTitle": "ความหนักตลอดวัน", + "@dayStrainChartTitle": { + "description": "Chart title above the day's strain-over-time curve" + }, + "dayStrainChartFootnote": "การออกแรงที่เกินระดับปกติขณะตื่นของคุณ อาจลดลงภายหลังหากผ่อนกลับสู่ระดับนั้น จากข้อมูลขณะตื่น {drawn} นาที", + "@dayStrainChartFootnote": { + "description": "Footnote under the strain curve chart explaining it tracks effort above baseline pace, not a raw accumulator, so it can dip", + "placeholders": { + "drawn": { + "type": "int" + } + } + }, + "dayStrainPeakHr": "HR สูงสุด", + "@dayStrainPeakHr": { + "description": "Inline metric label for peak heart rate on the day strain screen" + }, + "dayStrainWorn": "สวมใส่", + "@dayStrainWorn": { + "description": "Inline metric label for minutes the band was worn on the day strain screen" + }, + "dayStrainLowCoverageTitle": "สายรัดสังเกตได้ {pct}% ของวันนี้", + "@dayStrainLowCoverageTitle": { + "description": "Status card title warning that band coverage was low for this day", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "dayStrainLowCoverageBody": "ความหนักรวมจากนาทีที่บันทึกได้ วันที่สวมไม่ครบจึงได้ค่าต่ำกว่าวันที่สวมครบ และเปรียบเทียบกันไม่ได้", + "@dayStrainLowCoverageBody": { + "description": "Status card body explaining why a partly-worn day is not comparable to a full one" + }, + "dayStrainTimeInZonesSection": "เวลาในแต่ละโซน", + "@dayStrainTimeInZonesSection": { + "description": "Section header above the heart-rate zone bar for the day" + }, + "dayStrainZonesChartTitle": "เวลาในแต่ละโซน", + "@dayStrainZonesChartTitle": { + "description": "Chart title for the day's time-in-zones bar" + }, + "dayStrainZoneFootnoteKarvonen": "ขอบเขตโซนครอบคลุมระหว่างอัตราการเต้นหัวใจขณะพักที่วัดได้กับค่าสูงสุดที่เคยพบ ({maxHr} bpm) ทั้งสองวัดจากคุณ", + "@dayStrainZoneFootnoteKarvonen": { + "description": "Footnote under the day's zone bar when both resting HR and ceiling are measured (karvonen)", + "placeholders": { + "maxHr": { + "type": "int" + } + } + }, + "dayStrainZoneFootnoteObserved": "ขอบเขตโซนเป็นเปอร์เซ็นต์ของอัตราการเต้นหัวใจสูงสุดที่เคยพบ ({maxHr} bpm) เป็นค่าที่วัด ไม่ใช่ค่าประมาณ", + "@dayStrainZoneFootnoteObserved": { + "description": "Footnote under the day's zone bar when only the ceiling is measured", + "placeholders": { + "maxHr": { + "type": "int" + } + } + }, + "dayStrainHowSet": "กำหนดค่าเหล่านี้อย่างไร", + "@dayStrainHowSet": { + "description": "Link/action label leading to the full zones detail screen" + }, + "dayStrainInputsSection": "ข้อมูลที่ใช้คำนวณ", + "@dayStrainInputsSection": { + "description": "Section header above the paragraph explaining what the strain score is built from" + }, + "dayStrainInputsBase": "ภาระหัวใจขณะตื่น จากนาทีในแต่ละโซนอัตราการเต้นหัวใจ แสดงในช่วง 0–21", + "@dayStrainInputsBase": { + "description": "First sentence of the day strain 'what this is made of' explanation" + }, + "dayStrainInputsMaxHr": "คำนวณโดยใช้ค่าสูงสุดที่สมมติไว้ {maxHr} bpm ซึ่งประมาณจากอายุและสายรัด ไม่ใช่ค่าที่วัด", + "@dayStrainInputsMaxHr": { + "description": "Sentence naming the assumed max heart rate the strain score was integrated against", + "placeholders": { + "maxHr": { + "type": "int" + } + } + }, + "dayStrainInputsMeasuredCeilingNote": "แถบโซนใช้ค่าสูงสุดที่วัดได้ แต่ความหนักไม่ได้ใช้ คะแนนความหนักที่เคยเห็นจึงยังเท่าเดิม", + "@dayStrainInputsMeasuredCeilingNote": { + "description": "Sentence noting the zone bar uses a different, measured ceiling than the strain score" + }, + "dayStrainInputsRhrAnchor": "จุดอ้างอิงอีกจุดคืออัตราการเต้นหัวใจขณะพักของคืนก่อน หากสายรัดพลาดคืนนั้นจะกระทบค่าทั้งวัน", + "@dayStrainInputsRhrAnchor": { + "description": "Sentence naming resting heart rate as the strain score's other anchor" + }, + "activityZonesTitle": "โซนอัตราการเต้นหัวใจ", + "@activityZonesTitle": { + "description": "Heart-rate zones detail screen title" + }, + "activityZonesYourZonesSection": "โซนของคุณ", + "@activityZonesYourZonesSection": { + "description": "Section header above the list of zone rows" + }, + "activityZonesIntensitySection": "การกระจายความเข้มข้น", + "@activityZonesIntensitySection": { + "description": "Section header above the 28-day intensity distribution chart" + }, + "activityZonesNoCeilingTitle": "ยังไม่มีค่าสูงสุดที่วัดได้", + "@activityZonesNoCeilingTitle": { + "description": "Status card title when no measured heart-rate ceiling exists yet" + }, + "activityZonesNoCeilingTanakaTail": " จนกว่าจะวัดได้ โซนด้านล่างจะคำนวณจากอายุของคุณ", + "@activityZonesNoCeilingTanakaTail": { + "description": "Trailing sentence fragment appended when age-estimated zones are shown below (note the leading space, appended directly after another sentence)" + }, + "activityZonesNoCeilingDefaultBody": "นับเฉพาะค่าสูงที่สายรัดวัดต่อเนื่อง 15 วินาทีขณะคุณเคลื่อนไหว ค่าพุ่งเพียงวินาทีเดียวไม่ถือเป็นอัตราการเต้นหัวใจ", + "@activityZonesNoCeilingDefaultBody": { + "description": "Default explanation of the 15-second hold rule for a measured ceiling, shown when no other reason was given" + }, + "activityZonesWearBandFix": "สวมสายรัดระหว่างการออกกำลังกายหนักตามปกติ", + "@activityZonesWearBandFix": { + "description": "Suggested fix action on the no-ceiling card" + }, + "activityZonesHighestSeenLabel": "ค่าสูงสุดที่เคยพบ", + "@activityZonesHighestSeenLabel": { + "description": "Label above the highest measured heart rate figure" + }, + "activityZonesBpmUnit": "bpm", + "@activityZonesBpmUnit": { + "description": "Unit label 'bpm' shown next to a heart-rate number" + }, + "activityZonesCeilingOnDate": "เมื่อ {date}", + "@activityZonesCeilingOnDate": { + "description": "Fragment naming the date the heart-rate ceiling was recorded, e.g. 'on 3 Aug'", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "activityZonesCeilingDuringSession": "ระหว่าง {session}", + "@activityZonesCeilingDuringSession": { + "description": "Fragment naming the session type the ceiling was recorded during, e.g. 'during running'", + "placeholders": { + "session": { + "type": "String" + } + } + }, + "activityZonesHighestSeenFootnote": "เป็นค่าสูงสุดที่เคยวัด ไม่ใช่ขีดจำกัด ค่าจะเพิ่มเมื่อสายรัดพบการออกแรงที่หนักขึ้น ไม่ควรไปทดสอบขีดจำกัดเอง", + "@activityZonesHighestSeenFootnote": { + "description": "Footnote clarifying the highest-seen heart rate is not a limit and should not be deliberately tested" + }, + "activityZonesNoZonesTitle": "ยังไม่มีโซน", + "@activityZonesNoZonesTitle": { + "description": "Status card title when there are no zone edges at all" + }, + "activityZonesNoAgeBody": "ขอบเขตโซนเป็นเปอร์เซ็นต์ของอัตราการเต้นหัวใจสูงสุด หากไม่มีอายุจะไม่มีค่าให้คำนวณเปอร์เซ็นต์", + "@activityZonesNoAgeBody": { + "description": "Explanation shown when zone edges are missing because the user's age is not set" + }, + "catalogueZonesWhy": "ขอบเขตโซนเป็นเปอร์เซ็นต์ของอัตราการเต้นหัวใจสูงสุดที่ประมาณจากอายุ ไม่ใช่ค่าสูงสุดที่วัดจากคุณ", + "@catalogueZonesWhy": { + "description": "Shared footnote under the zone chart on the workout summary and day-strain screens, when the ceiling is a Tanaka age estimate rather than a measured one" + }, + "activityZonesNoZonesDefaultBody": "ไม่มีข้อมูลระบุว่าเหตุใดจึงยังไม่มีขอบเขตโซน", + "@activityZonesNoZonesDefaultBody": { + "description": "Fallback explanation when zone edges are missing and no reason was given" + }, + "activityZonesAddAgeFix": "เพิ่มอายุในโปรไฟล์", + "@activityZonesAddAgeFix": { + "description": "Suggested fix action to add age in Profile, shown only when age truly is missing" + }, + "activityZonesAnchorKarvonen": "จากอัตราขณะพัก ({restingHr} ค่ากลาง {restingDays} คืนล่าสุด) และค่าสูงสุดที่เคยพบ ({maxHr}) เป็นโซนมาตรฐาน ไม่ใช่โซนที่ทดสอบแล้ว", + "@activityZonesAnchorKarvonen": { + "description": "Explanation of how zone edges were built when both resting HR and ceiling are measured", + "placeholders": { + "restingHr": { + "type": "int" + }, + "restingDays": { + "type": "int" + }, + "maxHr": { + "type": "int" + } + } + }, + "activityZonesAnchorObserved": "จากอัตราการเต้นหัวใจสูงสุดที่เคยพบ ({maxHr}) เมื่อมีอัตราขณะพักครบ {restingMinDays} คืน (ขณะนี้ {restingDays}) จะนำมาร่วมคำนวณด้วย", + "@activityZonesAnchorObserved": { + "description": "Explanation of how zone edges were built when only the ceiling is measured and resting HR history is still short", + "placeholders": { + "maxHr": { + "type": "int" + }, + "restingMinDays": { + "type": "int" + }, + "restingDays": { + "type": "int" + } + } + }, + "activityZonesAnchorTanaka": "จาก {maxHr} bpm ที่ประมาณตามอายุ จึงอาจคลาดเคลื่อน 20 bpm โซนจะเปลี่ยนเมื่อสายรัดพบการออกกำลังกายที่หนักพอ", + "@activityZonesAnchorTanaka": { + "description": "Explanation of how zone edges were built from an age-estimated maximum heart rate", + "placeholders": { + "maxHr": { + "type": "int" + } + } + }, + "activityZonesAnchorDefault": "ขอบเขตโซนเป็นเปอร์เซ็นต์ของอัตราการเต้นหัวใจสูงสุด", + "@activityZonesAnchorDefault": { + "description": "Generic fallback explanation of what zone edges are" + }, + "activityZonesAnchorManual": "คุณกำหนดเอง ไม่ได้คำนวณ เกณฑ์ทั้งห้านี้แทนค่าที่จะได้จากอายุหรือค่าสูงสุดที่วัด", + "@activityZonesAnchorManual": { + "description": "Explanation shown when the user's own manual zone boundaries are in effect" + }, + "activityZonesSetYourOwnLink": "กำหนดโซนเอง", + "@activityZonesSetYourOwnLink": { + "description": "Link opening the manual zone-boundary editor, shown when no manual override is set" + }, + "activityZonesEditYourOwnLink": "แก้ไขโซนของคุณ", + "@activityZonesEditYourOwnLink": { + "description": "Link opening the manual zone-boundary editor, shown when a manual override is already set" + }, + "activityZonesEditYourOwnTitle": "กำหนดโซนเอง", + "@activityZonesEditYourOwnTitle": { + "description": "Title of the manual zone-boundary editor sheet" + }, + "activityZonesEditYourOwnBody": "เกณฑ์ bpm ห้าค่าเรียงจากต่ำไปสูง ระบุจุดเริ่มแต่ละโซน ล้างทั้งห้าเพื่อกลับไปใช้โซนที่แอปคำนวณ", + "@activityZonesEditYourOwnBody": { + "description": "Explanation text in the manual zone-boundary editor sheet" + }, + "activityZonesNeedAllFive": "ต้องระบุครบห้าเกณฑ์จากต่ำไปสูง ยังไม่ได้บันทึก", + "@activityZonesNeedAllFive": { + "description": "Error shown when only some of the five manual zone fields were filled in" + }, + "activityZonesMustAscend": "แต่ละโซนต้องเริ่มสูงกว่าโซนก่อนหน้า ยังไม่ได้บันทึก", + "@activityZonesMustAscend": { + "description": "Error shown when the five manual zone thresholds are not strictly ascending" + }, + "activityZonesNotShownTitle": "ยังไม่แสดง", + "@activityZonesNotShownTitle": { + "description": "Status card title when the 28-day intensity distribution is not yet shown" + }, + "activityZonesNeedsMonthBody": "ต้องมีการออกกำลังกายที่บันทึกประมาณหนึ่งเดือน โดยแต่ละครั้งมีอัตราการเต้นหัวใจรายนาที", + "@activityZonesNeedsMonthBody": { + "description": "Explanation of what is needed before the intensity distribution chart appears, when zones are measured" + }, + "activityZonesAgeEstimateBody": "แท่งจะแสดงเพียงผลประมาณตามอายุ ไม่ใช่การฝึกของคุณ จะแสดงเมื่อขอบเขตโซนด้านบนมาจากการวัดแล้ว", + "@activityZonesAgeEstimateBody": { + "description": "Explanation of why the intensity distribution is withheld when zones are only age-estimated" + }, + "activityZonesCurrentEdgesNote": "ช่วงต่าง ๆ ใช้ขอบเขตโซนปัจจุบัน การออกกำลังกายเก่าอาจนับด้วยขอบเขตอื่น", + "@activityZonesCurrentEdgesNote": { + "description": "Footnote under the 28-day zone minutes: the printed bpm ranges are today's edges" + }, + "activityZonesSessionMinutesChartTitle": "นาทีออกกำลังกายใน 28 วันล่าสุด", + "@activityZonesSessionMinutesChartTitle": { + "description": "Chart title for the 28-day session-minutes-by-zone bar" + }, + "activityZonesShapePyramidal": "นาทีส่วนใหญ่เบา ปานกลางน้อยกว่า และหนักน้อยที่สุด เป็นทรงพีระมิด", + "@activityZonesShapePyramidal": { + "description": "Description of a pyramidal training-intensity distribution shape" + }, + "activityZonesShapePolarised": "นาทีส่วนใหญ่เบา ที่เหลือหนัก และมีปานกลางเพียงเล็กน้อย", + "@activityZonesShapePolarised": { + "description": "Description of a polarised training-intensity distribution shape" + }, + "activityZonesShapeMiddleHeavy": "นาทีส่วนใหญ่อยู่ระดับปานกลาง แทนที่จะเบาหรือหนัก", + "@activityZonesShapeMiddleHeavy": { + "description": "Description of a middle-heavy training-intensity distribution shape" + }, + "activityZonesShapeSummary": "เบา {easy} นาที ปานกลาง {moderate} นาที หนัก {hard} นาที จากการออกกำลังกาย {sessions} ครั้ง เป็นคำอธิบาย ไม่ใช่เป้าหมาย", + "@activityZonesShapeSummary": { + "description": "Sentence summarizing minutes spent easy/moderate/hard across recorded sessions", + "placeholders": { + "easy": { + "type": "int" + }, + "moderate": { + "type": "int" + }, + "hard": { + "type": "int" + }, + "sessions": { + "type": "int" + } + } + }, + "activityShareTitle": "แชร์", + "@activityShareTitle": { + "description": "Nav bar title on the share screen, and the label of its main share button" + }, + "activityShareOpenFailed": "เปิดหน้าต่างแชร์ไม่ได้", + "@activityShareOpenFailed": { + "description": "Snackbar shown when the OS share sheet fails to open" + }, + "activitySharePhotoHeader": "รูปภาพของคุณ", + "@activitySharePhotoHeader": { + "description": "Section eyebrow header above the photo picker row on the share screen" + }, + "activityShareAddPhoto": "เพิ่มรูปภาพ", + "@activityShareAddPhoto": { + "description": "Row label when no photo has been chosen yet for the share card" + }, + "activityShareChangePhoto": "เปลี่ยนรูปภาพ", + "@activityShareChangePhoto": { + "description": "Row label when a photo has already been chosen, to pick a different one" + }, + "activitySharePhotoHint": "จากโทรศัพท์นี้ ไม่มีการอัปโหลด", + "@activitySharePhotoHint": { + "description": "Subtitle under the photo row explaining the photo stays on-device" + }, + "activityShareRemovePhoto": "ลบรูปภาพ", + "@activityShareRemovePhoto": { + "description": "Row label/button to remove the chosen photo from the share card" + }, + "activityShareBasemapHeader": "แผนที่ฐาน", + "@activityShareBasemapHeader": { + "description": "Section eyebrow header above the basemap toggle row on the share screen" + }, + "activityShareDrawMap": "แสดงแผนที่จริง", + "@activityShareDrawMap": { + "description": "Row label for the toggle that fetches real map tiles for the route" + }, + "activityShareMapHint": "ขอแผ่นภาพแผนที่ครอบคลุมเส้นทางนี้จาก openstreetmap.org เมื่อปิดจะแสดงเฉพาะเส้นทาง", + "@activityShareMapHint": { + "description": "Subtitle explaining the basemap toggle asks openstreetmap.org for tiles" + }, + "activityShareFetchingMapTitle": "กำลังดึงแผนที่", + "@activityShareFetchingMapTitle": { + "description": "Status card title while map tiles are being fetched" + }, + "activityShareFetchingMapBody": "การ์ดจะแสดงเมื่อได้รับแผ่นภาพครบ", + "@activityShareFetchingMapBody": { + "description": "Status card body while map tiles are being fetched" + }, + "activityShareNoMapTitle": "ไม่มีแผนที่สำหรับการ์ดนี้", + "@activityShareNoMapTitle": { + "description": "Status card title when the map tile fetch failed" + }, + "activityShareNoMapBody": "ดึงแผ่นภาพแผนที่ไม่ได้ จึงแสดงเฉพาะเส้นทาง ส่วนอื่นของการ์ดยังเหมือนเดิม", + "@activityShareNoMapBody": { + "description": "Status card body explaining the map tile fetch failed and the route drew on its own" + }, + "activityShareStatusPrivateTitle": "การออกกำลังกายนี้เป็นส่วนตัว", + "@activityShareStatusPrivateTitle": { + "description": "Status card title shown when the session being shared is marked private" + }, + "activityShareStatusPrivateBody": "ซ่อนจากสรุปและการส่งออก", + "@activityShareStatusPrivateBody": { + "description": "Status card body explaining a private session is hidden from summaries and exports" + }, + "activityPosterFormatPost": "โพสต์", + "@activityPosterFormatPost": { + "description": "Format switcher label for the 1:1 feed post crop of the share card" + }, + "activityPosterFormatStory": "สตอรี", + "@activityPosterFormatStory": { + "description": "Format switcher label for the 9:16 portrait story crop of the share card" + }, + "activitySummaryRpeHeadline": "คุณรู้สึกว่าหนักแค่ไหน?", + "@activitySummaryRpeHeadline": { + "description": "Header of the TS-09 post-session effort rating card" + }, + "activitySummaryRpeBody": "คะแนนความหนักจากความรู้สึกของคุณ ไม่ใช่ค่าที่วัด จุดประสงค์คือสะท้อนความรู้สึกซึ่งอาจไม่ตรงกับตัวเลขด้านบน", + "@activitySummaryRpeBody": { + "description": "Explanatory body text under the effort rating card header" + }, + "activitySummaryRateEffort": "ให้คะแนนการออกแรงนี้ {n} จาก 10", + "@activitySummaryRateEffort": { + "description": "Semantic label on each of the 10 effort-rating tap targets", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryRpeVeryEasy": "1 · เบามาก", + "@activitySummaryRpeVeryEasy": { + "description": "Left-hand caption under the 1-10 effort rating scale" + }, + "activitySummaryRpeMaximal": "10 · หนักที่สุด", + "@activitySummaryRpeMaximal": { + "description": "Right-hand caption under the 1-10 effort rating scale" + }, + "activitySummaryNotNow": "ไว้ก่อน", + "@activitySummaryNotNow": { + "description": "Button to dismiss the effort rating card without answering" + }, + "activitySummaryShareThis": "แชร์{name}นี้", + "@activitySummaryShareThis": { + "description": "Semantic label on the share icon in the summary nav bar", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "activitySummaryChangeType": "เปลี่ยนประเภทกิจกรรม", + "@activitySummaryChangeType": { + "description": "Semantic label on the pencil icon that lets the user correct the activity type" + }, + "activitySummaryShareToStrava": "แชร์ไป Strava", + "@activitySummaryShareToStrava": { + "description": "Label on the button that exports the recorded route as a GPX file to the OS share sheet for manual upload to Strava (or anywhere else that reads GPX) — no Strava account or API call involved" + }, + "activitySummaryUnsavedTitle": "ยังไม่ได้บันทึกการออกกำลังกายนี้", + "@activitySummaryUnsavedTitle": { + "description": "Title of the status card shown when a finished session failed to save" + }, + "activitySummaryUnsavedBody": "เขียนข้อมูลลงโทรศัพท์นี้ไม่สำเร็จ", + "@activitySummaryUnsavedBody": { + "description": "Body of the status card shown when a finished session failed to save" + }, + "activitySummarySaving": "กำลังบันทึก", + "@activitySummarySaving": { + "description": "Fix button label while a retried save is in flight" + }, + "activitySummaryTryAgain": "ลองอีกครั้ง", + "@activitySummaryTryAgain": { + "description": "Fix button label to retry saving an unsaved session" + }, + "activitySummaryPrivate": "ส่วนตัว", + "@activitySummaryPrivate": { + "description": "Pill label shown next to the hero stat when the session is marked private" + }, + "activitySummaryStepsBasis": "ก้าวมาจากเซ็นเซอร์การเคลื่อนไหวของสายรัด ซึ่งนับได้เฉพาะกิจกรรมที่ใช้เท้า", + "@activitySummaryStepsBasis": { + "description": "Sentence explaining where the step count came from, appended to the calorie basis note" + }, + "activitySummaryCaloriesNeedWeight": "แคลอรีต้องใช้น้ำหนักของคุณ", + "@activitySummaryCaloriesNeedWeight": { + "description": "Calorie basis note when the user has no weight on file" + }, + "activitySummaryNoCalorieNoStrain": "ไม่มีค่าแคลอรีสำหรับครั้งนี้ การประมาณพลังงานจากอัตราการเต้นหัวใจต้องใช้ค่าสูงสุดและค่าขณะพัก แต่ยังขาดค่าใดค่าหนึ่ง", + "@activitySummaryNoCalorieNoStrain": { + "description": "Calorie basis note when there is no calorie figure and no strain figure either" + }, + "activitySummaryNoCalorieWithStrain": "ไม่มีแคลอรีสำหรับครั้งนี้ โปรดตั้งอัตราการเต้นหัวใจสูงสุดและขณะพัก ความหนักด้านบนคือการออกแรงที่วัดได้ในช่วง 0–21", + "@activitySummaryNoCalorieWithStrain": { + "description": "Calorie basis note when there is no calorie figure but a strain figure exists" + }, + "activitySummaryCalorieNoHr": "ประมาณจากระดับการใช้พลังงานของกิจกรรม ({met} เท่าของขณะพัก) และน้ำหนัก ไม่มีข้อมูลอัตราการเต้นหัวใจของครั้งนี้", + "@activitySummaryCalorieNoHr": { + "description": "Calorie basis note when calories were estimated from MET and weight with no heart rate", + "placeholders": { + "met": { + "type": "String" + } + } + }, + "activitySummaryCalorieWithHr": "ประมาณจากระดับการใช้พลังงานของกิจกรรม ({met} เท่าของขณะพัก) น้ำหนัก และอัตราการเต้นหัวใจ", + "@activitySummaryCalorieWithHr": { + "description": "Calorie basis note when calories were estimated using heart rate too", + "placeholders": { + "met": { + "type": "String" + } + } + }, + "activitySummaryNothingLoggedWithLoad": "ไม่มีรายการที่บันทึกน้ำหนัก", + "@activitySummaryNothingLoggedWithLoad": { + "description": "Hero caption for a strength session with sets logged but no load recorded" + }, + "activitySummarySetUnit": "{n, plural, other{เซ็ต}}", + "@activitySummarySetUnit": { + "description": "Unit word next to the hero set count on a strength session with no volume", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryVolumeLoadedSets": "ปริมาณรวมของเซ็ตที่มีน้ำหนัก", + "@activitySummaryVolumeLoadedSets": { + "description": "Hero caption for total volume when some sets had no recorded load" + }, + "activitySummaryTotalVolume": "ปริมาณรวม", + "@activitySummaryTotalVolume": { + "description": "Hero caption for total volume when every set had a recorded load" + }, + "activitySummaryElapsedTime": "เวลาที่ผ่านไป", + "@activitySummaryElapsedTime": { + "description": "Fallback hero caption showing plain elapsed time" + }, + "activitySummaryClimbed": "ไต่ขึ้น +{m} ม.", + "@activitySummaryClimbed": { + "description": "Hero caption showing metres climbed on a journey/hike session", + "placeholders": { + "m": { + "type": "int" + } + } + }, + "activitySummaryClimbedFt": "ไต่ขึ้น +{ft} ฟุต", + "@activitySummaryClimbedFt": { + "description": "Hero caption showing feet climbed on a journey/hike session, for imperial units", + "placeholders": { + "ft": { + "type": "int" + } + } + }, + "activitySummaryLapsCaption": "{n, plural, other{{n} รอบ}}", + "@activitySummaryLapsCaption": { + "description": "Hero caption showing lap count on a swim/row session", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryNoRouteTitle": "ไม่มีเส้นทางของครั้งนี้", + "@activitySummaryNoRouteTitle": { + "description": "Title of the status card when a route session recorded no GPS track" + }, + "activitySummaryNoRouteBody": "ปิดตำแหน่งอยู่ หรือไม่ได้บันทึกกิจกรรมนี้ด้วย GPS", + "@activitySummaryNoRouteBody": { + "description": "Body of the status card when a route session recorded no GPS track" + }, + "activitySummaryRouteTitle": "เส้นทาง", + "@activitySummaryRouteTitle": { + "description": "Chart title above the route map" + }, + "activitySummarySlower": "ช้าลง", + "@activitySummarySlower": { + "description": "Route map legend entry for the slow end of the pace colour scale" + }, + "activitySummaryFaster": "เร็วขึ้น", + "@activitySummaryFaster": { + "description": "Route map legend entry for the fast end of the pace colour scale" + }, + "activitySummaryStartFinishPinned": "ปักจุดเริ่มและจุดจบแล้ว", + "@activitySummaryStartFinishPinned": { + "description": "Route map footnote when there is no distance to report" + }, + "activitySummaryRouteFootnote": "{distance} {unit} ปักจุดเริ่มและจุดจบแล้ว", + "@activitySummaryRouteFootnote": { + "description": "Route map footnote reporting distance plus that start/finish are pinned", + "placeholders": { + "distance": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "activitySummaryNoSetsTitle": "ยังไม่ได้บันทึกเซ็ต", + "@activitySummaryNoSetsTitle": { + "description": "Title of the status card when a strength session has no sets logged" + }, + "activitySummaryNoSetsBody": "ครั้งนี้ไม่ได้กรอกข้อมูล จึงไม่มีน้ำหนักหรือปริมาณให้รวม", + "@activitySummaryNoSetsBody": { + "description": "Body of the status card on the overview tab when a strength session has no sets logged" + }, + "activitySummaryNoRoundsTitle": "ยังไม่ได้บันทึกรอบ", + "@activitySummaryNoRoundsTitle": { + "description": "Title of the status card when an interval session has no rounds recorded" + }, + "activitySummaryNoRoundsBody": "บันทึกแล้ว 0 รอบ", + "@activitySummaryNoRoundsBody": { + "description": "Body of the status card when an interval session has no rounds recorded" + }, + "activitySummaryIntervalLadderTitle": "แผนภูมิช่วงออกแรงสลับพัก", + "@activitySummaryIntervalLadderTitle": { + "description": "Chart title above the interval work/rest ladder" + }, + "activitySummaryWork": "ออกแรง", + "@activitySummaryWork": { + "description": "Interval ladder legend entry for work intervals" + }, + "activitySummaryRest": "พัก", + "@activitySummaryRest": { + "description": "Interval ladder legend entry for rest intervals" + }, + "activitySummaryRoundLabel": "รอบที่ {n}", + "@activitySummaryRoundLabel": { + "description": "X-axis label naming a round number on the interval ladder chart", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryLongestBlock": "ช่วงยาวที่สุด {time}", + "@activitySummaryLongestBlock": { + "description": "Interval ladder footnote naming the longest work or rest block", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activitySummaryPosesCount": "{n, plural, other{{n} ท่า}}", + "@activitySummaryPosesCount": { + "description": "Caption on the flow session's defining-object card counting logged poses", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryNoLapsTitle": "ยังไม่ได้นับรอบ", + "@activitySummaryNoLapsTitle": { + "description": "Title of the status card when a laps session has no laps counted" + }, + "activitySummaryNoLapsBody": "แตะนับแล้ว 0 รอบ", + "@activitySummaryNoLapsBody": { + "description": "Body of the status card when a laps session has no laps counted" + }, + "activitySummaryLapsTitle": "รอบ", + "@activitySummaryLapsTitle": { + "description": "Chart title above the lap-time bar chart" + }, + "activitySummaryLapLabel": "รอบที่ {n}", + "@activitySummaryLapLabel": { + "description": "Row label naming a lap number in the lap list", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryLapFastest": "{time} เร็วที่สุด", + "@activitySummaryLapFastest": { + "description": "Screen-reader label for the fastest lap's time, since bold is not spoken", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activitySummaryPoolLength": "สระ {m} ม.", + "@activitySummaryPoolLength": { + "description": "Lap chart footnote fragment naming the pool length", + "placeholders": { + "m": { + "type": "int" + } + } + }, + "activitySummaryFastest": "เร็วที่สุด {time}", + "@activitySummaryFastest": { + "description": "Lap chart footnote fragment naming the fastest lap time", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activitySummarySlowest": "ช้าที่สุด {time}", + "@activitySummarySlowest": { + "description": "Lap chart footnote fragment naming the slowest lap time", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activitySummaryNoElevationTitle": "ไม่มีข้อมูลความสูงตามเส้นทาง", + "@activitySummaryNoElevationTitle": { + "description": "Title of the status card when a journey session has no elevation profile" + }, + "activitySummaryNoElevationBody": "ไม่มีเส้นทาง หรือเส้นทางไม่มีข้อมูลความสูง", + "@activitySummaryNoElevationBody": { + "description": "Body of the status card when a journey session has no elevation profile" + }, + "activitySummaryElevationTitle": "ความสูง", + "@activitySummaryElevationTitle": { + "description": "Chart title above the elevation profile" + }, + "activitySummaryStart": "เริ่ม", + "@activitySummaryStart": { + "description": "X-axis / footnote label meaning the start of the session" + }, + "activitySummaryFinish": "จบ", + "@activitySummaryFinish": { + "description": "X-axis label meaning the finish of the session, paired with Start" + }, + "activitySummaryGain": "ไต่ขึ้น", + "@activitySummaryGain": { + "description": "Inline metric label for elevation gained on a journey session" + }, + "activitySummaryLoss": "ลง", + "@activitySummaryLoss": { + "description": "Inline metric label for elevation lost on a journey session" + }, + "activitySummaryPeak": "จุดสูงสุด", + "@activitySummaryPeak": { + "description": "Inline metric label for peak elevation reached on a journey session" + }, + "activitySummaryColdPlungeWhy": "ความเย็นทำให้หลอดเลือดที่เซ็นเซอร์อ่านหดตัว การไม่มีค่าที่นี่เป็นสิ่งที่คาดได้ ไม่ใช่ความขัดข้อง", + "@activitySummaryColdPlungeWhy": { + "description": "Explanation shown on a cold plunge session for why the sensor found no pulse" + }, + "activitySummaryHeatWhy": "ความร้อน เหงื่อ และสายรัดที่หลวมเมื่อร่างกายอุ่นขึ้นทำให้เซ็นเซอร์อ่านชีพจรไม่ได้ การไม่มีค่าที่นี่เป็นเรื่องปกติ ไม่ใช่ความขัดข้อง", + "@activitySummaryHeatWhy": { + "description": "Explanation shown on a sauna/heat session for why the sensor found no pulse" + }, + "activitySummaryNoPulseTitle": "ไม่มีค่าชีพจรสำหรับ{activity}นี้", + "@activitySummaryNoPulseTitle": { + "description": "Status card title when a heat/cold session found no pulse at all", + "placeholders": { + "activity": { + "type": "String" + } + } + }, + "activitySummaryOneMinutePulse": "มีชีพจรเพียงหนึ่งนาที", + "@activitySummaryOneMinutePulse": { + "description": "Status card title when a heat/cold session found only one minute of pulse" + }, + "activitySummaryPulseGapNote": "สายรัดพบชีพจร {have} จาก {total} นาที ช่องว่างเป็นสิ่งที่คาดได้ จึงแสดงเฉพาะช่วงที่อ่านได้", + "@activitySummaryPulseGapNote": { + "description": "Footnote on the heart-rate chart of a heat/cold session noting partial pulse coverage", + "placeholders": { + "have": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "activitySummaryTooShortTitle": "สั้นเกินกว่าจะแสดงกราฟ", + "@activitySummaryTooShortTitle": { + "description": "Status card title when a session is too short to chart heart rate" + }, + "activitySummaryTooShortBody": "อัตราการเต้นหัวใจหนึ่งนาทีเป็นเพียงจุด ไม่ใช่เส้น", + "@activitySummaryTooShortBody": { + "description": "Status card body when a session is too short to chart heart rate" + }, + "activitySummaryNoHrTitle": "ไม่มีอัตราการเต้นหัวใจของครั้งนี้", + "@activitySummaryNoHrTitle": { + "description": "Status card title when a non-thermal session recorded no heart rate at all" + }, + "activitySummaryNoHrBody": "สายรัดไม่ได้รายงานข้อมูลระหว่างครั้งนี้", + "@activitySummaryNoHrBody": { + "description": "Status card body when a non-thermal session recorded no heart rate at all" + }, + "activitySummaryCheckBandConnection": "ตรวจสอบการเชื่อมต่อสายรัด", + "@activitySummaryCheckBandConnection": { + "description": "Fix button label pointing the user at the profile's sources list" + }, + "activitySummaryPartialTrace": "ข้อมูลบางส่วน — สายรัดส่งข้อมูล {pct}% ของนาทีเหล่านี้", + "@activitySummaryPartialTrace": { + "description": "Heart-rate chart footnote when the stored trace covers less than 90% of the session", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "activitySummaryHeartRateTitle": "อัตราการเต้นหัวใจ", + "@activitySummaryHeartRateTitle": { + "description": "Chart title above the heart-rate trace" + }, + "activitySummaryHardMinutesNote": "{min} นาทีที่เกิน 80% ของค่าสูงสุดของคุณ", + "@activitySummaryHardMinutesNote": { + "description": "Heart-rate chart footnote naming minutes spent above 80% of max heart rate", + "placeholders": { + "min": { + "type": "int" + } + } + }, + "activitySummaryTimeInZonesTitle": "เวลาในแต่ละโซน", + "@activitySummaryTimeInZonesTitle": { + "description": "Chart title above the heart-rate zone bar" + }, + "activitySummaryTopSet": "เซ็ตสูงสุด", + "@activitySummaryTopSet": { + "description": "Section title above the heaviest logged set on a strength session" + }, + "activitySummaryOneRepMax": "ประมาณ 1RM {kg} กก.", + "@activitySummaryOneRepMax": { + "description": "Estimated one-rep-max caption under the top set exercise name", + "placeholders": { + "kg": { + "type": "int" + } + } + }, + "activitySummarySomeSetsNoLoadTitle": "บางเซ็ตไม่ระบุน้ำหนัก", + "@activitySummarySomeSetsNoLoadTitle": { + "description": "Status card title when some strength sets were logged with no load" + }, + "activitySummarySomeSetsNoLoadBody": "นับรวมเซ็ตและจำนวนครั้ง แต่ไม่รวมปริมาณ", + "@activitySummarySomeSetsNoLoadBody": { + "description": "Status card body when some strength sets were logged with no load" + }, + "activitySummaryScore": "คะแนน", + "@activitySummaryScore": { + "description": "Section title above the match game score table" + }, + "activitySummaryGameSetLabel": "เซ็ต {n}", + "@activitySummaryGameSetLabel": { + "description": "Row label naming a game set number in the match score table", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryNoSplitsTitle": "ไม่มีข้อมูลแยกช่วงของครั้งนี้", + "@activitySummaryNoSplitsTitle": { + "description": "Status card title on the Splits tab when a route session has no splits" + }, + "activitySummaryNoSplitsBody": "การแยกช่วงต้องมีระยะทางที่บันทึก", + "@activitySummaryNoSplitsBody": { + "description": "Status card body on the Splits tab when a route session has no splits" + }, + "activitySummaryKm": "กม.", + "@activitySummaryKm": { + "description": "Column header for kilometre number in the route splits table" + }, + "activitySummaryPace": "เพซ", + "@activitySummaryPace": { + "description": "Column header for pace in the route splits table" + }, + "activitySummaryHr": "HR", + "@activitySummaryHr": { + "description": "Column header for average heart rate in the route splits table" + }, + "activitySummarySetsLoggedZero": "บันทึกแล้ว 0 เซ็ต", + "@activitySummarySetsLoggedZero": { + "description": "Status card body on the Splits tab when a strength session has no sets logged" + }, + "activitySummaryRoundHeader": "รอบ", + "@activitySummaryRoundHeader": { + "description": "Column header for round number in the interval splits table" + }, + "activitySummaryWorkHeader": "ออกแรง", + "@activitySummaryWorkHeader": { + "description": "Column header for work duration in the interval splits table" + }, + "activitySummaryRestHeader": "พัก", + "@activitySummaryRestHeader": { + "description": "Column header for rest duration in the interval splits table" + }, + "activitySummaryAvgBpm": "BPM เฉลี่ย", + "@activitySummaryAvgBpm": { + "description": "Column header for average heart rate in the interval splits table" + }, + "activitySummaryLapHeader": "รอบ", + "@activitySummaryLapHeader": { + "description": "Column header for lap number in the laps splits table" + }, + "activitySummaryTimeHeader": "เวลา", + "@activitySummaryTimeHeader": { + "description": "Column header for lap time in the laps splits table" + }, + "activitySummarySpeedVsFastest": "ความเร็วเทียบรอบเร็วที่สุด", + "@activitySummarySpeedVsFastest": { + "description": "Column header for relative lap speed in the laps splits table" + }, + "activitySummaryBodyweightReps": "{n, plural, other{{n} ครั้ง · น้ำหนักตัว}}", + "@activitySummaryBodyweightReps": { + "description": "Set row text for a logged set with no recorded load", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activitySummaryRpeValue": "RPE {v}", + "@activitySummaryRpeValue": { + "description": "Set-level RPE value shown next to a logged set", + "placeholders": { + "v": { + "type": "int" + } + } + }, + "activitySummaryNothingToPlot": "ไม่มีข้อมูลให้วาดกราฟ{activity}นี้", + "@activitySummaryNothingToPlot": { + "description": "Status card title on the Graphs tab for a heat/cold session with no trace to plot", + "placeholders": { + "activity": { + "type": "String" + } + } + }, + "activitySummaryNoSeriesTitle": "ไม่มีชุดข้อมูลให้วาดกราฟ", + "@activitySummaryNoSeriesTitle": { + "description": "Status card title on the Graphs tab when a session recorded no per-minute series" + }, + "activitySummaryNoSeriesBody": "ครั้งนี้ไม่ได้บันทึกข้อมูลรายนาที", + "@activitySummaryNoSeriesBody": { + "description": "Status card body on the Graphs tab when a session recorded no per-minute series" + }, + "activitySummaryHeartRateZones": "โซนอัตราการเต้นหัวใจ", + "@activitySummaryHeartRateZones": { + "description": "Section title above the heart-rate zone breakdown chart" + }, + "activitySummaryTabOverview": "ภาพรวม", + "@activitySummaryTabOverview": { + "description": "Sub-tab label for the Overview tab on the activity summary screen" + }, + "activitySummaryTabSplits": "แยกช่วง", + "@activitySummaryTabSplits": { + "description": "Sub-tab label for the Splits tab on the activity summary screen" + }, + "activitySummaryTabGraphs": "กราฟ", + "@activitySummaryTabGraphs": { + "description": "Sub-tab label for the Graphs tab on the activity summary screen" + }, + "activityExercisePickerChooseTitle": "เลือกท่าออกกำลังกาย", + "@activityExercisePickerChooseTitle": { + "description": "Title of the strength exercise picker when selecting a new exercise." + }, + "activityExercisePickerChangeTitle": "เปลี่ยนท่าออกกำลังกาย", + "@activityExercisePickerChangeTitle": { + "description": "Title of the strength exercise picker when replacing or switching from the current exercise." + }, + "activityExercisePickerSearchLabel": "ค้นหาท่าออกกำลังกาย", + "@activityExercisePickerSearchLabel": { + "description": "Accessibility label for the strength exercise search field." + }, + "activityExercisePickerSearchHint": "ค้นหา {count} ท่า", + "@activityExercisePickerSearchHint": { + "description": "Placeholder in the strength exercise search field.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "activityExercisePickerCommonFilter": "ท่าที่ใช้บ่อย", + "@activityExercisePickerCommonFilter": { + "description": "Filter showing Edge's short common-exercise list." + }, + "activityExercisePickerAllFilter": "ทั้งหมด", + "@activityExercisePickerAllFilter": { + "description": "Filter showing the whole strength exercise catalogue." + }, + "activityExercisePickerNoMatch": "ไม่พบท่าที่ตรงกัน", + "@activityExercisePickerNoMatch": { + "description": "Empty result shown for an exercise search or category filter." + }, + "activityExercisePickerWgerCredit": "รายการท่าออกกำลังกายจาก wger", + "@activityExercisePickerWgerCredit": { + "description": "Attribution under the strength exercise picker." + }, + "activityExercisePickerSourceLabel": "ดูที่มาและเครดิตของ {exercise}", + "@activityExercisePickerSourceLabel": { + "description": "Accessibility label and tooltip for a wger exercise's exact source record.", + "placeholders": { + "exercise": { + "type": "String" + } + } + }, + "activityLiveAddALap": "เพิ่มรอบ", + "@activityLiveAddALap": { + "description": "Live swim screen: accessibility label for the tap-a-lap button." + }, + "activityLiveAddExerciseTitle": "เพิ่มท่าออกกำลังกาย", + "@activityLiveAddExerciseTitle": { + "description": "Live strength screen: title of the sheet for adding another exercise." + }, + "activityLiveChooseExerciseBody": "เลือกท่าแรกก่อนบันทึกเซ็ต", + "@activityLiveChooseExerciseBody": { + "description": "Empty live-strength state before an exercise has been selected." + }, + "activityLiveChangeExercise": "เปลี่ยนท่าออกกำลังกาย", + "@activityLiveChangeExercise": { + "description": "Accessibility label for changing the current strength exercise." + }, + "activityExerciseCategory": "{category, select, Abs{หน้าท้อง} Arms{แขน} Back{หลัง} Calves{น่อง} Chest{หน้าอก} Legs{ขา} Shoulders{ไหล่} other{{category}}}", + "@activityExerciseCategory": { + "description": "Strength exercise category name, used as a picker filter and row detail.", + "placeholders": { + "category": { + "type": "String" + } + } + }, + "activityExerciseEquipment": "{key, select, Barbell{บาร์เบล} Bench{ม้านั่ง} Cablemachine{เครื่องเคเบิล} Dumbbell{ดัมเบล} Gymmat{เสื่อออกกำลังกาย} Inclinebench{ม้านั่งเอียง} Kettlebell{เคตเทิลเบล} nonebodyweightexercise{น้ำหนักตัว} Pullupbar{บาร์โหน} SZBar{บาร์ SZ} other{{name}}}", + "@activityExerciseEquipment": { + "description": "Strength exercise equipment name in the picker row detail. key is the English name with non-letters removed; name is the English name, shown when there is no translation.", + "placeholders": { + "key": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "activityLiveAllowLocation": "อนุญาตตำแหน่ง", + "@activityLiveAllowLocation": { + "description": "Live measured session: fix action when location permission was denied." + }, + "activityLiveBestLabel": "ดีที่สุด", + "@activityLiveBestLabel": { + "description": "Live strength screen: header over the lifter's best-ever set for this exercise." + }, + "activityLiveBodyweightExcludedNote": "น้ำหนักตัว — ไม่นับในปริมาณรวม", + "@activityLiveBodyweightExcludedNote": { + "description": "Live strength screen: note shown when the set is logged as bodyweight-only." + }, + "activityLiveBodyweightOnly": "น้ำหนักตัวเท่านั้น", + "@activityLiveBodyweightOnly": { + "description": "Live strength screen: unit label under the volume total when it is bodyweight-only." + }, + "activityLiveBpmUnit": "bpm", + "@activityLiveBpmUnit": { + "description": "Live heart-rate block: unit label next to the live beats-per-minute reading." + }, + "activityLiveBwAbbrev": "น้ำหนักตัว", + "@activityLiveBwAbbrev": { + "description": "Live strength screen: abbreviation for bodyweight, shown instead of a load in kg." + }, + "activityLiveChangeStroke": "เปลี่ยนท่าว่าย", + "@activityLiveChangeStroke": { + "description": "Live swim screen: accessibility label for the cycle-stroke button." + }, + "activityLiveDecrease": "ลด{label}", + "@activityLiveDecrease": { + "description": "Generic accessibility label for a decrease/minus control, e.g. 'Weight down'.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "activityLiveDeniedForeverBody": "แอปถูกปฏิเสธสิทธิ์ตำแหน่ง เปลี่ยนได้ในการตั้งค่าเท่านั้น", + "@activityLiveDeniedForeverBody": { + "description": "Live measured session: explanation when location is permanently denied for the app." + }, + "activityLiveDurationHeader": "ระยะเวลา", + "@activityLiveDurationHeader": { + "description": "Live measured session: section header above the elapsed-time display." + }, + "activityLiveEffortRpeHeader": "การออกแรง (RPE)", + "@activityLiveEffortRpeHeader": { + "description": "Live strength screen: header above the RPE (rate of perceived exertion) picker." + }, + "activityLiveEndSet": "จบเซ็ต", + "@activityLiveEndSet": { + "description": "Live match screen: button that closes the current set and starts a new one." + }, + "activityLiveExerciseOf": "ท่าที่ {index} จาก {total}", + "@activityLiveExerciseOf": { + "description": "Live strength screen: 'EXERCISE {index} OF {total}' progress header.", + "placeholders": { + "index": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "activityLiveFinishSessionLabel": "จบการออกกำลังกาย", + "@activityLiveFinishSessionLabel": { + "description": "Live session shell: accessibility label for the stop/finish control." + }, + "activityLiveHoldTime": "ค้าง · {time}", + "@activityLiveHoldTime": { + "description": "Live flow (yoga) screen: 'Hold · {time}' countdown under the current pose.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activityLiveIncrease": "เพิ่ม{label}", + "@activityLiveIncrease": { + "description": "Generic accessibility label for an increase/plus control, e.g. 'Weight up'.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "activityLiveIntervalSubtitle": "ออกแรง {workSec} วิ · พัก {restSec} วิ", + "@activityLiveIntervalSubtitle": { + "description": "Live interval screen: shell subtitle stating the work/rest split, e.g. '45 S WORK · 30 S REST'.", + "placeholders": { + "workSec": { + "type": "int" + }, + "restSec": { + "type": "int" + } + } + }, + "activityLiveKcalEstUnit": "kcal · ประมาณ", + "@activityLiveKcalEstUnit": { + "description": "Common stats row: unit label for the estimated-calories figure." + }, + "activityLiveKgVolumeUnit": "ปริมาณ กก.", + "@activityLiveKgVolumeUnit": { + "description": "Live strength screen: unit label under the total training volume in kg." + }, + "activityLiveLapButtonLabel": "รอบ", + "@activityLiveLapButtonLabel": { + "description": "Live swim screen: label on the big circular tap-a-lap button." + }, + "activityLiveLapsChartTitle": "รอบ", + "@activityLiveLapsChartTitle": { + "description": "Live swim screen: chart title for the per-lap time bars." + }, + "activityLiveLapsCount": "{count, plural, other{{count} รอบ}} · {stroke}", + "@activityLiveLapsCount": { + "description": "Live swim screen: 'N laps · stroke' summary line under the distance figure.", + "placeholders": { + "count": { + "type": "int" + }, + "stroke": { + "type": "String" + } + } + }, + "activityLiveLapsFootnote": "เร็วที่สุด {time} เป็นตัวหนา ความยาวแท่งคือความเร็วเทียบรอบนั้น", + "@activityLiveLapsFootnote": { + "description": "Live swim screen: footnote naming the fastest lap under the laps chart.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activityLiveLogAsBodyweight": "บันทึกเป็นน้ำหนักตัว", + "@activityLiveLogAsBodyweight": { + "description": "Live strength screen: toggle label to log the current set as bodyweight-only." + }, + "activityLiveMatchSetSubtitle": "เซ็ต {n}", + "@activityLiveMatchSetSubtitle": { + "description": "Live match screen: shell subtitle showing the set number in progress.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveMetrePoolLabel": "สระ {len} เมตร", + "@activityLiveMetrePoolLabel": { + "description": "Live swim screen: accessibility label for a pool-length choice, e.g. '25 metre pool'.", + "placeholders": { + "len": { + "type": "int" + } + } + }, + "activityLiveMinimiseLabel": "ย่อ", + "@activityLiveMinimiseLabel": { + "description": "Live session shell: accessibility label for the minimise chevron." + }, + "activityLiveNextExercise": "ท่าถัดไป", + "@activityLiveNextExercise": { + "description": "Live strength screen: accessibility label for the next-exercise arrow." + }, + "activityLiveNextLabel": "ถัดไป", + "@activityLiveNextLabel": { + "description": "Live interval screen: 'NEXT' header before the upcoming work/rest phase." + }, + "activityLiveNextPose": "ท่าถัดไป", + "@activityLiveNextPose": { + "description": "Live flow (yoga) screen: button to advance to the next pose." + }, + "activityLiveNextRest": "พัก · {time}", + "@activityLiveNextRest": { + "description": "Live interval screen: 'Rest · {time}' preview of the upcoming rest phase.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activityLiveNextWork": "ออกแรง · {time}", + "@activityLiveNextWork": { + "description": "Live interval screen: 'Work · {time}' preview of the upcoming work phase.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "activityLiveNoHrBody": "สายรัดไม่ได้เชื่อมต่อ จึงไม่มีข้อมูลเข้ามาระหว่างครั้งนี้", + "@activityLiveNoHrBody": { + "description": "Live heart-rate block: explanation shown when the band is not connected at all." + }, + "activityLiveNoHrTitle": "ไม่มีอัตราการเต้นหัวใจ", + "@activityLiveNoHrTitle": { + "description": "Live heart-rate block: title shown when the band is not connected." + }, + "activityLiveNoHrYetBody": "สายรัดเชื่อมต่อแล้วแต่ยังไม่รายงานจังหวะหัวใจ ควรสวมให้กระชับเหนือกระดูกข้อมือหนึ่งนิ้วมือ", + "@activityLiveNoHrYetBody": { + "description": "Live heart-rate block: explanation shown when the band is connected but has no beat yet." + }, + "activityLiveNoHrYetTitle": "ยังไม่มีอัตราการเต้นหัวใจ", + "@activityLiveNoHrYetTitle": { + "description": "Live heart-rate block: title shown when the band is connected but has no beat yet." + }, + "activityLiveNoneYet": "ยังไม่มี", + "@activityLiveNoneYet": { + "description": "Live strength screen: placeholder for a previous/best reference that has no data." + }, + "activityLiveNoRouteFailedBody": "โทรศัพท์แจ้งข้อผิดพลาดเมื่อขอพิกัด", + "@activityLiveNoRouteFailedBody": { + "description": "Live measured session: explanation when a GPS fix request errored out." + }, + "activityLiveNoRouteFailedTitle": "ไม่มีเส้นทาง: ระบุตำแหน่งไม่สำเร็จ", + "@activityLiveNoRouteFailedTitle": { + "description": "Live measured session: title when a GPS fix request errored out." + }, + "activityLiveNoRouteNotAllowedTitle": "ไม่มีเส้นทาง: ไม่อนุญาตตำแหน่ง", + "@activityLiveNoRouteNotAllowedTitle": { + "description": "Live measured session: title when location permission is denied (once or forever)." + }, + "activityLiveNoRouteOffBody": "ปิดบริการตำแหน่งในโทรศัพท์นี้ จึงไม่มีพิกัดเข้ามา", + "@activityLiveNoRouteOffBody": { + "description": "Live measured session: explanation when the phone's location services are off." + }, + "activityLiveNoRouteOffTitle": "ไม่มีเส้นทาง: ปิดตำแหน่งอยู่", + "@activityLiveNoRouteOffTitle": { + "description": "Live measured session: title when the phone's location services are off." + }, + "activityLiveOneLapFewer": "ลดหนึ่งรอบ", + "@activityLiveOneLapFewer": { + "description": "Live swim screen: accessibility label for the undo-last-lap button." + }, + "activityLiveOpenSettings": "เปิดการตั้งค่า", + "@activityLiveOpenSettings": { + "description": "Live measured session: fix action when location is permanently denied." + }, + "activityLiveOpponentLabel": "คู่แข่ง", + "@activityLiveOpponentLabel": { + "description": "Live match screen: label above the opponent's score." + }, + "activityLivePauseLabel": "พักชั่วคราว", + "@activityLivePauseLabel": { + "description": "Live session shell: accessibility label for the pause control." + }, + "activityLivePerLapUnit": "ต่อรอบ", + "@activityLivePerLapUnit": { + "description": "Live swim screen: unit label for the per-lap pace stat." + }, + "activityLivePointLabel": "คะแนนฝั่ง{side}", + "@activityLivePointLabel": { + "description": "Live match screen: accessibility label for tapping to add a point, e.g. 'YOU point'.", + "placeholders": { + "side": { + "type": "String" + } + } + }, + "activityLivePoolSubtitle": "สระ {len} ม. · {stroke}", + "@activityLivePoolSubtitle": { + "description": "Live swim screen: shell subtitle showing pool length and stroke.", + "placeholders": { + "len": { + "type": "int" + }, + "stroke": { + "type": "String" + } + } + }, + "activityLivePoseBridge": "ท่าสะพาน", + "@activityLivePoseBridge": { + "description": "Live flow (yoga) screen: name of the Bridge pose." + }, + "activityLivePoseChair": "ท่าเก้าอี้", + "@activityLivePoseChair": { + "description": "Live flow (yoga) screen: name of the Chair pose." + }, + "activityLivePoseChildsPose": "ท่าเด็ก", + "@activityLivePoseChildsPose": { + "description": "Live flow (yoga) screen: name of Child's pose." + }, + "activityLivePoseForwardFold": "ท่ายืนก้มตัว", + "@activityLivePoseForwardFold": { + "description": "Live flow (yoga) screen: name of the Forward fold pose." + }, + "activityLivePoseMountain": "ท่าภูเขา", + "@activityLivePoseMountain": { + "description": "Live flow (yoga) screen: name of the Mountain pose." + }, + "activityLivePoseOf": "ท่าที่ {index} จาก {total}", + "@activityLivePoseOf": { + "description": "Live flow (yoga) screen: 'POSE {index} OF {total}' progress header.", + "placeholders": { + "index": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "activityLivePosePigeon": "ท่านกพิราบ", + "@activityLivePosePigeon": { + "description": "Live flow (yoga) screen: name of the Pigeon pose." + }, + "activityLivePosePlank": "ท่าแพลงก์", + "@activityLivePosePlank": { + "description": "Live flow (yoga) screen: name of the Plank pose." + }, + "activityLivePoseSavasana": "ท่าศพ", + "@activityLivePoseSavasana": { + "description": "Live flow (yoga) screen: name of the Savasana pose." + }, + "activityLivePoseTriangle": "ท่าสามเหลี่ยม", + "@activityLivePoseTriangle": { + "description": "Live flow (yoga) screen: name of the Triangle pose." + }, + "activityLivePoseWarriorTwo": "ท่านักรบ 2", + "@activityLivePoseWarriorTwo": { + "description": "Live flow (yoga) screen: name of the Warrior II pose." + }, + "activityLivePreviousExercise": "ท่าก่อนหน้า", + "@activityLivePreviousExercise": { + "description": "Live strength screen: accessibility label for the previous-exercise arrow." + }, + "activityLivePreviousLabel": "ก่อนหน้า", + "@activityLivePreviousLabel": { + "description": "Shared label for a 'Previous' reference or navigation button." + }, + "activityLivePrivateSession": "การออกกำลังกายส่วนตัว", + "@activityLivePrivateSession": { + "description": "Live measured session: badge shown for a private session." + }, + "activityLiveRecordingRoute": "กำลังบันทึกเส้นทาง", + "@activityLiveRecordingRoute": { + "description": "Live measured session: pill shown while a GPS route is actively recording." + }, + "activityLiveRepsBodyweightRow": "{n, plural, other{{n} ครั้ง · น้ำหนักตัว}}", + "@activityLiveRepsBodyweightRow": { + "description": "Live strength screen: 'N reps · bodyweight' row in the this-exercise set list.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveRepsLabel": "จำนวนครั้ง", + "@activityLiveRepsLabel": { + "description": "Live strength screen: header above the reps stepper." + }, + "activityLiveRepsLoggedBodyweight": "{n, plural, other{บันทึกแล้ว {n} ครั้ง}}", + "@activityLiveRepsLoggedBodyweight": { + "description": "Live strength screen: 'N reps logged' shown during the rest countdown for a bodyweight set.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveRepsOnly": "{n, plural, other{{n} ครั้ง}}", + "@activityLiveRepsOnly": { + "description": "Live strength screen: 'N reps' reference figure with no load recorded.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveRepsUnit": "ครั้ง", + "@activityLiveRepsUnit": { + "description": "Live strength screen: unit label under the total reps figure." + }, + "activityLiveRestingHeader": "กำลังพัก", + "@activityLiveRestingHeader": { + "description": "Live strength screen: header shown during the rest countdown between sets." + }, + "activityLiveRestWord": "พัก", + "@activityLiveRestWord": { + "description": "The word 'Rest', used standalone for interval announcements and labels." + }, + "activityLiveResumeLabel": "ทำต่อ", + "@activityLiveResumeLabel": { + "description": "Live session shell: accessibility label for the resume control." + }, + "activityLiveRoundLabel": "รอบที่ {n}", + "@activityLiveRoundLabel": { + "description": "Live interval screen: 'ROUND N' header.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveRouteFootnoteNoDistance": "ปักจุดเริ่มแล้ว ระยะทางจะแสดงเมื่อพิกัดคงที่", + "@activityLiveRouteFootnoteNoDistance": { + "description": "Live measured session: route-chart footnote before any distance has been computed." + }, + "activityLiveRouteFootnoteWithDistance": "{distance} จากพิกัดที่บันทึกถึงตอนนี้", + "@activityLiveRouteFootnoteWithDistance": { + "description": "Live measured session: route-chart footnote naming the distance recorded so far.", + "placeholders": { + "distance": { + "type": "String" + } + } + }, + "activityLiveRouteSoFarTitle": "เส้นทางถึงตอนนี้", + "@activityLiveRouteSoFarTitle": { + "description": "Live measured session: chart title for the in-progress GPS route." + }, + "activityLiveSetNumber": "เซ็ต {n}", + "@activityLiveSetNumber": { + "description": "Shared 'Set N' label used for the current set count and past-set rows.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveSetsCountSubtitle": "{n, plural, other{{n} เซ็ต}}", + "@activityLiveSetsCountSubtitle": { + "description": "Live strength screen: shell subtitle showing the number of sets logged so far.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "activityLiveSetsListHeader": "เซ็ต", + "@activityLiveSetsListHeader": { + "description": "Live match screen: header above the list of finished sets." + }, + "activityLiveSetsUnit": "เซ็ต", + "@activityLiveSetsUnit": { + "description": "Live strength screen: unit label under the total sets figure." + }, + "activityLiveStepsUnit": "ก้าว", + "@activityLiveStepsUnit": { + "description": "Common stats row: unit label for the live step count." + }, + "activityLiveStrainUnit": "ความหนัก", + "@activityLiveStrainUnit": { + "description": "Common stats row: unit label for the live strain figure." + }, + "activityLiveStrokeBack": "กรรเชียง", + "@activityLiveStrokeBack": { + "description": "Live swim screen: name of the backstroke." + }, + "activityLiveStrokeBreast": "กบ", + "@activityLiveStrokeBreast": { + "description": "Live swim screen: name of breaststroke." + }, + "activityLiveStrokeFly": "ผีเสื้อ", + "@activityLiveStrokeFly": { + "description": "Live swim screen: name of butterfly stroke." + }, + "activityLiveStrokeFree": "ฟรีสไตล์", + "@activityLiveStrokeFree": { + "description": "Live swim screen: name of freestyle stroke." + }, + "activityLiveThisExerciseLabel": "ท่านี้", + "@activityLiveThisExerciseLabel": { + "description": "Live strength screen: header above the current exercise's logged sets." + }, + "activityLiveTimeInZonesTitle": "เวลาในแต่ละโซน", + "@activityLiveTimeInZonesTitle": { + "description": "Live heart-rate block: chart title for time spent in each heart-rate zone." + }, + "activityLiveTimeUnit": "เวลา", + "@activityLiveTimeUnit": { + "description": "Live swim screen: unit label for the elapsed-time stat." + }, + "activityLiveTryAgain": "ลองอีกครั้ง", + "@activityLiveTryAgain": { + "description": "Live measured session: fix action when a GPS fix request errored out." + }, + "activityLiveTurnOnLocation": "เปิดตำแหน่ง", + "@activityLiveTurnOnLocation": { + "description": "Live measured session: fix action when location services are off." + }, + "activityLiveVolumeSetsSubtitle": "{kg} กก. · {n, plural, other{{n} เซ็ต}}", + "@activityLiveVolumeSetsSubtitle": { + "description": "Live strength screen: shell subtitle showing training volume and set count.", + "placeholders": { + "kg": { + "type": "String" + }, + "n": { + "type": "int" + } + } + }, + "activityLiveWeightLabel": "น้ำหนัก", + "@activityLiveWeightLabel": { + "description": "Live strength screen: header above the weight stepper." + }, + "activityLiveWeightRepsLogged": "บันทึก {kg} กก. × {n} แล้ว", + "@activityLiveWeightRepsLogged": { + "description": "Live strength screen: 'kg × N logged' shown during the rest countdown for a loaded set.", + "placeholders": { + "kg": { + "type": "String" + }, + "n": { + "type": "int" + } + } + }, + "activityLiveWorkWord": "ออกแรง", + "@activityLiveWorkWord": { + "description": "The word 'Work', used standalone for interval announcements and labels." + }, + "activityLiveYouLabel": "คุณ", + "@activityLiveYouLabel": { + "description": "Live match screen: label above the user's own score." + }, + "activityLiveZoneLabel": "โซน {z}", + "@activityLiveZoneLabel": { + "description": "Live heart-rate block: pill showing the current heart-rate zone number.", + "placeholders": { + "z": { + "type": "int" + } + } + }, + "activityLiveLogSet": "บันทึกเซ็ต", + "@activityLiveLogSet": { + "description": "Live strength screen: button that banks the current set." + }, + "activityLiveRestOverAnnounce": "หมดเวลาพัก", + "@activityLiveRestOverAnnounce": { + "description": "Live strength screen: screen-reader announcement when the rest countdown ends." + }, + "activityLiveSkipRest": "ข้ามการพัก", + "@activityLiveSkipRest": { + "description": "Live strength screen: button that skips the remaining rest countdown." + }, + "gesturesNavTitle": "แตะสองครั้ง", + "@gesturesNavTitle": { + "description": "Title of the double-tap gesture settings screen" + }, + "gesturesSectionTitle": "แตะสายรัดสองครั้ง", + "@gesturesSectionTitle": { + "description": "Section heading explaining the double-tap gesture on the band" + }, + "gesturesSectionBody": "ใช้ได้ขณะแอปเชื่อมต่อเท่านั้น จะไม่ใช้การแตะที่สายรัดบันทึกไว้ตอนโทรศัพท์อยู่ห่าง เพื่อไม่ให้ทำงานช้าไปหลายชั่วโมง", + "@gesturesSectionBody": { + "description": "Body text explaining when the double-tap gesture actually works" + }, + "gesturesItDoesTitle": "การทำงาน", + "@gesturesItDoesTitle": { + "description": "Heading for the group of selectable double-tap actions" + }, + "gesturesNoPhoneActionsTitle": "ไม่มีคำสั่งสำหรับโทรศัพท์หรือไม่?", + "@gesturesNoPhoneActionsTitle": { + "description": "Heading shown when no phone-side actions are available" + }, + "gesturesNoPhoneActionsBody": "ไม่มี “ส่งเสียงโทรศัพท์” และไฟฉาย เพราะแอปติดต่อระบบเพื่อสอบถามสิทธิ์ไม่ได้ โปรดเปิดแอปใหม่แล้วกลับมา", + "@gesturesNoPhoneActionsBody": { + "description": "Body text explaining why phone-native double-tap actions are missing" + }, + "settingsBarcodeSaveFailed": "บันทึกไม่ได้ ค่านี้อาจกลับมาเมื่อเปิดแอปครั้งถัดไป", + "@settingsBarcodeSaveFailed": { + "description": "Snackbar shown when the barcode-lookup preference fails to save" + }, + "settingsIconRowTitle": "ไอคอน", + "@settingsIconRowTitle": { + "description": "Row title for the home-screen app icon picker" + }, + "settingsIconRowConfirmHint": "iPhone จะขอให้คุณยืนยัน", + "@settingsIconRowConfirmHint": { + "description": "Hint under the app icon row noting iOS confirms every icon change" + }, + "settingsIconChoiceLabel": "ไอคอน{label}", + "@settingsIconChoiceLabel": { + "description": "Accessibility label for one app-icon choice", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "settingsSelectedSuffix": " เลือกอยู่", + "@settingsSelectedSuffix": { + "description": "Accessibility suffix appended when an option is the current selection" + }, + "settingsHealthSyncOff": "ปิด ไม่มีการเขียนข้อมูลไปยัง {store}", + "@settingsHealthSyncOff": { + "description": "Health-sync subtitle when the write toggle is off", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsHealthSyncReady": "เขียนการนอน อัตราการเต้นหัวใจขณะพัก HRV อัตราการหายใจ พลังงาน และการออกกำลังกายของแต่ละวันไปยัง {store} เมื่อข้อมูลสรุปสมบูรณ์แล้ว", + "@settingsHealthSyncReady": { + "description": "Health-sync subtitle when the write is active and ready", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsHealthSyncNeedsPermission": "{store} ยังไม่อนุญาตให้เขียน แตะเพื่อเปิด", + "@settingsHealthSyncNeedsPermission": { + "description": "Health-sync subtitle when write permission is missing", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsHealthSyncNotInstalled": "ยังไม่ได้ติดตั้ง Health Connect แตะเพื่อติดตั้ง", + "@settingsHealthSyncNotInstalled": { + "description": "Health-sync subtitle when Health Connect is missing (Android)" + }, + "settingsHealthSyncNeedsUpdate": "Health Connect เก่าเกินกว่าจะเขียนข้อมูลได้ แตะเพื่ออัปเดต", + "@settingsHealthSyncNeedsUpdate": { + "description": "Health-sync subtitle when Health Connect needs an update" + }, + "settingsHealthSyncUnsupported": "อุปกรณ์นี้ไม่มีแหล่งเก็บข้อมูลสุขภาพให้เขียน", + "@settingsHealthSyncUnsupported": { + "description": "Health-sync subtitle when the device has no health store at all" + }, + "settingsHealthSyncChecking": "กำลังตรวจสอบ {store}…", + "@settingsHealthSyncChecking": { + "description": "Health-sync subtitle while the state is being determined", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsWriteToHealthStoreRowTitle": "เขียนข้อมูลไปยัง {store}", + "@settingsWriteToHealthStoreRowTitle": { + "description": "Settings row title to enable writing to the platform health store", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsHealthShareOffTitle": "ปิดการร่วมแบ่งปันข้อมูลแล้ว", + "@settingsHealthShareOffTitle": { + "description": "Dialog title after withdrawing health-data contribution consent" + }, + "settingsHealthShareOffNeverUploaded": "ไม่เคยอัปโหลดข้อมูล และจะไม่มีการอัปโหลด", + "@settingsHealthShareOffNeverUploaded": { + "description": "Dialog body when consent is withdrawn and no upload had ever happened" + }, + "settingsHealthShareOffDetail": "จะไม่อัปโหลดข้อมูลเพิ่มเติม\n\nเคยอัปโหลดสำเนาฐานข้อมูลหนึ่งชุดเมื่อ {date} เซิร์ฟเวอร์เก็บเฉพาะสำเนาล่าสุดต่ออุปกรณ์ เราพยายามแจ้งถอนความยินยอมแล้ว โดยส่งครั้งเดียวและไม่ลองซ้ำ หากโทรศัพท์ออฟไลน์ ข้อความจะยังไปไม่ถึง และเราไม่สามารถแสดงให้คุณตรวจสอบได้ว่าสำเนาถูกลบแล้ว", + "@settingsHealthShareOffDetail": { + "description": "Dialog body when consent is withdrawn and a previous upload exists, {date} is a local date/time string", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "settingsOk": "ตกลง", + "@settingsOk": { + "description": "Generic OK button on the health-contribution-off dialog" + }, + "settingsHealthShareOnTitle": "ร่วมแบ่งปันข้อมูลสุขภาพหรือไม่?", + "@settingsHealthShareOnTitle": { + "description": "Dialog title asking to grant whole-database health contribution" + }, + "settingsHealthShareOnBody": "จะอัปโหลดสำเนาฐานข้อมูลทั้งหมดที่บีบอัดแล้ววันละครั้ง ขณะใช้ Wi-Fi และชาร์จอยู่ รวมคะแนนทุกวันและข้อมูลเซ็นเซอร์ดิบทุกแถวที่สายรัดส่งมา เพื่อปรับปรุงอัลกอริทึม\n\nข้อมูลนี้ไม่ใช่ข้อมูลนิรนาม เพราะเป็นประวัติสุขภาพทั้งหมดของคุณ ปิดได้ทุกเมื่อ และจะหยุดส่งข้อมูลเพิ่มเติมตั้งแต่นั้น", + "@settingsHealthShareOnBody": { + "description": "Dialog body explaining what the whole-database health-share upload does" + }, + "settingsNo": "ไม่", + "@settingsNo": { + "description": "Decline button on the health-contribution consent dialog" + }, + "settingsContribute": "ร่วมแบ่งปัน", + "@settingsContribute": { + "description": "Accept button on the health-contribution consent dialog" + }, + "settingsResetTitle": "ลบทุกอย่างหรือไม่?", + "@settingsResetTitle": { + "description": "Confirmation dialog title for resetting all app data" + }, + "settingsResetBackupWarning": "ลบข้อมูลแอปแล้ว แต่ล้างข้อมูลสำรองไม่ครบ อาจยังเหลือไฟล์หรือสิทธิ์เข้าถึงโฟลเดอร์", + "@settingsResetBackupWarning": { + "description": "Warning after reset when backup files or folder access could not be removed" + }, + "settingsResetPairingKeyWarning": "ลบข้อมูลแอปแล้ว แต่ลบคีย์จับคู่เซ็นเซอร์จากที่เก็บปลอดภัยไม่ได้ ลอง “ลบทุกอย่าง” อีกครั้ง", + "@settingsResetPairingKeyWarning": { + "description": "Warning after reset when a sensor pairing key could not be removed from secure storage" + }, + "settingsResetBody": "จะลบข้อมูลของแอปนี้บนอุปกรณ์นี้อย่างถาวร:\n\n· ทุกวันที่วัด การนอน การออกกำลังกาย และเส้นทาง\n· ผลแล็บ มื้ออาหาร ยาที่ใช้ นิสัย การฝึกหายใจ และเซ็ตที่บันทึกทั้งหมด\n· บันทึกประจำวัน รอบเดือน และช่วงปกติที่แอปเรียนรู้\n· โปรไฟล์ การตั้งค่าทั้งหมด และคีย์ AI ที่เก็บไว้\n· วิดเจ็ตหน้าจอหลักและการเตือนตามกำหนดทั้งหมด\n\nสำเนาที่ส่งออกและข้อมูลสำรองในโฟลเดอร์เก่าหรือโฟลเดอร์ที่เข้าถึงไม่ได้อาจยังอยู่ โปรดลบแยกต่างหาก\n\nจะยกเลิกการจับคู่สายรัด และสายรัดส่งประวัติที่ส่งให้แล้วซ้ำไม่ได้ ส่งออกจาก “ข้อมูลของคุณ” ก่อนหากต้องการเก็บสำเนา", + "@settingsResetBody": { + "description": "Confirmation dialog body listing exactly what a full reset deletes" + }, + "settingsResetKeepData": "เก็บข้อมูลของฉัน", + "@settingsResetKeepData": { + "description": "Cancel button on the reset-everything confirmation dialog" + }, + "settingsResetDeleteEverything": "ลบทุกอย่าง", + "@settingsResetDeleteEverything": { + "description": "Confirm button on the reset-everything confirmation dialog" + }, + "settingsNavTitle": "การตั้งค่า", + "@settingsNavTitle": { + "description": "Title of the main settings screen" + }, + "settingsGroupTheBand": "สายรัด", + "@settingsGroupTheBand": { + "description": "Settings group heading for band-related rows" + }, + "settingsAlarmRowTitle": "นาฬิกาปลุก", + "@settingsAlarmRowTitle": { + "description": "Settings row title opening the alarm screen" + }, + "settingsAlarmRowSub": "สั่นบนข้อมือ ตามนาฬิกาของสายรัดเอง", + "@settingsAlarmRowSub": { + "description": "Settings row subtitle describing the band alarm" + }, + "settingsZoneAlertRowTitle": "เตือนโซน HR", + "@settingsZoneAlertRowTitle": { + "description": "Settings row title for the live-workout HR zone crossing haptic" + }, + "settingsZoneAlertRowSub": "สั่นเมื่ออัตราการเต้นหัวใจเข้าสู่หรือออกจากโซนเป้าหมายระหว่างออกกำลังกายสด", + "@settingsZoneAlertRowSub": { + "description": "Settings row subtitle for the HR zone alert toggle" + }, + "settingsZoneAlertTargetRowTitle": "โซนเป้าหมาย", + "@settingsZoneAlertTargetRowTitle": { + "description": "Settings row title for picking which HR zone the alert watches" + }, + "settingsZoneAlertTargetRowValue": "โซน {zone}", + "@settingsZoneAlertTargetRowValue": { + "description": "Value shown on the target-zone row, e.g. Zone 3", + "placeholders": { + "zone": { + "type": "int" + } + } + }, + "settingsGroupThisPhone": "โทรศัพท์นี้", + "@settingsGroupThisPhone": { + "description": "Settings group heading for phone-side sensing rows" + }, + "settingsStepsRowTitle": "ก้าว", + "@settingsStepsRowTitle": { + "description": "Settings row title for the phone's own step counter" + }, + "settingsStepsRowSub": "ตัวนับก้าวของโทรศัพท์ สำหรับชั่วโมงที่สายรัดไม่มีข้อมูล ไม่มีข้อมูลออกจากอุปกรณ์", + "@settingsStepsRowSub": { + "description": "Settings row subtitle explaining the phone step counter" + }, + "settingsGroupNotifications": "การแจ้งเตือน", + "@settingsGroupNotifications": { + "description": "Settings group heading for the notifications row" + }, + "settingsManageNotificationsRowTitle": "จัดการการแจ้งเตือน", + "@settingsManageNotificationsRowTitle": { + "description": "Settings row title opening the notification settings screen" + }, + "settingsManageNotificationsRowSub": "สิ่งที่อาจแจ้งเตือนคุณ ช่วงเงียบ และสวิตช์ปิดแต่ละประเภท", + "@settingsManageNotificationsRowSub": { + "description": "Settings row subtitle for the manage-notifications row" + }, + "settingsGroupPreferences": "ค่ากำหนด", + "@settingsGroupPreferences": { + "description": "Settings group heading for units/appearance/cycle-tracking" + }, + "settingsUnitsRowTitle": "หน่วย", + "@settingsUnitsRowTitle": { + "description": "Settings row title cycling the measurement unit system" + }, + "settingsAppearanceRowTitle": "รูปลักษณ์", + "@settingsAppearanceRowTitle": { + "description": "Settings row title cycling the app theme" + }, + "settingsClockFormatRowTitle": "รูปแบบเวลา", + "@settingsClockFormatRowTitle": { + "description": "Settings row title cycling the 12/24-hour clock format" + }, + "settingsClockFormatSystem": "ตามระบบ", + "@settingsClockFormatSystem": { + "description": "Clock format value: follow the operating system setting" + }, + "settingsClockFormat24h": "24 ชั่วโมง", + "@settingsClockFormat24h": { + "description": "Clock format value: 24-hour clock (e.g. 19:30)" + }, + "settingsClockFormat12h": "12 ชั่วโมง", + "@settingsClockFormat12h": { + "description": "Clock format value: 12-hour clock with AM/PM (e.g. 7:30 PM)" + }, + "settingsCycleTrackingRowTitle": "ติดตามรอบเดือน", + "@settingsCycleTrackingRowTitle": { + "description": "Settings row title toggling cycle tracking" + }, + "settingsCycleTrackingRowSub": "เพิ่มแท็บรอบเดือนในสุขภาวะ เมื่อปิดจะซ่อนแท็บและเก็บข้อมูลที่บันทึกไว้", + "@settingsCycleTrackingRowSub": { + "description": "Settings row subtitle for the cycle-tracking toggle" + }, + "settingsGroupYourData": "ข้อมูลของคุณ", + "@settingsGroupYourData": { + "description": "Settings group heading for export/backup/health-write rows" + }, + "settingsExportBackupImportRowTitle": "ส่งออก สำรองข้อมูล นำเข้า", + "@settingsExportBackupImportRowTitle": { + "description": "Settings row title opening the data screen" + }, + "settingsExportBackupImportRowSub": "สเปรดชีต สำเนาครบชุด และการนำเข้าประวัติ", + "@settingsExportBackupImportRowSub": { + "description": "Settings row subtitle for the data screen entry" + }, + "settingsGroupAutomation": "การทำงานอัตโนมัติ", + "@settingsGroupAutomation": { + "description": "Settings group heading for double-tap and Tasker/Shortcuts rows" + }, + "settingsDoubleTapRowTitle": "แตะสองครั้ง", + "@settingsDoubleTapRowTitle": { + "description": "Settings row title opening the double-tap gesture screen" + }, + "settingsDoubleTapRowSub": "การทำงานเมื่อแตะสายรัดสองครั้ง", + "@settingsDoubleTapRowSub": { + "description": "Settings row subtitle for the double-tap gesture entry" + }, + "settingsKeepAliveRowTitle": "ซิงค์ต่อในเบื้องหลัง", + "@settingsKeepAliveRowTitle": { + "description": "Android settings row title for the battery-optimization exemption" + }, + "settingsKeepAliveRowSub": "เพื่อไม่ให้การประหยัดแบตเตอรี่หยุดซิงค์ระหว่างคืน", + "@settingsKeepAliveRowSub": { + "description": "Android settings row subtitle for the battery-optimization exemption" + }, + "settingsKeepAliveAllow": "อนุญาต", + "@settingsKeepAliveAllow": { + "description": "Value shown on the background-sync row while the exemption has not been granted; tapping asks for it" + }, + "settingsAutostartRowTitle": "อนุญาตให้เริ่มอัตโนมัติ", + "@settingsAutostartRowTitle": { + "description": "Android settings row title, shown only on phone makers with a separate autostart allowlist" + }, + "settingsAutostartRowSub": "ผู้ผลิตโทรศัพท์นี้ต้องการการตั้งค่าเพิ่มเติมก่อนให้แอปซิงค์ต่อระหว่างคืนได้", + "@settingsAutostartRowSub": { + "description": "Subtitle for the autostart row; tapping opens the phone maker's own settings screen" + }, + "settingsTaskerShortcutsRowTitle": "Tasker และ Shortcuts", + "@settingsTaskerShortcutsRowTitle": { + "description": "Settings row title opening the automation screen" + }, + "settingsTaskerShortcutsRowSub": "ส่งเหตุการณ์ออกได้เฉพาะ Android ส่วน iOS สั่งให้สายรัดสั่นได้ แต่รับคำสั่งเริ่มจากสายรัดไม่ได้", + "@settingsTaskerShortcutsRowSub": { + "description": "Settings row subtitle stating the Android/iOS automation asymmetry" + }, + "settingsGroupPrivacy": "ความเป็นส่วนตัว", + "@settingsGroupPrivacy": { + "description": "Settings group heading for telemetry/barcode/health-share/update rows" + }, + "settingsCrashReportsRowTitle": "รายงานแอปขัดข้อง", + "@settingsCrashReportsRowTitle": { + "description": "Settings row title toggling crash telemetry" + }, + "settingsCrashReportsRowSub": "ไม่ส่งข้อมูลจนกว่าคุณจะอนุญาต", + "@settingsCrashReportsRowSub": { + "description": "Settings row subtitle for the crash-reports toggle" + }, + "settingsBarcodeLookupRowTitle": "ค้นหาบาร์โค้ดออนไลน์", + "@settingsBarcodeLookupRowTitle": { + "description": "Settings row title toggling online barcode lookup" + }, + "settingsBarcodeLookupRowSub": "ส่งบาร์โค้ดที่สแกนไปยัง openfoodfacts.org โดยไม่แนบข้อมูลเกี่ยวกับคุณ", + "@settingsBarcodeLookupRowSub": { + "description": "Settings row subtitle for the barcode-lookup toggle" + }, + "settingsContributeHealthDataRowTitle": "ร่วมแบ่งปันข้อมูลสุขภาพของฉัน", + "@settingsContributeHealthDataRowTitle": { + "description": "Settings row title toggling whole-database health contribution" + }, + "settingsContributeHealthDataRowSub": "อัปโหลดฐานข้อมูลทั้งหมดวันละครั้ง ขณะใช้ Wi-Fi และชาร์จอยู่ เพื่อปรับปรุงอัลกอริทึม", + "@settingsContributeHealthDataRowSub": { + "description": "Settings row subtitle for the health-data-contribution toggle" + }, + "settingsCheckForUpdatesRowTitle": "ตรวจหาอัปเดต", + "@settingsCheckForUpdatesRowTitle": { + "description": "Settings row title toggling background update checks" + }, + "settingsUpdateBelowMinimum": "รุ่นนี้ต่ำกว่ารุ่นขั้นต่ำที่รองรับ โปรดติดตั้งรุ่นใหม่จาก GitHub", + "@settingsUpdateBelowMinimum": { + "description": "Update-check subtitle when this build is below the minimum supported version" + }, + "settingsUpdateAvailable": "มีรุ่นใหม่เผยแพร่บน GitHub", + "@settingsUpdateAvailable": { + "description": "Update-check subtitle when a newer build is available" + }, + "settingsUpdateCheckSub": "สอบถามเซิร์ฟเวอร์เผยแพร่เมื่อเปิดแอป เซิร์ฟเวอร์จะเห็นที่อยู่ IP และเวลาที่คุณเปิดแอป", + "@settingsUpdateCheckSub": { + "description": "Update-check subtitle when the app is up to date" + }, + "settingsGroupAbout": "เกี่ยวกับ", + "@settingsGroupAbout": { + "description": "Settings group heading for version/notices rows" + }, + "settingsVersionRowTitle": "เวอร์ชัน", + "@settingsVersionRowTitle": { + "description": "Settings row title showing the app version" + }, + "settingsNoticesLicencesRowTitle": "ประกาศและใบอนุญาต", + "@settingsNoticesLicencesRowTitle": { + "description": "Settings row title opening open-source notices and licences" + }, + "settingsNoticesLicencesRowSub": "แอปนี้ไม่ใช่ใคร และใช้ข้อมูลของใครบ้าง", + "@settingsNoticesLicencesRowSub": { + "description": "Settings row subtitle for the notices-and-licences row" + }, + "settingsGroupDeveloper": "นักพัฒนา", + "@settingsGroupDeveloper": { + "description": "Settings group heading for the hidden developer tools" + }, + "settingsComponentGalleryRowTitle": "แกลเลอรีคอมโพเนนต์", + "@settingsComponentGalleryRowTitle": { + "description": "Developer settings row title opening the UI component gallery" + }, + "settingsComponentGalleryRowSub": "ทุกคอมโพเนนต์ ทุกขนาดข้อความ ในทั้งสองธีม", + "@settingsComponentGalleryRowSub": { + "description": "Developer settings row subtitle for the component gallery" + }, + "settingsDeveloperModeRowTitle": "โหมดนักพัฒนา", + "@settingsDeveloperModeRowTitle": { + "description": "Developer settings row title to leave developer mode" + }, + "settingsResetAllDataRowTitle": "รีเซ็ตข้อมูลทั้งหมด", + "@settingsResetAllDataRowTitle": { + "description": "Settings row title for the destructive full data reset" + }, + "settingsNotificationsNavTitle": "การแจ้งเตือน", + "@settingsNotificationsNavTitle": { + "description": "Title of the notification settings screen" + }, + "settingsNotificationsNavSub": "สิ่งที่อาจแจ้งเตือนคุณ", + "@settingsNotificationsNavSub": { + "description": "Subtitle under the notification settings screen title" + }, + "settingsNotificationsOffSystemTitle": "ปิดการแจ้งเตือนในระดับระบบอยู่", + "@settingsNotificationsOffSystemTitle": { + "description": "Status card title when OS-level notification permission is denied" + }, + "settingsNotificationsOffSystemBody": "รายการด้านล่างจะแจ้งเตือนไม่ได้จนกว่าระบบจะอนุญาต", + "@settingsNotificationsOffSystemBody": { + "description": "Status card body when OS-level notification permission is denied" + }, + "settingsTurnThemOn": "เปิดการแจ้งเตือน", + "@settingsTurnThemOn": { + "description": "Fix button turning on OS notification permission" + }, + "settingsGroupManageNotifications": "จัดการการแจ้งเตือน", + "@settingsGroupManageNotifications": { + "description": "Settings group heading listing every individual notification toggle" + }, + "settingsHealthExceptionsRowTitle": "ความผิดปกติทางสุขภาพ", + "@settingsHealthExceptionsRowTitle": { + "description": "Notification row title for the health-exception alert toggle" + }, + "settingsHealthExceptionsRowSub": "ไม่เกินวันละครั้ง และเฉพาะเมื่อค่าต่างจากปกติของคุณ", + "@settingsHealthExceptionsRowSub": { + "description": "Notification row subtitle for the health-exception alert toggle" + }, + "settingsBandAlertsRowTitle": "การเตือนจากสายรัด", + "@settingsBandAlertsRowTitle": { + "description": "Notification row title for band device alerts" + }, + "settingsBandAlertsRowSub": "แบตเตอรี่หมด อยู่บนแท่นชาร์จ หยุดส่งข้อมูล", + "@settingsBandAlertsRowSub": { + "description": "Notification row subtitle for band device alerts" + }, + "settingsAlarmLatchFailedRowTitle": "ยังไม่ยืนยันการปลุก", + "@settingsAlarmLatchFailedRowTitle": { + "description": "Notification row title for the alarm latch-failure alert" + }, + "settingsAlarmLatchFailedRowSub": "เตือนเมื่อสายรัดไม่ยืนยันการปลุกที่แอปเพิ่งตั้ง", + "@settingsAlarmLatchFailedRowSub": { + "description": "Notification row subtitle for the alarm latch-failure alert" + }, + "settingsAlarmNightCheckRowTitle": "ตรวจสอบเมื่อยังไม่ตั้งปลุก", + "@settingsAlarmNightCheckRowTitle": { + "description": "Notification row title for the 7pm no-alarm-tonight check" + }, + "settingsAlarmNightCheckRowSub": "แจ้งเตือนเวลา 19:00 น. ในคืนที่ยังไม่ได้ตั้งปลุกตื่น นอกนั้นจะเงียบ", + "@settingsAlarmNightCheckRowSub": { + "description": "Notification row subtitle for the 7pm no-alarm-tonight check" + }, + "settingsAlertMeAtRowTitle": "เตือนฉันเมื่อเหลือ", + "@settingsAlertMeAtRowTitle": { + "description": "Notification row title for the low-battery threshold" + }, + "settingsAlertMeAtRowSub": "เตือนเมื่อแบตเตอรี่สายรัดต่ำกว่าระดับนี้", + "@settingsAlertMeAtRowSub": { + "description": "Notification row subtitle for the low-battery threshold" + }, + "settingsRecoveryReadyRowTitle": "คะแนนการฟื้นตัวพร้อมแล้ว", + "@settingsRecoveryReadyRowTitle": { + "description": "Notification row title for the morning recovery-ready alert" + }, + "settingsRecoveryReadyRowSub": "แจ้งครั้งเดียวเมื่อมีคะแนนการฟื้นตัวตอนเช้า", + "@settingsRecoveryReadyRowSub": { + "description": "Notification row subtitle for the recovery-ready alert" + }, + "settingsWeeklyLookbackRowTitle": "ทบทวนรายสัปดาห์", + "@settingsWeeklyLookbackRowTitle": { + "description": "Notification row title for the weekly summary alert" + }, + "settingsWeeklyLookbackRowSub": "เย็นวันอาทิตย์ เฉพาะสัปดาห์ที่พบประเด็นจริง ส่วนใหญ่จะไม่มีการแจ้ง", + "@settingsWeeklyLookbackRowSub": { + "description": "Notification row subtitle for the weekly summary alert" + }, + "settingsDetectedWorkoutsRowTitle": "การออกกำลังกายที่ตรวจพบ", + "@settingsDetectedWorkoutsRowTitle": { + "description": "Notification row title for auto-detected workout prompts" + }, + "settingsDetectedWorkoutsRowSub": "ถามถึงการออกแรงที่สายรัดพบแต่คุณไม่ได้เริ่มบันทึก เมื่อปิดจะซ่อนคำถามและการ์ดตรวจสอบ สายรัดยังวัดตามเดิม", + "@settingsDetectedWorkoutsRowSub": { + "description": "Notification row subtitle for auto-detected workout prompts" + }, + "settingsMovementNudgeRowTitle": "เตือนให้ขยับ", + "@settingsMovementNudgeRowTitle": { + "description": "Notification row title for the sedentary-movement nudge" + }, + "settingsMovementNudgeRowSub": "หลังไม่เคลื่อนไหวสองชั่วโมง หรือนั่งโต๊ะ 90 นาที แจ้งบนโทรศัพท์และสั่นบนสายรัดเมื่อเชื่อมต่อ", + "@settingsMovementNudgeRowSub": { + "description": "Notification row subtitle for the sedentary-movement nudge" + }, + "settingsWindDownRowTitle": "เตรียมเข้านอน", + "@settingsWindDownRowTitle": { + "description": "Notification row title for the bedtime wind-down nudge" + }, + "settingsWindDownRowSub": "แจ้งก่อนเวลาเข้านอนที่เรียนรู้จากคืนของคุณประมาณ 45 นาที โดยหลีกเลี่ยงช่วงเงียบ เริ่มแสดงหลังสวมประมาณหนึ่งสัปดาห์", + "@settingsWindDownRowSub": { + "description": "Notification row subtitle for the bedtime wind-down nudge" + }, + "settingsStepGoalAlertsRowTitle": "เตือนเป้าหมายก้าว", + "@settingsStepGoalAlertsRowTitle": { + "description": "Notification row title for the step-goal achievement alert" + }, + "settingsStepGoalAlertsRowSub": "แจ้งครั้งเดียวเมื่อจำนวนก้าววันนี้ถึงเป้าหมาย", + "@settingsStepGoalAlertsRowSub": { + "description": "Notification row subtitle for the step-goal achievement alert" + }, + "settingsMedicationRemindersRowTitle": "เตือนใช้ยา", + "@settingsMedicationRemindersRowTitle": { + "description": "Notification row title for medication-dose reminders" + }, + "settingsMedicationRemindersRowSub": "แจ้งหนึ่งครั้งต่อมื้อยาตามกำหนด พร้อมสั่นบนสายรัดเมื่อเชื่อมต่อ ข้ามรายการที่ทำเครื่องหมายแล้ว", + "@settingsMedicationRemindersRowSub": { + "description": "Notification row subtitle for medication-dose reminders" + }, + "settingsDailyCheckInRowTitle": "บันทึกประจำวัน", + "@settingsDailyCheckInRowTitle": { + "description": "Notification row title for the evening journal check-in prompt" + }, + "settingsDailyCheckInRowSub": "เตือนตอนเย็นให้บันทึกอารมณ์ พลังงาน และความเครียด ข้ามเมื่อวันนี้มีคะแนนความรู้สึกแล้ว", + "@settingsDailyCheckInRowSub": { + "description": "Notification row subtitle for the evening journal check-in prompt" + }, + "settingsWaterReminderRowTitle": "เตือนดื่มน้ำ", + "@settingsWaterReminderRowTitle": { + "description": "Notification row title for the water-logging reminder" + }, + "settingsWaterReminderRowSub": "สั่นบนสายรัดและแจ้งบนโทรศัพท์ในช่วงตื่น เพื่อเตือนให้บันทึกการดื่ม ไม่มีการวัดปริมาณไม่ว่าคุณจะบันทึกหรือไม่", + "@settingsWaterReminderRowSub": { + "description": "Notification row subtitle for the water-logging reminder" + }, + "settingsRemindMeEveryRowTitle": "เตือนฉันทุก", + "@settingsRemindMeEveryRowTitle": { + "description": "Notification row title cycling the water-reminder interval" + }, + "settingsGroupTheStrap": "สายรัด", + "@settingsGroupTheStrap": { + "description": "Settings group heading for the strap-buzz-on-notification row" + }, + "settingsBuzzOnAppNotificationsRowTitle": "สั่นเมื่อแอปแจ้งเตือน", + "@settingsBuzzOnAppNotificationsRowTitle": { + "description": "Settings row title opening the band-notification relay screen" + }, + "settingsBuzzOnAppNotificationsRowSub": "เลือกแอปในโทรศัพท์ที่ทำให้สายรัดสั่น", + "@settingsBuzzOnAppNotificationsRowSub": { + "description": "Settings row subtitle for the band-notification relay screen entry" + }, + "settingsGroupQuietHours": "ช่วงเงียบ", + "@settingsGroupQuietHours": { + "description": "Settings group heading for the quiet-hours rows" + }, + "settingsQuietHoursRowTitle": "ช่วงเงียบ", + "@settingsQuietHoursRowTitle": { + "description": "Settings row title toggling quiet hours" + }, + "settingsQuietHoursRowSub": "ไม่มีการสั่นในช่วงเวลานี้", + "@settingsQuietHoursRowSub": { + "description": "Settings row subtitle for the quiet-hours toggle" + }, + "settingsQuietHoursStartsRowTitle": "เริ่ม", + "@settingsQuietHoursStartsRowTitle": { + "description": "Settings row title for the quiet-hours start time" + }, + "settingsQuietHoursEndsRowTitle": "สิ้นสุด", + "@settingsQuietHoursEndsRowTitle": { + "description": "Settings row title for the quiet-hours end time" + }, + "settingsHealthExceptionsBreakThroughRowTitle": "อนุญาตการเตือนสุขภาพในช่วงเงียบ", + "@settingsHealthExceptionsBreakThroughRowTitle": { + "description": "Settings row title toggling whether health-exception alerts bypass quiet hours" + }, + "settingsAlarmNotOnListTitle": "นาฬิกาปลุกไม่ได้อยู่ในรายการนี้", + "@settingsAlarmNotOnListTitle": { + "description": "Status card title clarifying the alarm has its own off switch" + }, + "settingsAlarmNotOnListBody": "ยกเลิกได้ที่หน้านาฬิกาปลุก", + "@settingsAlarmNotOnListBody": { + "description": "Status card body directing to the alarm screen to cancel it" + }, + "settingsImportNoPermission": "{store} ไม่อนุญาตให้เข้าถึงข้อมูลเหล่านั้น จึงไม่ได้อ่านข้อมูล", + "@settingsImportNoPermission": { + "description": "Result message when the health store denies profile-field read permission", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsImportEmptyWithBirthday": "ไม่ได้รับข้อมูล {store} ไม่มีส่วนสูง น้ำหนัก วันเกิด หรือเพศของคุณ โปรดกรอกเองที่นี่", + "@settingsImportEmptyWithBirthday": { + "description": "Result message when the health store (with birthday support) has no profile fields for the user", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsImportEmpty": "ไม่ได้รับข้อมูล {store} ไม่มีส่วนสูง น้ำหนัก หรือเพศของคุณ โปรดกรอกเองที่นี่", + "@settingsImportEmpty": { + "description": "Result message when the health store (no birthday support) has no profile fields for the user", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsImportNoChange": "อ่าน {fields} แล้ว โปรไฟล์ของคุณมีค่าเดียวกันอยู่แล้ว จึงไม่เปลี่ยนแปลง", + "@settingsImportNoChange": { + "description": "Result message when the health store returned fields that already match the stored profile", + "placeholders": { + "fields": { + "type": "String" + } + } + }, + "settingsImportUpdated": "อัปเดต {fields} จาก {store} แล้ว", + "@settingsImportUpdated": { + "description": "Result message when the health store's fields were applied to the profile", + "placeholders": { + "fields": { + "type": "String" + }, + "store": { + "type": "String" + } + } + }, + "settingsImportFailed": "ไม่สำเร็จ: {error}", + "@settingsImportFailed": { + "description": "Result message shown when the health-profile import throws", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "settingsAgeFieldLabel": "อายุ", + "@settingsAgeFieldLabel": { + "description": "Label used in the invalid-field list when the age field cannot be read" + }, + "settingsEditProfileNavTitle": "แก้ไขโปรไฟล์", + "@settingsEditProfileNavTitle": { + "description": "Title of the edit-profile screen" + }, + "settingsNameFieldLabel": "ชื่อ", + "@settingsNameFieldLabel": { + "description": "Field label for the profile name text field" + }, + "settingsSexFieldLabel": "เพศ", + "@settingsSexFieldLabel": { + "description": "Field label for the profile sex selector" + }, + "settingsSexMale": "ชาย", + "@settingsSexMale": { + "description": "Sex option: male" + }, + "settingsSexFemale": "หญิง", + "@settingsSexFemale": { + "description": "Sex option: female" + }, + "settingsSexPreferNotToSay": "ไม่ประสงค์ระบุ", + "@settingsSexPreferNotToSay": { + "description": "Sex option: prefer not to say" + }, + "settingsAgeYearsFieldLabel": "อายุ (ปี)", + "@settingsAgeYearsFieldLabel": { + "description": "Field label for the profile age text field" + }, + "settingsFourFieldsTitle": "ข้อมูลสี่อย่างนี้เปลี่ยนค่าของคุณ", + "@settingsFourFieldsTitle": { + "description": "Status card title explaining what the four profile fields affect" + }, + "settingsFourFieldsBody": "ใช้คำนวณโซนอัตราการเต้นหัวใจ แคลอรีโดยประมาณ และภาระการฝึก หากล้างข้อมูลใด จะไม่มีเฉพาะค่าที่ต้องใช้ข้อมูลนั้น", + "@settingsFourFieldsBody": { + "description": "Status card body explaining what the four profile fields affect" + }, + "settingsImportBlockAppleHealth": "ส่วนสูง น้ำหนัก วันเกิด และเพศจาก {store} อัปเดตส่วนสูงและน้ำหนักทุกครั้ง ส่วนอายุและเพศเติมเฉพาะช่องว่าง", + "@settingsImportBlockAppleHealth": { + "description": "Import-block explainer text on Apple Health (birthday-capable stores)", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsImportBlockOther": "ส่วนสูงและน้ำหนักจาก {store} โดยตรง ไม่มีวันเกิดหรือเพศให้อ่าน ไม่ว่าแอปใดก็อ่านไม่ได้ โปรดกรอกสองอย่างนั้นด้านบนเอง", + "@settingsImportBlockOther": { + "description": "Import-block explainer text on Health Connect (no birthday support)", + "placeholders": { + "store": { + "type": "String" + } + } + }, + "settingsNotSetHint": "ยังไม่ตั้งค่า", + "@settingsNotSetHint": { + "description": "Hint text shown in an empty profile field" + }, + "settingsAutomationNavTitle": "การทำงานอัตโนมัติ", + "@settingsAutomationNavTitle": { + "description": "Title of the automation settings screen" + }, + "settingsSyncFinishesSectionTitle": "เมื่อซิงค์เสร็จ", + "@settingsSyncFinishesSectionTitle": { + "description": "Section heading explaining the outbound sync-complete event" + }, + "settingsSyncFinishesAndroidBody": "แอปส่ง broadcast intent ที่แอปอัตโนมัติของคุณตอบสนองได้ กรองด้วย action ด้านล่าง ซึ่งระบุจำนวนระเบียนที่ได้รับและเวลา", + "@settingsSyncFinishesAndroidBody": { + "description": "Section body on Android explaining the sync-complete broadcast" + }, + "settingsSyncFinishesIosBody": "iOS ทำเช่นนี้ไม่ได้ ระบบอัตโนมัติของ Shortcuts เริ่มได้เฉพาะเหตุการณ์ที่ Apple กำหนด แอปเพิ่มเหตุการณ์ไม่ได้ เป็นข้อจำกัดของ iOS ไม่ใช่การตั้งค่า", + "@settingsSyncFinishesIosBody": { + "description": "Section body on iOS explaining why the sync-complete trigger cannot work" + }, + "settingsSyncFinishesExtras": "Extras: records (int), at (วินาที Unix)", + "@settingsSyncFinishesExtras": { + "description": "Technical detail line listing the broadcast intent's extras" + }, + "settingsNeverSendSectionTitle": "สิ่งที่จะไม่ส่ง", + "@settingsNeverSendSectionTitle": { + "description": "Section heading listing what the automation event never includes" + }, + "settingsNeverSendBody": "ไม่ส่งคะแนนการฟื้นตัว ความหนัก หรือการนอนบนทั้งสองระบบ เพราะค่าที่ขาดจะกลายเป็นศูนย์ ส่งเฉพาะข้อเท็จจริงการซิงค์ ไม่ส่งค่าที่วัด", + "@settingsNeverSendBody": { + "description": "Section body listing what the automation event never includes" + }, + "settingsBuzzFromShortcutSectionTitle": "สั่งให้สายรัดสั่นจากคำสั่งลัด", + "@settingsBuzzFromShortcutSectionTitle": { + "description": "Section heading explaining the inbound band-buzz endpoint" + }, + "settingsBuzzFromShortcutAndroidBody": "ส่ง wtf.openstrap.openstrap_edge.BUZZ_STRAP พร้อมโทเค็นนี้เป็น string extra ชื่อ “token” หากไม่มีการตรวจโทเค็น แอปใดในโทรศัพท์ก็สั่งให้สายรัดคุณสั่นได้", + "@settingsBuzzFromShortcutAndroidBody": { + "description": "Section body on Android explaining how to trigger the band buzz" + }, + "settingsBuzzFromShortcutIosBody": "ทิศทางนี้ใช้ได้บน iOS คำสั่งลัดที่คุณเรียกเองเข้าถึงแอปได้ แต่เริ่มทำงานเองเมื่อสายรัดซิงค์ไม่ได้", + "@settingsBuzzFromShortcutIosBody": { + "description": "Section body on iOS explaining the inbound band-buzz endpoint" + }, + "settingsNoTokenYet": "ยังไม่มีโทเค็น โปรดเปิดหน้านี้ใหม่", + "@settingsNoTokenYet": { + "description": "Body shown when the automation auth token has not loaded yet" + }, + "settingsCopied": "คัดลอกแล้ว", + "@settingsCopied": { + "description": "Button label after the automation token was copied" + }, + "settingsCopyTheToken": "คัดลอกโทเค็น", + "@settingsCopyTheToken": { + "description": "Button label to copy the automation token" + }, + "bandStatusBluetoothDeniedTitle": "ปิด Bluetooth สำหรับแอปนี้อยู่", + "@bandStatusBluetoothDeniedTitle": { + "description": "BandStatus card title: app-level Bluetooth permission denied" + }, + "bandStatusBluetoothDeniedReason": "โทรศัพท์ไม่อนุญาตให้ OpenStrap ใช้ Bluetooth จึงเชื่อมต่อไม่ได้ โปรดอนุญาต Bluetooth ให้ OpenStrap ในการตั้งค่าโทรศัพท์", + "@bandStatusBluetoothDeniedReason": { + "description": "BandStatus card body: app-level Bluetooth permission denied" + }, + "bandStatusBluetoothDeniedFix": "เปิด การตั้งค่า → OpenStrap แล้วอนุญาต Bluetooth", + "@bandStatusBluetoothDeniedFix": { + "description": "BandStatus fix action: app-level Bluetooth permission denied" + }, + "bandStatusBluetoothOffTitle": "ปิด Bluetooth อยู่", + "@bandStatusBluetoothOffTitle": { + "description": "BandStatus card title: phone Bluetooth radio is off" + }, + "bandStatusBluetoothOffReason": "ปิดวิทยุ Bluetooth ของโทรศัพท์อยู่ จึงไม่มีแอปใดติดต่อสายรัดได้ สายรัดยังบันทึกต่อ ไม่มีข้อมูลสูญหาย", + "@bandStatusBluetoothOffReason": { + "description": "BandStatus card body: phone Bluetooth radio is off" + }, + "bandStatusBluetoothOffFix": "เปิด Bluetooth", + "@bandStatusBluetoothOffFix": { + "description": "BandStatus fix action: phone Bluetooth radio is off" + }, + "bandStatusBluetoothUnsupportedTitle": "โทรศัพท์นี้ไม่มี Bluetooth Low Energy", + "@bandStatusBluetoothUnsupportedTitle": { + "description": "BandStatus card title: phone has no BLE radio" + }, + "bandStatusBluetoothUnsupportedReason": "ติดต่อสายรัดได้ผ่าน Bluetooth Low Energy เท่านั้น ยังใช้ข้อมูลที่นำเข้าได้ แต่เชื่อมต่อสดไม่ได้", + "@bandStatusBluetoothUnsupportedReason": { + "description": "BandStatus card body: phone has no BLE radio" + }, + "bandStatusReconnectPausedTitle": "พักการเชื่อมต่อใหม่แล้ว", + "@bandStatusReconnectPausedTitle": { + "description": "BandStatus card title: auto-reconnect paused after repeated bond refusals" + }, + "bandStatusReconnectPausedReason": "สายรัดปฏิเสธคีย์จับคู่ {n, plural, other{{n} ครั้ง}} ติดต่อกัน แอปจึงหยุดลองเพื่อประหยัดแบตเตอรี่ จะลองเองอีกครั้งในประมาณ 30 นาที", + "@bandStatusReconnectPausedReason": { + "description": "BandStatus card body: auto-reconnect paused, with the refusal count", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "bandStatusRepairNeededTitle": "ต้องจับคู่สายรัดใหม่", + "@bandStatusRepairNeededTitle": { + "description": "BandStatus card title: band needs re-pairing" + }, + "bandStatusRepairNeededReason": "สายรัดปฏิเสธคีย์เข้ารหัสของโทรศัพท์นี้ จึงถ่ายโอนข้อมูลไม่ได้ ข้อมูลยังปลอดภัยในสายรัด จับคู่ใหม่เพื่อดำเนินการต่อ", + "@bandStatusRepairNeededReason": { + "description": "BandStatus card body: band needs re-pairing" + }, + "bandStatusReconnectPausedFix": "หากพักอีก ให้ลืมสายรัดในการตั้งค่า Bluetooth ของโทรศัพท์ แล้วกลับมาจับคู่ใหม่ที่นี่", + "@bandStatusReconnectPausedFix": { + "description": "BandStatus fix action for the reconnect-paused state: re-pair only if the pause trips again after the automatic retry" + }, + "bandStatusRepairFix": "ลืมสายรัดในการตั้งค่า Bluetooth ของโทรศัพท์ แล้วกลับมาจับคู่ใหม่ที่นี่", + "@bandStatusRepairFix": { + "description": "BandStatus fix action: forget and re-pair the band (shared by reconnect-paused and repair-needed states)" + }, + "bandStatusSyncStuckTitle": "ถ่ายโอนข้อมูลชุดหนึ่งไม่เสร็จ", + "@bandStatusSyncStuckTitle": { + "description": "BandStatus card title: a sync batch will not finish transferring" + }, + "bandStatusSyncStuckReason": "สายรัดส่งข้อมูลชุดเดิมซ้ำเพราะไม่ได้รับการยืนยันจากแอป ไม่มีข้อมูลสูญหาย บันทึกไว้ที่นี่ทั้งหมดแล้ว", + "@bandStatusSyncStuckReason": { + "description": "BandStatus card body: a sync batch will not finish transferring" + }, + "bandStatusSyncStuckFix": "เชื่อมต่อสายรัดใหม่ หากพรุ่งนี้ยังเกิดซ้ำให้จับคู่ใหม่", + "@bandStatusSyncStuckFix": { + "description": "BandStatus fix action: a sync batch will not finish transferring" + }, + "bandStatusStrapUnresponsiveTitle": "สายรัดหยุดส่งข้อมูลที่บันทึกไว้", + "@bandStatusStrapUnresponsiveTitle": { + "description": "BandStatus card title: band holds newer data it will not hand over" + }, + "bandStatusStrapUnresponsiveReason": "สายรัดรายงานว่ามีข้อมูลใหม่กว่าชุดที่ยอมส่ง ข้อมูลเหล่านั้นยังอยู่ในสายรัดและปลอดภัย เพียงแต่ยังไม่ส่งมา", + "@bandStatusStrapUnresponsiveReason": { + "description": "BandStatus card body: band holds newer data it will not hand over" + }, + "bandStatusStrapUnresponsiveFix": "วางสายรัดบนแท่นชาร์จหนึ่งนาที แล้วเชื่อมต่อใหม่", + "@bandStatusStrapUnresponsiveFix": { + "description": "BandStatus fix action: band holds newer data it will not hand over" + }, + "bandStatusClockLostTitle": "ซิงค์เสร็จแต่ไม่มีข้อมูล", + "@bandStatusClockLostTitle": { + "description": "BandStatus card title: syncs complete with no sensor data, clock likely lost" + }, + "bandStatusClockLostReason": "ซิงค์เสร็จโดยไม่มีค่าเซ็นเซอร์ โดยทั่วไปหมายถึงนาฬิกาสายรัดไม่ตรง แอปจะตั้งใหม่ทุกครั้งที่เชื่อมต่อ", + "@bandStatusClockLostReason": { + "description": "BandStatus card body: syncs complete with no sensor data, clock likely lost" + }, + "bandStatusClockLostFix": "เชื่อมต่อสายรัดทิ้งไว้สักครู่ หากพรุ่งนี้ยังไม่มีข้อมูล ให้จับคู่ใหม่", + "@bandStatusClockLostFix": { + "description": "BandStatus fix action: syncs complete with no sensor data, clock likely lost" + }, + "bandStatusConnectedReason": "สายรัดเชื่อมต่อและกำลังส่งข้อมูลที่บันทึกไว้", + "@bandStatusConnectedReason": { + "description": "BandStatus card body: band is connected and syncing normally" + }, + "bandStatusConnectingTitle": "กำลังเชื่อมต่อ", + "@bandStatusConnectingTitle": { + "description": "BandStatus card title: link to the band is opening" + }, + "bandStatusConnectingReason": "กำลังเปิดการเชื่อมต่อกับสายรัด", + "@bandStatusConnectingReason": { + "description": "BandStatus card body: link to the band is opening" + }, + "bandStatusScanningTitle": "กำลังค้นหาสายรัด", + "@bandStatusScanningTitle": { + "description": "BandStatus card title: scanning for the band" + }, + "bandStatusScanningReason": "กำลังรอสัญญาณประกาศตัวจากสายรัด", + "@bandStatusScanningReason": { + "description": "BandStatus card body: scanning for the band" + }, + "bandStatusDisconnectedReason": "สายรัดอยู่นอกระยะ บนแท่นชาร์จ หรือเชื่อมต่อกับแอปอื่นอยู่ แต่ยังบันทึกต่อไป", + "@bandStatusDisconnectedReason": { + "description": "BandStatus card body: band is not connected" + }, + "bandStatusDisconnectedFix": "นำสายรัดมาใกล้โทรศัพท์ แล้วปิดแอปอื่นที่เชื่อมต่อกับสายรัด", + "@bandStatusDisconnectedFix": { + "description": "BandStatus fix action: band is not connected" + }, + "devicesTierBeatToBeatLabel": "ช่วงเวลาระหว่างจังหวะหัวใจ", + "@devicesTierBeatToBeatLabel": { + "description": "SourceTier label: electrical beat-to-beat sensor (chest strap)" + }, + "devicesTierBeatToBeatDetail": "ตรวจจับยอดคลื่น R ด้วยสัญญาณไฟฟ้า", + "@devicesTierBeatToBeatDetail": { + "description": "SourceTier detail: electrical beat-to-beat sensor (chest strap)" + }, + "devicesTierWristOpticalLabel": "ชีพจรจากแสงที่ข้อมือ", + "@devicesTierWristOpticalLabel": { + "description": "SourceTier label: wrist optical pulse (the band)" + }, + "devicesTierWristOpticalDetail": "ชีพจร การนอน และอุณหภูมิต่อเนื่องตลอดวัน HRV วัดจากชีพจรที่ข้อมือ ไม่ใช่สายคาดอก", + "@devicesTierWristOpticalDetail": { + "description": "SourceTier detail: wrist optical pulse (the band)" + }, + "devicesTierPhoneLabel": "ก้าวเท่านั้น", + "@devicesTierPhoneLabel": { + "description": "SourceTier label: phone motion coprocessor, steps only" + }, + "devicesTierPhoneDetail": "ชิปประมวลผลการเคลื่อนไหวของโทรศัพท์ วัดเฉพาะก้าวเท่านั้น", + "@devicesTierPhoneDetail": { + "description": "SourceTier detail: phone motion coprocessor, steps only" + }, + "deviceActionNoneLabel": "ไม่ทำอะไร", + "@deviceActionNoneLabel": { + "description": "Band double-tap action picker: label for the do-nothing option" + }, + "deviceActionNoneBlurb": "แตะสองครั้งแล้วไม่ทำอะไร", + "@deviceActionNoneBlurb": { + "description": "Band double-tap action picker: blurb for the do-nothing option" + }, + "deviceActionMediaPlayPauseLabel": "เล่น / หยุดเพลงชั่วคราว", + "@deviceActionMediaPlayPauseLabel": { + "description": "Band double-tap action picker: label for play/pause music" + }, + "deviceActionMediaPlayPauseBlurb": "สลับเล่นหรือหยุดสื่อที่กำลังเล่น", + "@deviceActionMediaPlayPauseBlurb": { + "description": "Band double-tap action picker: blurb for play/pause music" + }, + "deviceActionMediaNextLabel": "เพลงถัดไป", + "@deviceActionMediaNextLabel": { + "description": "Band double-tap action picker: label for next track" + }, + "deviceActionMediaNextBlurb": "ข้ามไปเพลงถัดไป", + "@deviceActionMediaNextBlurb": { + "description": "Band double-tap action picker: blurb for next track" + }, + "deviceActionMediaPrevLabel": "เพลงก่อนหน้า", + "@deviceActionMediaPrevLabel": { + "description": "Band double-tap action picker: label for previous track" + }, + "deviceActionMediaPrevBlurb": "กลับไปเพลงก่อนหน้า", + "@deviceActionMediaPrevBlurb": { + "description": "Band double-tap action picker: blurb for previous track" + }, + "deviceActionVolumeUpLabel": "เพิ่มเสียง", + "@deviceActionVolumeUpLabel": { + "description": "Band double-tap action picker: label for volume up" + }, + "deviceActionVolumeUpBlurb": "เพิ่มเสียงสื่อหนึ่งระดับ", + "@deviceActionVolumeUpBlurb": { + "description": "Band double-tap action picker: blurb for volume up" + }, + "deviceActionVolumeDownLabel": "ลดเสียง", + "@deviceActionVolumeDownLabel": { + "description": "Band double-tap action picker: label for volume down" + }, + "deviceActionVolumeDownBlurb": "ลดเสียงสื่อหนึ่งระดับ", + "@deviceActionVolumeDownBlurb": { + "description": "Band double-tap action picker: blurb for volume down" + }, + "deviceActionRingPhoneLabel": "ส่งเสียงโทรศัพท์ของฉัน", + "@deviceActionRingPhoneLabel": { + "description": "Band double-tap action picker: label for ring my phone" + }, + "deviceActionRingPhoneBlurb": "เล่นเสียงดังเพื่อช่วยหาโทรศัพท์", + "@deviceActionRingPhoneBlurb": { + "description": "Band double-tap action picker: blurb for ring my phone" + }, + "deviceActionTorchLabel": "ไฟฉาย", + "@deviceActionTorchLabel": { + "description": "Band double-tap action picker: label for flashlight toggle" + }, + "deviceActionTorchBlurb": "เปิดหรือปิดไฟฉายโทรศัพท์", + "@deviceActionTorchBlurb": { + "description": "Band double-tap action picker: blurb for flashlight toggle" + }, + "deviceActionMarkMomentLabel": "ทำเครื่องหมายช่วงเวลา", + "@deviceActionMarkMomentLabel": { + "description": "Band double-tap action picker: label for mark a moment" + }, + "deviceActionMarkMomentBlurb": "ติดแท็กเวลาปัจจุบันในบันทึกประจำวัน", + "@deviceActionMarkMomentBlurb": { + "description": "Band double-tap action picker: blurb for mark a moment" + }, + "deviceActionWorkoutToggleLabel": "เริ่ม / หยุดออกกำลังกาย", + "@deviceActionWorkoutToggleLabel": { + "description": "Band double-tap action picker: label for start/stop workout" + }, + "deviceActionWorkoutToggleBlurb": "เริ่มหรือจบการออกกำลังกายจากข้อมือ", + "@deviceActionWorkoutToggleBlurb": { + "description": "Band double-tap action picker: blurb for start/stop workout" + }, + "deviceActionLogWaterLabel": "บันทึกน้ำ", + "@deviceActionLogWaterLabel": { + "description": "Band double-tap action picker: label for log water" + }, + "deviceActionLogWaterBlurb": "เพิ่มน้ำหนึ่งแก้วในวันนี้ ตามปริมาณเดียวกับปุ่ม + ในหน้าโภชนาการ", + "@deviceActionLogWaterBlurb": { + "description": "Band double-tap action picker: blurb for log water" + }, + "deviceActionBroadcastToTaskerLabel": "ส่ง broadcast ไป Tasker", + "@deviceActionBroadcastToTaskerLabel": { + "description": "Band double-tap action picker: label for Tasker broadcast (Android only)" + }, + "deviceActionBroadcastToTaskerBlurb": "ส่ง broadcast intent เพื่อให้ Tasker เริ่มการทำงานอัตโนมัติ", + "@deviceActionBroadcastToTaskerBlurb": { + "description": "Band double-tap action picker: blurb for Tasker broadcast (Android only)" + }, + "profileCommunityGroup": "ชุมชน", + "@profileCommunityGroup": { + "description": "Title of the Profile section grouping the project's public community links." + }, + "profileGithubTitle": "GitHub", + "@profileGithubTitle": { + "description": "Title of the Profile row linking to the project's GitHub repo." + }, + "profileGithubSub": "กดดาวเพื่อสนับสนุน ช่วยให้โปรเจกต์เติบโต", + "@profileGithubSub": { + "description": "Subtitle of the Profile row linking to the project's GitHub repo." + }, + "profileRedditTitle": "Reddit", + "@profileRedditTitle": { + "description": "Title of the Profile row linking to the project's subreddit." + }, + "profileRedditSub": "เข้าร่วม r/OpenStrap เพื่อโพสต์ความสำเร็จ คำถาม หรือเรื่องอื่น ๆ", + "@profileRedditSub": { + "description": "Subtitle of the Profile row linking to the project's subreddit." + }, + "profileDiscordTitle": "Discord", + "@profileDiscordTitle": { + "description": "Title of the Profile row linking to the project's Discord server." + }, + "profileDiscordSub": "พูดคุยกับผู้ใช้และทีมผู้พัฒนา", + "@profileDiscordSub": { + "description": "Subtitle of the Profile row linking to the project's Discord server." + }, + "profileSponsorTitle": "สนับสนุนทุน", + "@profileSponsorTitle": { + "description": "Title of the Profile row linking to GitHub Sponsors." + }, + "profileSponsorSub": "โปรเจกต์โอเพนซอร์สที่ใช้ฟรี การสนับสนุนทุนช่วยให้เดินหน้าต่อได้", + "@profileSponsorSub": { + "description": "Subtitle of the Profile row linking to GitHub Sponsors." + }, + "nudgeDiscordTitle": "มาทักทายกัน", + "@nudgeDiscordTitle": { + "description": "Title of the Home nudge card inviting the user to join Discord." + }, + "nudgeDiscordBody": "ผู้ใช้ OpenStrap พูดคุยกันบน Discord ทั้งบั๊ก ไอเดีย และคนที่ใช้สายรัดแบบเดียวกับคุณ", + "@nudgeDiscordBody": { + "description": "Body of the Home nudge card inviting the user to join Discord." + }, + "nudgeDiscordCta": "เข้าร่วม Discord", + "@nudgeDiscordCta": { + "description": "CTA button label of the Home nudge card inviting the user to join Discord." + }, + "nudgeDonateTitle": "ชอบ OpenStrap ไหม?", + "@nudgeDonateTitle": { + "description": "Title of the Home nudge card inviting the user to sponsor the project." + }, + "nudgeDonateBody": "โปรเจกต์โอเพนซอร์สที่ใช้ฟรี ไม่มีค่าสมาชิก การสนับสนุนทุนช่วยให้ดูแลต่อได้", + "@nudgeDonateBody": { + "description": "Body of the Home nudge card inviting the user to sponsor the project." + }, + "nudgeDonateCta": "สนับสนุนโปรเจกต์", + "@nudgeDonateCta": { + "description": "CTA button label of the Home nudge card inviting the user to sponsor the project." + }, + "nudgeNotNow": "ไว้ก่อน", + "@nudgeNotNow": { + "description": "Semantic label for the button that snoozes a Home community nudge." + }, + "nudgeDontShowAgain": "ไม่แสดงอีก", + "@nudgeDontShowAgain": { + "description": "Label and semantic label for the button that permanently dismisses a Home community nudge." + }, + "signalRrIntervals": "ช่วงเวลาระหว่างจังหวะหัวใจ", + "@signalRrIntervals": { + "description": "Human name for the rrIntervals input signal." + }, + "signalHr1Hz": "อัตราการเต้นหัวใจต่อเนื่อง", + "@signalHr1Hz": { + "description": "Human name for the hr1Hz input signal." + }, + "signalHrSparse": "อัตราการเต้นหัวใจ", + "@signalHrSparse": { + "description": "Human name for the hrSparse input signal." + }, + "signalAccel1Hz": "การเคลื่อนไหว", + "@signalAccel1Hz": { + "description": "Human name for the accel1Hz input signal." + }, + "signalAccelHighRate": "การเคลื่อนไหวความถี่สูง", + "@signalAccelHighRate": { + "description": "Human name for the accelHighRate input signal." + }, + "signalPpgGreen": "PPG แสงเขียว", + "@signalPpgGreen": { + "description": "Human name for the ppgGreen input signal." + }, + "signalPpgRedIr": "PPG แสงแดง/อินฟราเรด", + "@signalPpgRedIr": { + "description": "Human name for the ppgRedIr input signal." + }, + "signalSkinTempRaw": "อุณหภูมิผิว", + "@signalSkinTempRaw": { + "description": "Human name for the skinTempRaw input signal." + }, + "signalVendorScalars": "ค่าที่อุปกรณ์คำนวณเอง", + "@signalVendorScalars": { + "description": "Human name for the vendorScalars input signal." + }, + "missingSignalRrIntervals": "ไม่มีช่วงเวลาระหว่างจังหวะหัวใจ", + "@missingSignalRrIntervals": { + "description": "Sub-label on a device that cannot serve a metric because its hardware does not report beat-to-beat intervals. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalHr1Hz": "ไม่มีอัตราการเต้นหัวใจต่อเนื่อง", + "@missingSignalHr1Hz": { + "description": "Sub-label on a device that cannot serve a metric because its hardware does not report continuous heart rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalHrSparse": "ไม่มีอัตราการเต้นหัวใจ", + "@missingSignalHrSparse": { + "description": "Sub-label on a device that cannot serve a metric because its hardware does not report heart rate at all. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalAccel1Hz": "ไม่มีมาตรวัดความเร่ง", + "@missingSignalAccel1Hz": { + "description": "Sub-label on a device that cannot serve a metric because it has no accelerometer. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalAccelHighRate": "ไม่มีมาตรวัดความเร่งความถี่สูง", + "@missingSignalAccelHighRate": { + "description": "Sub-label on a device that cannot serve a metric because its accelerometer does not report at a high sample rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalPpgGreen": "ไม่มี PPG แสงเขียว", + "@missingSignalPpgGreen": { + "description": "Sub-label on a device that cannot serve a metric because it has no green photoplethysmography (optical) sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalPpgRedIr": "ไม่มี PPG แสงแดง/อินฟราเรด", + "@missingSignalPpgRedIr": { + "description": "Sub-label on a device that cannot serve a metric because it has no red or infrared photoplethysmography (optical) sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalSkinTempRaw": "ไม่มีเซ็นเซอร์อุณหภูมิ", + "@missingSignalSkinTempRaw": { + "description": "Sub-label on a device that cannot serve a metric because it has no skin temperature sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalVendorScalars": "ไม่รายงานค่าที่คำนวณเอง", + "@missingSignalVendorScalars": { + "description": "Sub-label on a device that cannot serve a metric because it publishes no pre-computed numbers of its own (only raw sensor signals). Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalUnknown": "ให้ข้อมูลนี้ไม่ได้", + "@missingSignalUnknown": { + "description": "Fallback sub-label on a device that cannot serve a metric when no specific missing sensor can be named. Lower case: it is appended after the device name and a middle dot." + }, + "devicesSensorLimit": "{count, plural, =1{โทรศัพท์นี้จับคู่เซ็นเซอร์ร่วมกับสายรัดได้สูงสุดหนึ่งตัว ลบตัวเดิมก่อนเพิ่มตัวใหม่} other{โทรศัพท์นี้จับคู่เซ็นเซอร์ร่วมกับสายรัดได้สูงสุด {count} ตัว ลบหนึ่งตัวก่อนเพิ่มตัวใหม่}}", + "@devicesSensorLimit": { + "description": "Refusal shown when the paired-sensor cap is already reached.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "devicesOrderNotSaved": "บันทึกลำดับนั้นไม่ได้ ไม่มีการเปลี่ยนแปลง", + "@devicesOrderNotSaved": { + "description": "Shown when a signal-priority write fails." + }, + "devicesRequestNotSaved": "บันทึกคำขอนั้นไม่ได้ โปรดลองอีกครั้ง", + "@devicesRequestNotSaved": { + "description": "Shown when the add-a-band restart request could not be persisted." + }, + "ecgTitle": "ECG", + "@ecgTitle": { + "description": "WHOOP MG ECG: ECG" + }, + "ecgHeartScreener": "Heart Screener", + "@ecgHeartScreener": { + "description": "WHOOP MG ECG: Heart Screener" + }, + "ecgEntryMeta": "WHOOP MG · สายรัดรายงาน", + "@ecgEntryMeta": { + "description": "WHOOP MG ECG: WHOOP MG · band-reported" + }, + "ecgOpen": "เปิด", + "@ecgOpen": { + "description": "WHOOP MG ECG: Open" + }, + "ecgTakeEcg": "วัด ECG", + "@ecgTakeEcg": { + "description": "WHOOP MG ECG: Take ECG" + }, + "ecgNeedsMg": "ต้องเชื่อมต่อ WHOOP MG จึงจะวัด ECG ได้", + "@ecgNeedsMg": { + "description": "WHOOP MG ECG: Take ECG needs a connected WHOOP MG." + }, + "ecgHistoryEmpty": "ยังไม่มีค่าที่วัด", + "@ecgHistoryEmpty": { + "description": "WHOOP MG ECG: No readings yet." + }, + "ecgHistoryEmptyWhy": "ค่าที่คุณวัดจะเก็บที่นี่และยังอ่านได้แม้สายรัดไม่อยู่ใกล้", + "@ecgHistoryEmptyWhy": { + "description": "WHOOP MG ECG: Readings you take are saved here and stay readable while the band is away." + }, + "ecgWristPrompt": "สวมสายรัดที่ข้อมือข้างใด?", + "@ecgWristPrompt": { + "description": "WHOOP MG ECG: Which wrist is the band on?" + }, + "ecgWristLeft": "ข้อมือซ้าย", + "@ecgWristLeft": { + "description": "WHOOP MG ECG: Left wrist" + }, + "ecgWristRight": "ข้อมือขวา", + "@ecgWristRight": { + "description": "WHOOP MG ECG: Right wrist" + }, + "ecgInstruction": "วางแขนพัก ใช้นิ้วโป้งและนิ้วชี้อีกมือแตะโลหะทั้งสองด้าน แล้วอยู่นิ่ง", + "@ecgInstruction": { + "description": "WHOOP MG ECG: Rest your arm. Touch both metal sides with your opposite thumb and index finger. Keep still." + }, + "ecgIllustration": "ภาพประกอบ: สายรัดบนข้อมือ โดยนิ้วโป้งและนิ้วชี้อีกมือแตะโลหะทั้งสองด้าน", + "@ecgIllustration": { + "description": "WHOOP MG ECG: Illustration: the band on your wrist, and the thumb and index finger of your other hand touching its two metal sides." + }, + "ecgContactLost": "ปรับนิ้วแล้วอยู่นิ่ง", + "@ecgContactLost": { + "description": "WHOOP MG ECG: Adjust your fingers and keep still" + }, + "ecgPreparing": "กำลังเตรียมสายรัด…", + "@ecgPreparing": { + "description": "WHOOP MG ECG: Preparing the band…" + }, + "ecgRecovering": "กำลังหยุดการวัดครั้งก่อน…", + "@ecgRecovering": { + "description": "WHOOP MG ECG: Stopping a previous reading first…" + }, + "ecgWaiting": "รอการสัมผัส", + "@ecgWaiting": { + "description": "WHOOP MG ECG: Waiting for contact" + }, + "ecgMeasuring": "กำลังวัด", + "@ecgMeasuring": { + "description": "WHOOP MG ECG: Measuring" + }, + "ecgRestarting": "กำลังเริ่มใหม่…", + "@ecgRestarting": { + "description": "WHOOP MG ECG: Restarting…" + }, + "ecgSaving": "กำลังบันทึก…", + "@ecgSaving": { + "description": "WHOOP MG ECG: Saving…" + }, + "ecgCleaningUp": "กำลังหยุดสายรัด…", + "@ecgCleaningUp": { + "description": "WHOOP MG ECG: Stopping the band…" + }, + "ecgCompleted": "บันทึกค่าที่วัดแล้ว", + "@ecgCompleted": { + "description": "WHOOP MG ECG: Reading saved" + }, + "ecgUnreadableTitle": "สายรัดอ่านค่านี้ไม่ได้", + "@ecgUnreadableTitle": { + "description": "WHOOP MG ECG: The band could not read this" + }, + "ecgInconclusiveTitle": "สรุปผลไม่ได้", + "@ecgInconclusiveTitle": { + "description": "WHOOP MG ECG: Inconclusive" + }, + "ecgInconclusiveRetryHint": "สายรัดสรุปผลไม่ได้ คุณลองได้อีกครั้ง", + "@ecgInconclusiveRetryHint": { + "description": "WHOOP MG ECG: The band could not decide. You can try once more." + }, + "ecgTryOnceMore": "ลองอีกครั้ง", + "@ecgTryOnceMore": { + "description": "WHOOP MG ECG: Try once more" + }, + "ecgTakeAnother": "วัดอีกครั้ง", + "@ecgTakeAnother": { + "description": "WHOOP MG ECG: Take another" + }, + "ecgDone": "เสร็จสิ้น", + "@ecgDone": { + "description": "WHOOP MG ECG: Done" + }, + "ecgViewReading": "ดูค่าที่วัด", + "@ecgViewReading": { + "description": "WHOOP MG ECG: View reading" + }, + "ecgCancelledTitle": "ยกเลิกการวัดแล้ว", + "@ecgCancelledTitle": { + "description": "WHOOP MG ECG: Reading cancelled" + }, + "ecgFailedTitle": "วัดไม่สำเร็จ", + "@ecgFailedTitle": { + "description": "WHOOP MG ECG: Reading failed" + }, + "ecgFailedDisconnected": "สายรัดตัดการเชื่อมต่อ", + "@ecgFailedDisconnected": { + "description": "WHOOP MG ECG: The band disconnected." + }, + "ecgFailedTimeout": "ไม่มีผลภายในสองนาที", + "@ecgFailedTimeout": { + "description": "WHOOP MG ECG: No result within two minutes." + }, + "ecgFailedGeneric": "สายรัดไม่ยอมรับการวัด ({reason})", + "@ecgFailedGeneric": { + "description": "WHOOP MG ECG: The band did not accept the reading ({reason}).", + "placeholders": { + "reason": { + "type": "String" + } + } + }, + "ecgBusy": "จบกิจกรรมสดอื่นก่อน", + "@ecgBusy": { + "description": "WHOOP MG ECG: Finish the other live session first." + }, + "ecgIncompatible": "สายรัดนี้ไม่ใช่ WHOOP MG", + "@ecgIncompatible": { + "description": "WHOOP MG ECG: This band is not a WHOOP MG." + }, + "ecgDisconnected": "เชื่อมต่อ WHOOP MG ของคุณก่อน", + "@ecgDisconnected": { + "description": "WHOOP MG ECG: Connect your WHOOP MG first." + }, + "ecgCleanupIncomplete": "สายรัดอาจยังสร้างสัญญาณอยู่ จะสั่งหยุดเมื่อเชื่อมต่อครั้งถัดไป", + "@ecgCleanupIncomplete": { + "description": "WHOOP MG ECG: The band may still be generating. It will be stopped on the next connection." + }, + "ecgLivePreview": "ตัวอย่างสัญญาณสด", + "@ecgLivePreview": { + "description": "WHOOP MG ECG: Live signal preview" + }, + "ecgBandReported": "ผลที่สายรัดรายงาน", + "@ecgBandReported": { + "description": "WHOOP MG ECG: Band-reported result" + }, + "ecgNotDiagnosis": "ประเภทผลมาจากสายรัด ไม่ใช่การวินิจฉัย", + "@ecgNotDiagnosis": { + "description": "WHOOP MG ECG: The category comes from the band. This is not a diagnosis." + }, + "ecgCategorySinus": "จังหวะไซนัส", + "@ecgCategorySinus": { + "description": "WHOOP MG ECG: Sinus rhythm" + }, + "ecgCategoryLowHr": "อัตราการเต้นหัวใจต่ำ", + "@ecgCategoryLowHr": { + "description": "WHOOP MG ECG: Low heart rate" + }, + "ecgCategoryPossibleAfib": "อาจมี AFib", + "@ecgCategoryPossibleAfib": { + "description": "WHOOP MG ECG: Possible AFib" + }, + "ecgCategoryAfibHighHr": "AFib ร่วมกับอัตราการเต้นหัวใจสูง", + "@ecgCategoryAfibHighHr": { + "description": "WHOOP MG ECG: AFib with high heart rate" + }, + "ecgCategoryHighHr": "อัตราการเต้นหัวใจสูง", + "@ecgCategoryHighHr": { + "description": "WHOOP MG ECG: High heart rate" + }, + "ecgCategoryHighHrNoAfib": "อัตราการเต้นหัวใจสูง ไม่ตรวจพบ AFib", + "@ecgCategoryHighHrNoAfib": { + "description": "WHOOP MG ECG: High heart rate, no AFib detected" + }, + "ecgCategoryInconclusive": "สรุปผลไม่ได้", + "@ecgCategoryInconclusive": { + "description": "WHOOP MG ECG: Inconclusive" + }, + "ecgCategoryUnreadable": "อ่านไม่ได้", + "@ecgCategoryUnreadable": { + "description": "WHOOP MG ECG: Unreadable" + }, + "ecgReasonLowAmplitude": "แอมพลิจูดต่ำ", + "@ecgReasonLowAmplitude": { + "description": "WHOOP MG ECG: Low amplitude" + }, + "ecgReasonNoise": "สัญญาณรบกวนมาก", + "@ecgReasonNoise": { + "description": "WHOOP MG ECG: Significant noise" + }, + "ecgReasonUnstable": "สัญญาณไม่คงที่", + "@ecgReasonUnstable": { + "description": "WHOOP MG ECG: Unstable signal" + }, + "ecgReasonNotEnoughData": "ข้อมูลไม่เพียงพอ", + "@ecgReasonNotEnoughData": { + "description": "WHOOP MG ECG: Not enough data" + }, + "ecgAnalyzeNow": "วิเคราะห์ตอนนี้", + "@ecgAnalyzeNow": { + "description": "WHOOP MG ECG: Analyze now" + }, + "ecgAnalyzeCloudTitle": "ส่งค่าที่วัดนี้ไปยังโมเดลของคุณหรือไม่?", + "@ecgAnalyzeCloudTitle": { + "description": "WHOOP MG ECG: Send this reading to your model?" + }, + "ecgAnalyzeCloudBody": "จะส่งสรุปและรูปคลื่นทั้งหมดที่สายรัดบันทึก (100 ตัวอย่างต่อวินาที) ไปยัง {host} โดยใช้ {model} ไม่ส่งเฟรมดิบหรือหมายเลขประจำสายรัด", + "@ecgAnalyzeCloudBody": { + "description": "WHOOP MG ECG: The reading summary and a bounded waveform envelope will be sent to {host} as {model}. No raw frames, no band serial.", + "placeholders": { + "host": { + "type": "String" + }, + "model": { + "type": "String" + } + } + }, + "ecgContinue": "ดำเนินการต่อ", + "@ecgContinue": { + "description": "WHOOP MG ECG: Continue" + }, + "ecgCancel": "ยกเลิก", + "@ecgCancel": { + "description": "WHOOP MG ECG: Cancel" + }, + "ecgDelete": "ลบค่าที่วัด", + "@ecgDelete": { + "description": "WHOOP MG ECG: Delete reading" + }, + "ecgAvgHr": "อัตราการเต้นหัวใจเฉลี่ย", + "@ecgAvgHr": { + "description": "WHOOP MG ECG: Average heart rate" + }, + "ecgQuality": "คุณภาพสัญญาณ", + "@ecgQuality": { + "description": "WHOOP MG ECG: Signal quality" + }, + "ecgInterruptions": "การขาดช่วง", + "@ecgInterruptions": { + "description": "WHOOP MG ECG: Interruptions" + }, + "ecgDuration": "ระยะเวลา", + "@ecgDuration": { + "description": "WHOOP MG ECG: Duration" + }, + "ecgMissingSegments": "ส่วนที่ขาดหาย", + "@ecgMissingSegments": { + "description": "WHOOP MG ECG: Missing segments" + }, + "ecgWristLabel": "ข้อมือ", + "@ecgWristLabel": { + "description": "WHOOP MG ECG: Wrist" + }, + "ecgZoomIn": "ขยาย", + "@ecgZoomIn": { + "description": "WHOOP MG ECG: Zoom in" + }, + "ecgZoomOut": "ย่อ", + "@ecgZoomOut": { + "description": "WHOOP MG ECG: Zoom out" + }, + "ecgClose": "ปิด ECG", + "@ecgClose": { + "description": "WHOOP MG ECG: Close ECG" + }, + "ecgProgress": "เสร็จแล้ว {pct}%", + "@ecgProgress": { + "description": "WHOOP MG ECG: {pct}% complete", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "ecgWaveformEmpty": "ไม่ได้เก็บรูปคลื่นไว้กับค่าที่วัดนี้", + "@ecgWaveformEmpty": { + "description": "WHOOP MG ECG: No waveform was saved with this reading." + }, + "ecgWaveformLabel": "รูปคลื่นที่ยอมรับ หน่วยไมโครโวลต์ตามที่สายรัดส่งมา ช่องว่างคือวินาทีที่ขาดหาย", + "@ecgWaveformLabel": { + "description": "WHOOP MG ECG: Accepted waveform, microvolts as the band sent them. Gaps are missing seconds." + }, + "ecgSampleNote": "{count} ตัวอย่างที่ {rate} Hz กรองแล้ว เป็น µV อ้างอิงขาเข้า ไม่ระบุลีดหรือขั้วสัญญาณ", + "@ecgSampleNote": { + "description": "WHOOP MG ECG: {count} samples at {rate} Hz, filtered, input-referred µV. No lead or polarity is claimed.", + "placeholders": { + "count": { + "type": "int" + }, + "rate": { + "type": "int" + } + } + }, + "activityReviewTitle": "กิจกรรมที่ตรวจพบ", + "activityPossibleNap": "อาจเป็นการงีบ", + "activityPossibleWorkout": "อาจเป็นการออกกำลังกาย", + "activityConfirm": "ยืนยัน", + "activityEdit": "แก้ไข", + "activityDiscard": "ไม่เก็บ", + "activityChangeSport": "เปลี่ยนกีฬา", + "@activityChangeSport": { + "description": "Action on a detected workout: open the editor to pick the right sport (and times)." + }, + "activityNotAWorkout": "ไม่ใช่การออกกำลังกาย", + "@activityNotAWorkout": { + "description": "One-tap correction on a detected workout: it was not a workout. Kept across re-analysis." + }, + "activitySaveConfirm": "บันทึกและยืนยัน", + "activityNothing": "ไม่มีรายการให้ตรวจสอบ", + "activityEmptyBody": "การงีบและการออกกำลังกายที่อาจตรวจพบจะปรากฏที่นี่", + "activityLoadFailed": "โหลดกิจกรรมไม่ได้ ลองอีกครั้ง", + "activityReviewProblem": "ดำเนินการไม่เสร็จ", + "activityReview": "ตรวจสอบ", + "activityLoading": "กำลังโหลด…", + "activityPending": "รอตรวจสอบ {count} รายการ", + "@activityPending": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "activityLengthMinutes": "{minutes} นาที", + "@activityLengthMinutes": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "activityStart": "เริ่ม", + "activityEnd": "จบ", + "activityCheckTimes": "ตรวจสอบเวลา", + "activityNapWindow": "เลือกช่วงเวลาที่ผ่านมา ความยาว 5 นาทีถึง 6 ชั่วโมง", + "activityEditNap": "แก้ไขการงีบ", + "activityEditWorkout": "แก้ไขการออกกำลังกาย", + "activityNapAlerts": "การงีบที่ตรวจพบ", + "activityPushHint": "เฉพาะการแจ้งเตือน รายการแนะนำยังอยู่ในกิจกรรมที่ตรวจพบ", + "devicesWornOn": "ตำแหน่งที่สวม", + "@devicesWornOn": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornOnSub": "ตำแหน่งสายรัด ใช้ปรับเทียบก้าว", + "@devicesWornOnSub": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornWrist": "ข้อมือ", + "@devicesWornWrist": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornBicep": "ต้นแขน", + "@devicesWornBicep": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornOther": "ตำแหน่งอื่น", + "@devicesWornOther": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornSheetTitle": "คุณสวมที่ไหน?", + "@devicesWornSheetTitle": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornWristSub": "ค่าเริ่มต้น ให้ความแม่นยำในการนับก้าวดีที่สุดเท่าที่สายรัดทำได้", + "@devicesWornWristSub": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornBicepSub": "นับก้าวน้อยกว่าจริง เพราะต้นแขนแกว่งน้อยกว่าข้อมือ", + "@devicesWornBicepSub": { + "description": "Step calibration wearing-location setting" + }, + "devicesWornUnknown": "ไม่ทราบ", + "@devicesWornUnknown": { + "description": "Device detail: the stored wearing code is not one this build knows" + }, + "devicesWornOtherSub": "ในกระเป๋าเสื้อ กางเกง หรือกระเป๋าถือ สายรัดอ่านรูปแบบการเดินได้ไม่ดีในตำแหน่งเหล่านี้", + "@devicesWornOtherSub": { + "description": "Step calibration wearing-location setting" + }, + "tabHome": "หน้าหลัก", + "tabHealth": "สุขภาพ", + "tabNutrition": "โภชนาการ", + "tabWorkout": "ออกกำลังกาย", + "tabWellness": "สุขภาวะ", + "@tabHome": { + "description": "Bottom tab bar labels (tabHome..tabWellness). Keep short; the five must read as different words." + }, + "activityCatalogueName": "{key, select, other{{name}}}", + "@activityCatalogueName": { + "description": "Display name only. Never persist translated activity or group names.", + "placeholders": { + "key": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "supplementSmartWindowMinutes": "{m} นาทีก่อนเวลาตื่น", + "@supplementSmartWindowMinutes": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "m": { + "type": "int" + } + } + }, + "supplementGoalValue": "เป้าหมาย {target}", + "@supplementGoalValue": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "supplementOfCountUnit": "จาก {n} {unit}", + "@supplementOfCountUnit": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "int" + }, + "unit": { + "type": "String" + } + } + }, + "supplementZoneStartsAt": "Z{n} · {name} เริ่มที่", + "@supplementZoneStartsAt": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "int" + }, + "name": { + "type": "String" + } + } + }, + "supplementClimbedExport": "ความสูงเพิ่ม +{m} ม.", + "@supplementClimbedExport": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "m": { + "type": "String" + } + } + }, + "supplementClimbedExportFeet": "ความสูงเพิ่ม +{ft} ฟุต", + "@supplementClimbedExportFeet": { + "description": "Share poster caption: elevation gained, in feet for imperial units", + "placeholders": { + "ft": { + "type": "String" + } + } + }, + "supplementLapsExport": "{n} รอบ", + "@supplementLapsExport": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "String" + } + } + }, + "supplementReasonCount": "{reason} มี {have} และต้องการ {need}", + "@supplementReasonCount": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "reason": { + "type": "String" + }, + "have": { + "type": "String" + }, + "need": { + "type": "String" + } + } + }, + "supplementNeedNights": "ต้องการอีก {n} คืน", + "@supplementNeedNights": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "supplementNeedDays": "สวมอีก {n} วันเพื่อปลดล็อก", + "@supplementNeedDays": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "supplementCountOf": "{have} จาก {need} {unit}", + "@supplementCountOf": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "have": { + "type": "String" + }, + "need": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "supplementOutOf": "จาก {value}", + "@supplementOutOf": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "value": { + "type": "String" + } + } + }, + "supplementMinutesValue": "{m} นาที", + "@supplementMinutesValue": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "m": { + "type": "String" + } + } + }, + "supplementHoursMinutesValue": "{h} ชม. {m} นาที", + "@supplementHoursMinutesValue": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "h": { + "type": "String" + }, + "m": { + "type": "String" + } + } + }, + "exerciseCatalogueName": "{key, select, other{{name}}}", + "@exerciseCatalogueName": { + "description": "Display only. Original exercise keys, labels, credits and licences are unchanged.", + "placeholders": { + "key": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "supplementUnreadableFields": "{fields} ไม่ใช่ตัวเลข ยังไม่ได้บันทึก", + "@supplementUnreadableFields": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "fields": { + "type": "String" + } + } + }, + "supplementGoalSemantic": "{label} ปัจจุบัน {current} จากเป้าหมาย {target} {rate}", + "@supplementGoalSemantic": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "label": { + "type": "String" + }, + "current": { + "type": "String" + }, + "target": { + "type": "String" + }, + "rate": { + "type": "String" + } + } + }, + "supplementObservationSemantic": "ข้อสังเกตสุขภาพ {headline} {detail} {advice}", + "@supplementObservationSemantic": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "headline": { + "type": "String" + }, + "detail": { + "type": "String" + }, + "advice": { + "type": "String" + } + } + }, + "supplementUnavailable": "{label} ไม่มีข้อมูล", + "@supplementUnavailable": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "supplementChartLatest": "ล่าสุด {value}", + "@supplementChartLatest": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "value": { + "type": "String" + } + } + }, + "supplementChartRange": "อยู่ระหว่าง {lo} ถึง {hi}", + "@supplementChartRange": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "lo": { + "type": "String" + }, + "hi": { + "type": "String" + } + } + }, + "supplementChartSteady": "ค่อนข้างคงที่ตลอด {n} ค่าที่วัด", + "@supplementChartSteady": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "supplementChartChange": "{direction} {value} ตลอด {n} ค่าที่วัด", + "@supplementChartChange": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "direction": { + "type": "String" + }, + "value": { + "type": "String" + }, + "n": { + "type": "int" + } + } + }, + "supplementMeasuredIn": "วัดเป็น {unit}", + "@supplementMeasuredIn": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "unit": { + "type": "String" + } + } + }, + "supplementChartFromTo": "ตั้งแต่ {start} ถึง {end}", + "@supplementChartFromTo": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "start": { + "type": "String" + }, + "end": { + "type": "String" + } + } + }, + "supplementChartLegend": "คำอธิบาย: {labels}", + "@supplementChartLegend": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "labels": { + "type": "String" + } + } + }, + "supplementBandOffSpan": "คุณถอดสายรัดจากข้อมือช่วง {start} – {end}", + "@supplementBandOffSpan": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "start": { + "type": "String" + }, + "end": { + "type": "String" + } + } + }, + "supplementNavBack": "ย้อนกลับ", + "@supplementNavBack": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementHoursValue": "{h} ชม.", + "@supplementHoursValue": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "h": { + "type": "String" + } + } + }, + "supplementSweepAbove": "สูงกว่าช่วงปกติของคุณ", + "@supplementSweepAbove": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementSweepBelow": "ต่ำกว่าช่วงปกติของคุณ", + "@supplementSweepBelow": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementSweepHighest": "สูงสุดใน {count} วัน", + "@supplementSweepHighest": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "count": { + "type": "String" + } + } + }, + "supplementSweepLowest": "ต่ำสุดใน {count} วัน", + "@supplementSweepLowest": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "count": { + "type": "String" + } + } + }, + "supplementSweepFinding": "{value} — {direction} (ปกติ {range})", + "@supplementSweepFinding": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "value": { + "type": "String" + }, + "direction": { + "type": "String" + }, + "range": { + "type": "String" + } + } + }, + "supplementSweepPair": "{first} และ {second} ต่างอยู่นอกช่วงปกติในวันเดียวกัน ควรสังเกต แต่ไม่ได้เป็นการวัดความสัมพันธ์ระหว่างสองค่านี้", + "@supplementSweepPair": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "first": { + "type": "String" + }, + "second": { + "type": "String" + } + } + }, + "supplementProteinShort": "โปรตีน", + "@supplementProteinShort": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementCarbsShort": "คาร์บ", + "@supplementCarbsShort": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementFatShort": "ไขมัน", + "@supplementFatShort": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": {} + }, + "supplementCoachJournal": "เพิ่มบันทึกประจำวันสำหรับ {date}: แท็ก {tags} ข้อความ “{note}”", + "@supplementCoachJournal": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "date": { + "type": "String" + }, + "tags": { + "type": "String" + }, + "note": { + "type": "String" + } + } + }, + "supplementCoachPeriod": "บันทึกเริ่มมีประจำเดือนวันที่ {date}", + "@supplementCoachPeriod": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "supplementCoachStart": "เริ่ม{type}ตอนนี้", + "@supplementCoachStart": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "supplementCoachFood": "เพิ่ม “{name}” ใน{meal}วันที่ {date}", + "@supplementCoachFood": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "name": { + "type": "String" + }, + "meal": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "supplementCoachFoodEnergy": "เพิ่ม “{name}” ใน{meal}วันที่ {date} ({kcal} kcal)", + "@supplementCoachFoodEnergy": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "name": { + "type": "String" + }, + "meal": { + "type": "String" + }, + "date": { + "type": "String" + }, + "kcal": { + "type": "String" + } + } + }, + "supplementCoachFields": "บันทึก {fields} สำหรับ {date}", + "@supplementCoachFields": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "fields": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "supplementCoachCompleted": "บันทึก{type} {minutes} นาที เริ่ม {time} วันที่ {date}", + "@supplementCoachCompleted": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "minutes": { + "type": "String" + }, + "type": { + "type": "String" + }, + "time": { + "type": "String" + }, + "date": { + "type": "String" + } + } + }, + "supplementCoachMedication": "กำหนดใช้ {name} เวลา {time} {days} แอปนี้ไม่ตรวจปฏิกิริยาระหว่างยา", + "@supplementCoachMedication": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "name": { + "type": "String" + }, + "time": { + "type": "String" + }, + "days": { + "type": "String" + } + } + }, + "supplementCoachDose": "บันทึก {name} วันที่ {date} ว่า{state}", + "@supplementCoachDose": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "name": { + "type": "String" + }, + "date": { + "type": "String" + }, + "state": { + "type": "String" + } + } + }, + "supplementCoachStepGoal": "ตั้งเป้าหมายก้าวต่อวันเป็น {goal}", + "@supplementCoachStepGoal": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "goal": { + "type": "String" + } + } + }, + "supplementCoachProviderError": "ผู้ให้บริการแจ้งข้อผิดพลาด ({code}): {detail}", + "@supplementCoachProviderError": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "code": { + "type": "String" + }, + "detail": { + "type": "String" + } + } + }, + "supplementCoachModelsError": "ขอรายการโมเดลไม่สำเร็จ ({code}): {detail}", + "@supplementCoachModelsError": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "code": { + "type": "String" + }, + "detail": { + "type": "String" + } + } + }, + "supplementCoachOversize": "คำถามนี้ดึงข้อมูลมากเกินไป ({size} KB จำกัด {limit} KB) จึงไม่ได้ส่งข้อมูล ลองช่วงเวลาสั้นลงหรือเริ่มแชตใหม่", + "@supplementCoachOversize": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "size": { + "type": "String" + }, + "limit": { + "type": "String" + } + } + }, + "supplementCoachRendering": "กำลังแสดง {kind}…", + "@supplementCoachRendering": { + "description": "Presentation-only text; interpolated values remain unchanged.", + "placeholders": { + "kind": { + "type": "String" + } + } + }, + "supplementADeviationNotATemperaturefc109f": "เป็นค่าความเบี่ยงเบน ไม่ใช่อุณหภูมิ คืนที่นำเข้าใช้หน่วยต่างกัน จึงไม่แสดงรวมในกราฟเดียวกัน", + "@supplementADeviationNotATemperaturefc109f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementADoseIsDue1543e3": "ถึงเวลาใช้ยาแล้ว", + "@supplementADoseIsDue1543e3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementALocalModelCanTake62d4a8": "โมเดลในเครื่องอาจโหลดนานก่อนตอบครั้งแรก ค่าเริ่มต้นคือ 5 นาที (300 วินาที) ผู้ให้บริการคลาวด์ใช้ 2 นาทีเสมอ", + "@supplementALocalModelCanTake62d4a8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementALowConfidenceOverlayA9fbabe": "ชั้นข้อมูลที่มีความเชื่อมั่นต่ำ เซ็นเซอร์ข้อมือตรวจคลื่นสมองช้าไม่ได้ การหลับลึกที่นี่จึงหมายถึงความราบของอัตราการเต้นหัวใจใน NREM", + "@supplementALowConfidenceOverlayA9fbabe": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAMinuteOfNotesTonightac2cf6": "จดบันทึกสักนาทีคืนนี้ ช่วยให้ OpenStrap เรียนรู้สิ่งที่สัมพันธ์กับการฟื้นตัวของคุณจริง ๆ", + "@supplementAMinuteOfNotesTonightac2cf6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAPossibleNapIsReady84b3cf": "มีช่วงที่อาจเป็นการงีบให้ตรวจสอบ", + "@supplementAPossibleNapIsReady84b3cf": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAPossibleWorkoutIsReady2861bb": "มีช่วงที่อาจเป็นการออกกำลังกายให้ตรวจสอบ", + "@supplementAPossibleWorkoutIsReady2861bb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAStepGoalOf500f44746": "เป้าหมายก้าวต้องอยู่ระหว่าง 500–100,000 ยังไม่ได้บันทึก", + "@supplementAStepGoalOf500f44746": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAWeightedCompositeOfA8941a5": "รวมข้อมูลไม่กี่รายการแบบถ่วงน้ำหนัก โดยเทียบแต่ละรายการกับประวัติของคุณ ดูน้ำหนักและความเพียงพอของประวัติเมื่อคืนได้ในหน้าการฟื้นตัว ข้อมูลที่ขาดจะถูกตัดออกแล้วปรับน้ำหนักที่เหลือ ไม่เคยนับเป็นศูนย์", + "@supplementAWeightedCompositeOfA8941a5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAASMSleepAccountingDefinitions79c9d9": "นิยามการนับเวลานอนของ AASM", + "@supplementAASMSleepAccountingDefinitions79c9d9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAN2554PedometerPhonePedometer79c0a4": "เครื่องนับก้าว AN-2554 · ตัวนับก้าวโทรศัพท์ (HealthKit / Health Connect)", + "@supplementAN2554PedometerPhonePedometer79c0a4": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAboutYourBedtimeLogYourb7f0e2": "ใกล้เวลาเข้านอนแล้ว — บันทึกวันนี้กัน", + "@supplementAboutYourBedtimeLogYourb7f0e2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAddAMedicationef7260": "เพิ่มยา", + "@supplementAddAMedicationef7260": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAlreadySyncing7ed158": "กำลังซิงค์อยู่แล้ว", + "@supplementAlreadySyncing7ed158": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAwakeMin81d9ac": "นาทีที่ตื่น", + "@supplementAwakeMin81d9ac": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBaevskyStressIndexOverA037465": "ดัชนีความเครียด Baevsky ในช่วงพัก ใช้ฮิสโตแกรมวัดว่าช่วงเวลาจังหวะหัวใจกระจุกตัวเพียงใด หากไม่มีช่วงพัก จะไม่ใช้ค่าอื่นแทน", + "@supplementBaevskyStressIndexOverA037465": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBandBatteryAndCharging0d7f7d": "แบตเตอรี่และการชาร์จสายรัด", + "@supplementBandBatteryAndCharging0d7f7d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBanisterTRIMPFamilyLogCompressed553d36": "ตระกูล Banister TRIMP · บีบอัดด้วยลอการิทึม", + "@supplementBanisterTRIMPFamilyLogCompressed553d36": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBedtimee3cb8b": "เวลาเข้านอน", + "@supplementBedtimee3cb8b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBloodOxygen8cd845": "ออกซิเจนในเลือด", + "@supplementBloodOxygen8cd845": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBreathingRateRecoveredFromRespiratory66461f": "หาอัตราการหายใจจากการเปลี่ยนจังหวะหัวใจตามการหายใจ ซึ่งเป็นการปรับช่วงเวลาจังหวะหัวใจเป็นคาบ โดยทดสอบหลายอัตราที่เป็นไปได้", + "@supplementBreathingRateRecoveredFromRespiratory66461f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBreathingVariability99a552": "ความแปรปรวนการหายใจ", + "@supplementBreathingVariability99a552": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCardiovascularLoadOverTheDayd6c4f3": "ภาระต่อระบบหัวใจและหลอดเลือดตลอดวัน บีบอัดเป็นช่วงคะแนน 0–21", + "@supplementCardiovascularLoadOverTheDayd6c4f3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementChargeYourStrapBeforeBedcb17aa": "ชาร์จสายรัดก่อนนอน", + "@supplementChargeYourStrapBeforeBedcb17aa": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCharging5f99fe": "กำลังชาร์จ", + "@supplementCharging5f99fe": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCoefficientOfVariationOfPerc71989": "สัมประสิทธิ์ความแปรปรวนของอัตราการหายใจแต่ละช่วงตลอดคืน", + "@supplementCoefficientOfVariationOfPerc71989": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementColeKripkeWakeSpineHRVcd5f37": "แกนการตื่น Cole–Kripke + ชั้นข้อมูล HRV", + "@supplementColeKripkeWakeSpineHRVcd5f37": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCountedNeverModelledAStepc66896": "นับจริง ไม่ใช้แบบจำลอง จำนวนก้าวมาจากตัวนับที่อ่านรูปแบบการเดินได้ ได้แก่ตัวนับ 100 Hz ของสายรัดขณะสตรีมหรือของโทรศัพท์ แต่ละช่วงใช้เซ็นเซอร์ที่บันทึกจริง ช่วงที่ทั้งสองบันทึกจะนับเพียงครั้งเดียว การออกกำลังกายจึงไม่เปลี่ยนแหล่งข้อมูลของทั้งวันแทนเซ็นเซอร์ที่บันทึกช่วงที่เหลือ ไม่มีค่าประมาณจาก 1 Hz เพราะจังหวะเดินสูงเกินกว่าหนึ่งตัวอย่างต่อวินาทีจะแยกได้ วันที่ไม่มีตัวนับจึงไม่รายงานก้าวแทนการเดา", + "@supplementCountedNeverModelledAStepc66896": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCreatinined3029a": "ครีอะตินิน", + "@supplementCreatinined3029a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDailyRecoveryReadinessFromYourf995c0": "คะแนนการฟื้นตัวรายวันของคุณ", + "@supplementDailyRecoveryReadinessFromYourf995c0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDeepMin28f1fc": "นาทีหลับลึก", + "@supplementDeepMin28f1fc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDeviceAlerts608f4f": "การเตือนอุปกรณ์", + "@supplementDeviceAlerts608f4f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDidYouNapccbced": "คุณงีบหรือไม่?", + "@supplementDidYouNapccbced": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDidYouWorkOut9601b8": "คุณออกกำลังกายหรือไม่?", + "@supplementDidYouWorkOut9601b8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementENMOOverAPersonalDynamice858c1": "ENMO เหนือเกณฑ์ขั้นต่ำของช่วงการเคลื่อนไหวส่วนบุคคล", + "@supplementENMOOverAPersonalDynamice858c1": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEditDailyStepGoal3f9637": "แก้ไขเป้าหมายก้าวต่อวัน", + "@supplementEditDailyStepGoal3f9637": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementElevatedRestingHRSuppressedHRVfaf9cb": "HR ขณะพักสูงขึ้น + HRV ลดลงในหลายคืนล่าสุด", + "@supplementElevatedRestingHRSuppressedHRVfaf9cb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEmptyResponseFromProvider2db057": "ผู้ให้บริการตอบกลับว่างเปล่า", + "@supplementEmptyResponseFromProvider2db057": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEndTheActiveWorkout37ce3f": "จบการออกกำลังกายที่กำลังดำเนินอยู่", + "@supplementEndTheActiveWorkout37ce3f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEndWorkout3e8d62": "จบการออกกำลังกาย", + "@supplementEndWorkout3e8d62": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFastingGlucose5433f3": "กลูโคสขณะอดอาหาร", + "@supplementFastingGlucose5433f3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFastingInsulincf8459": "อินซูลินขณะอดอาหาร", + "@supplementFastingInsulincf8459": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFerritin3c7c47": "เฟอร์ริติน", + "@supplementFerritin3c7c47": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFolatec66dfd": "โฟเลต", + "@supplementFolatec66dfd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFreeT4f89836": "Free T4", + "@supplementFreeT4f89836": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementGoal9fe00a": "เป้าหมาย", + "@supplementGoal9fe00a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementGood61dedc": "ดี", + "@supplementGood61dedc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHDLCholesterold579f5": "คอเลสเตอรอล HDL", + "@supplementHDLCholesterold579f5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHEALTHOBSERVATION4f314b": "ข้อสังเกตสุขภาพ", + "@supplementHEALTHOBSERVATION4f314b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHRRecovery1b0d16": "การฟื้นตัวของ HR", + "@supplementHRRecovery1b0d16": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHRVStabilitydfdddc": "ความคงที่ของ HRV", + "@supplementHRVStabilitydfdddc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHaematocrit2a11fb": "ฮีมาโตคริต", + "@supplementHaematocrit2a11fb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHaemoglobinc80789": "ฮีโมโกลบิน", + "@supplementHaemoglobinc80789": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHardMinutes9feee8": "นาทีออกแรงหนัก", + "@supplementHardMinutes9feee8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHealthAlerts1de231": "การเตือนสุขภาพ", + "@supplementHealthAlerts1de231": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHeartRateRecoveryfdc20e": "การฟื้นตัวของอัตราการเต้นหัวใจ", + "@supplementHeartRateRecoveryfdc20e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHeartRateToEnergyRegression1e01ee": "สมการถดถอยอัตราการเต้นหัวใจเป็นพลังงานในช่วงตื่น อ้างอิงน้ำหนัก อายุ และเพศ เป็นค่าประมาณและไวต่อข้อมูลทั้งสาม", + "@supplementHeartRateToEnergyRegression1e01ee": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHighb1a595": "สูง", + "@supplementHighb1a595": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHowFarSleepingHeartRatee471ae": "อัตราการเต้นหัวใจขณะนอนลดลงจากค่าเฉลี่ยขณะตื่นเพียงใด", + "@supplementHowFarSleepingHeartRatee471ae": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHowWasToday812df3": "วันนี้เป็นอย่างไรบ้าง?", + "@supplementHowWasToday812df3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementHrvRmssdf7982b": "HRV RMSSD", + "@supplementHrvRmssdf7982b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementIllnessUnusualPhysiologyAndTemperatureda080b": "สัญญาณการเจ็บป่วย สรีรวิทยาผิดปกติ และอุณหภูมิ", + "@supplementIllnessUnusualPhysiologyAndTemperatureda080b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementImportedFromWHOOPbb12b5": "นำเข้าจาก WHOOP", + "@supplementImportedFromWHOOPbb12b5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementIrregularHeartRhythmScreene259c5": "จังหวะหัวใจไม่สม่ำเสมอ — คัดกรอง", + "@supplementIrregularHeartRhythmScreene259c5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementKeytel2005HarrisBenedictMifflind13096": "Keytel 2005 · ค่าขั้นต่ำ BMR Harris–Benedict / Mifflin", + "@supplementKeytel2005HarrisBenedictMifflind13096": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLDLCholesterol097ebc": "คอเลสเตอรอล LDL", + "@supplementLDLCholesterol097ebc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLastNightIsStillBeinga75a55": "กำลังคำนวณข้อมูลเมื่อคืน", + "@supplementLastNightIsStillBeinga75a55": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLogAWorkout6929de": "บันทึกการออกกำลังกาย", + "@supplementLogAWorkout6929de": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLogHowTheDayWent0af477": "บันทึกว่าวันนี้เป็นอย่างไร", + "@supplementLogHowTheDayWent0af477": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLogJournal7b63e0": "บันทึกประจำวัน", + "@supplementLogJournal7b63e0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLogPeriod9fe2f6": "บันทึกประจำเดือน", + "@supplementLogPeriod9fe2f6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLowa12494": "ต่ำ", + "@supplementLowa12494": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLowBatteryc5b099": "แบตเตอรี่ต่ำ", + "@supplementLowBatteryc5b099": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLowReadinessTodayfcb16c": "การฟื้นตัวต่ำวันนี้", + "@supplementLowReadinessTodayfcb16c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMagnesiume6a692": "แมกนีเซียม", + "@supplementMagnesiume6a692": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMarkADoseebc759": "ทำเครื่องหมายการใช้ยา", + "@supplementMarkADoseebc759": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMedication36da83": "ยา", + "@supplementMedication36da83": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMinutesOfSleepDetectedOUTSIDE0e1868": "นาทีที่ตรวจพบการนอนนอกช่วงนอนหลัก ใช้ตัวตรวจช่วงมุมแกน z ของข้อมือเช่นเดียวกับการนอนกลางคืน ยืนยันด้วยอัตราการเต้นหัวใจที่ลดลง นับการงีบแยกต่างหาก ไม่รวมในเวลาหลับหลัก", + "@supplementMinutesOfSleepDetectedOUTSIDE0e1868": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMinutesWhoseAccelerationSitsAbovee173ee": "นาทีที่ความเร่งสูงกว่าเกณฑ์การเคลื่อนไหวขั้นต่ำ เกณฑ์นี้รวมจากวันล่าสุดของคุณเมื่อมีข้อมูลพอ ก่อนหน้านั้นใช้ค่าประชากร นี่คือปริมาณกิจกรรม ไม่ใช่การเคลื่อนที่ ก้าวนับจากเครื่องนับก้าวและไม่เคยอนุมานจากค่านี้", + "@supplementMinutesWhoseAccelerationSitsAbovee173ee": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMinutesWithABandRecord3ca74f": "นาทีที่มีระเบียนสายรัด สายรัดเขียนลงหน่วยความจำเฉพาะเมื่อสวมที่ข้อมือ การมีระเบียนจึงหมายถึงการสวมใส่", + "@supplementMinutesWithABandRecord3ca74f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementModerateea8b09": "ปานกลาง", + "@supplementModerateea8b09": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMoodEnergyStressAMinute54d5f9": "อารมณ์ พลังงาน ความเครียด ใช้เวลาเพียงหนึ่งนาที", + "@supplementMoodEnergyStressAMinute54d5f9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMorningBriefing0da62b": "สรุปตอนเช้า", + "@supplementMorningBriefing0da62b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMorningCortisolc31c55": "คอร์ติซอลตอนเช้า", + "@supplementMorningCortisolc31c55": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMotionCoprocessord1ef3c": "ชิปประมวลผลการเคลื่อนไหว", + "@supplementMotionCoprocessord1ef3c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMovementMinutes4670da": "นาทีเคลื่อนไหว", + "@supplementMovementMinutes4670da": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNightToNightCoefficientOf0cae4a": "สัมประสิทธิ์ความแปรปรวนของ RMSSD ระหว่างคืน", + "@supplementNightToNightCoefficientOf0cae4a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNightlySweepe95625": "ตรวจทบทวนรายคืน", + "@supplementNightlySweepe95625": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoAlarmSetForTonight1dd33d": "คืนนี้ยังไม่ได้ตั้งปลุก", + "@supplementNoAlarmSetForTonight1dd33d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoMotionWasRecordedAlongside2b680c": "ไม่ได้บันทึกการเคลื่อนไหวร่วมกับอัตราการเต้นหัวใจ", + "@supplementNoMotionWasRecordedAlongside2b680c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoNightLongEnoughTo022959": "ไม่ได้บันทึกคืนที่นอนนานพอให้คำนวณคะแนน", + "@supplementNoNightLongEnoughTo022959": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoReadiness723eb1": "ไม่มีข้อมูลการฟื้นตัว", + "@supplementNoReadiness723eb1": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoTargetYeta4b21a": "ยังไม่มีเป้าหมาย", + "@supplementNoTargetYeta4b21a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoWakingHeartRateWase66108": "วันนี้ไม่ได้บันทึกอัตราการเต้นหัวใจขณะตื่น", + "@supplementNoWakingHeartRateWase66108": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNocturnalHRDipf94b8c": "การลดลงของ HR ระหว่างคืน", + "@supplementNocturnalHRDipf94b8c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNocturnalDippingLiteraturePersonalBaseline63f775": "งานวิจัยการลดลงระหว่างคืน; ค่าฐานส่วนบุคคล", + "@supplementNocturnalDippingLiteraturePersonalBaseline63f775": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNocturnalHeartRateMinimumPersonal5237e7": "อัตราการเต้นหัวใจต่ำสุดระหว่างคืน; ค่าฐานส่วนบุคคล ไม่ใช่ค่าประชากร", + "@supplementNocturnalHeartRateMinimumPersonal5237e7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNotEnoughHistoryYetTo635525": "ประวัติยังไม่เพียงพอที่จะทราบค่าปกติของคุณ", + "@supplementNotEnoughHistoryYetTo635525": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNotEnoughNightsOfRestingce7af6": "ยังมีข้อมูลอัตราการเต้นหัวใจขณะพักไม่พอหลายคืนสำหรับคำนวณช่วงสำรอง", + "@supplementNotEnoughNightsOfRestingce7af6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNothingFromLastNightHas71866a": "ยังไม่มีข้อมูลเมื่อคืนมาถึงแอป", + "@supplementNothingFromLastNightHas71866a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNothingRecordedSaysWhyThis97026a": "ไม่มีข้อมูลระบุว่าเหตุใดจึงไม่มีค่านี้", + "@supplementNothingRecordedSaysWhyThis97026a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNothingStoodOutTonight468e67": "คืนนี้ไม่พบสิ่งที่โดดเด่น", + "@supplementNothingStoodOutTonight468e67": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementOffe3de5a": "ปิด", + "@supplementOffe3de5a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementPairedSensor0ff7bd": "เซ็นเซอร์ที่จับคู่", + "@supplementPairedSensor0ff7bd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementPlews2013LnRMSSDHopkinsSmallestdd73bd": "Plews 2013 (lnRMSSD) · เกณฑ์การเปลี่ยนแปลงขั้นต่ำที่มีความหมายของ Hopkins", + "@supplementPlews2013LnRMSSDHopkinsSmallestdd73bd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementPlotting351c45": "กำลังวาดกราฟ…", + "@supplementPlotting351c45": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementPosesbcddeb": "ท่า", + "@supplementPosesbcddeb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementPossibleIllnessOnset9dccbc": "อาจเริ่มเจ็บป่วย", + "@supplementPossibleIllnessOnset9dccbc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementProviderReturnedANonJSON31ec8d": "ผู้ให้บริการตอบกลับเป็นข้อมูลที่ไม่ใช่ JSON ตรวจ URL หลักของ API ต้องชี้ไปยังปลายทาง /chat/completions ที่รองรับ OpenAI", + "@supplementProviderReturnedANonJSON31ec8d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementProviderReturnedAnUnsupportedResponse711ef9": "ผู้ให้บริการส่งคำตอบที่แอปอ่านไม่ได้ โปรดใช้ปลายทาง /chat/completions มาตรฐานที่รองรับ OpenAI แบบสตรีมอย่างเดียวใช้ไม่ได้", + "@supplementProviderReturnedAnUnsupportedResponse711ef9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementQueryingYourData547061": "กำลังค้นข้อมูลของคุณ…", + "@supplementQueryingYourData547061": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementREMSleepd0c12b": "การนอน REM", + "@supplementREMSleepd0c12b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRMSSDOverTheLongestArtefact4d9ff2": "RMSSD จากช่วงนอนที่ยาวที่สุดและไม่มีสัญญาณรบกวน กู้ช่วงเวลาจังหวะหัวใจจากข้อมูลสายรัด 1 Hz แล้วแก้ไขด้วยวิธี Lipponen–Tarvainen ก่อนคำนวณสถิติ มาจากชีพจรจึงเป็น PRV เป็นข้อมูลจริงและติดตามแนวโน้มได้ แต่ไม่ใช่ HRV จาก ECG", + "@supplementRMSSDOverTheLongestArtefact4d9ff2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementReadingYourFoodLog4efdaa": "กำลังอ่านบันทึกอาหาร…", + "@supplementReadingYourFoodLog4efdaa": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementReadingYourMedications855987": "กำลังอ่านรายการยา…", + "@supplementReadingYourMedications855987": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRecommendedBedtime4cba4c": "เวลาเข้านอนที่แนะนำ", + "@supplementRecommendedBedtime4cba4c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRecordPresenceNotHeartRate83be2e": "การมีระเบียน ไม่ใช่ความถูกต้องของอัตราการเต้นหัวใจ", + "@supplementRecordPresenceNotHeartRate83be2e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRelativeOnlyUncalibratedADC306a93": "ค่าเชิงสัมพัทธ์เท่านั้น — ADC ที่ยังไม่ปรับเทียบ", + "@supplementRelativeOnlyUncalibratedADC306a93": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRemMin0d0cd5": "นาที REM", + "@supplementRemMin0d0cd5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementReps702045": "จำนวนครั้ง", + "@supplementReps702045": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRequestTimeoutSeconds1c1975": "เวลารอคำขอสูงสุด (วินาที)", + "@supplementRequestTimeoutSeconds1c1975": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRestingHrdfb52f": "HR ขณะพัก", + "@supplementRestingHrdfb52f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSaveStepGoalf99049": "บันทึกเป้าหมายก้าว", + "@supplementSaveStepGoalf99049": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSetStepGoalb12cf1": "ตั้งเป้าหมายก้าว", + "@supplementSetStepGoalb12cf1": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementShownTonightOnVitalsa1d4ef": "แสดงคืนนี้ในสัญญาณชีพ", + "@supplementShownTonightOnVitalsa1d4ef": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSkinTemperatureElevated8165c1": "อุณหภูมิผิวสูงขึ้น", + "@supplementSkinTemperatureElevated8165c1": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepDebtMin0cdfc7": "หนี้การนอน (นาที)", + "@supplementSleepDebtMin0cdfc7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepEfficiency9c3cbc": "ประสิทธิภาพการนอน", + "@supplementSleepEfficiency9c3cbc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepEfficiencyPctc39ed5": "ประสิทธิภาพการนอน (%)", + "@supplementSleepEfficiencyPctc39ed5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepMin16cd5b": "เวลานอน (นาที)", + "@supplementSleepMin16cd5b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSmartWakeOff20d2dc": "ปิดการปลุกอัจฉริยะ", + "@supplementSmartWakeOff20d2dc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSmartWakeOnTheBand381ebf": "เปิดการปลุกอัจฉริยะ — สายรัดยังสั่นตามเวลาตื่นไม่ว่าจะเปิดหรือปิด", + "@supplementSmartWakeOnTheBand381ebf": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSmartWakeWindowb1483d": "ช่วงปลุกอัจฉริยะ", + "@supplementSmartWakeWindowb1483d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSomethingStoodOutToday463b39": "วันนี้พบสิ่งที่โดดเด่น", + "@supplementSomethingStoodOutToday463b39": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStagedFromBeatTimingVariabilityb83d0c": "แบ่งระยะจากความแปรปรวนช่วงเวลาจังหวะหัวใจและการเคลื่อนไหว เซ็นเซอร์ข้อมือแยก REM กับหลับตื้นได้เพียงคร่าว ๆ", + "@supplementStagedFromBeatTimingVariabilityb83d0c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStartWorkoutd0f3f2": "เริ่มออกกำลังกาย", + "@supplementStartWorkoutd0f3f2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStepGoalReached03be1a": "ถึงเป้าหมายก้าวแล้ว", + "@supplementStepGoalReached03be1a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStillWorkingOut5f72c7": "ยังออกกำลังกายอยู่หรือไม่?", + "@supplementStillWorkingOut5f72c7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSustainedRiseVsYourBaseline67c853": "สูงกว่าปกติของคุณต่อเนื่อง อาจเป็นสัญญาณเริ่มเจ็บป่วย", + "@supplementSustainedRiseVsYourBaseline67c853": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSyncing221ca6": "กำลังซิงค์…", + "@supplementSyncing221ca6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTalkItThrough88a9d2": "พูดคุยกัน", + "@supplementTalkItThrough88a9d2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTapForLastNightS6fe212": "แตะเพื่อดูการนอนเมื่อคืน การฟื้นตัว และความหมายต่อวันนี้", + "@supplementTapForLastNightS6fe212": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTapToLogAGlass879bad": "แตะเพื่อบันทึกน้ำหนึ่งแก้ว", + "@supplementTapToLogAGlass879bad": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTellItAboutYourDay129cfd": "เล่าเรื่องวันนี้ให้ฟัง AI จะเสนอแท็กและข้อความให้คุณเลือกเก็บ", + "@supplementTellItAboutYourDay129cfd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTellItAboutYourDayef23a5": "เล่าเรื่องวันนี้ให้ฟัง…", + "@supplementTellItAboutYourDayef23a5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThatNightHasNoSleepa8ce2d": "คืนนั้นไม่มีค่าประสิทธิภาพการนอน", + "@supplementThatNightHasNoSleepa8ce2d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThatNightHasNoTotalb1cf0a": "คืนนั้นไม่มีเวลานอนรวม", + "@supplementThatNightHasNoTotalb1cf0a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThatNightHasNoWake1fabdf": "คืนนั้นไม่มีเวลาตื่น", + "@supplementThatNightHasNoWake1fabdf": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheBandDidNotConfirmb7159e": "สายรัดไม่ได้ยืนยันการปลุกนี้ โปรดตรวจสอบสายรัด", + "@supplementTheBandDidNotConfirmb7159e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheBandHasNotYet9773f2": "สายรัดยังไม่พบอัตราการเต้นหัวใจสูงต่อเนื่องระหว่างออกแรงหนักพอให้วัดค่าสูงสุด", + "@supplementTheBandHasNotYet9773f2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheDropInHeartRate80433d": "อัตราการเต้นหัวใจที่ลดลงใน 60 วินาทีหลังจบช่วงออกแรง เฉลี่ยจากทุกช่วงของวัน", + "@supplementTheDropInHeartRate80433d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheHighestHeartRateHeldc1c878": "อัตราการเต้นหัวใจสูงสุดที่พบยังต่ำกว่าค่าคาดการณ์ตามอายุมาก จึงยังใช้โซนประมาณตามอายุจนกว่าสายรัดจะพบการออกแรงที่หนักขึ้น", + "@supplementTheHighestHeartRateHeldc1c878": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheLowestSustainedSleepingHeart72e5dd": "อัตราการเต้นหัวใจขณะนอนต่ำสุดต่อเนื่องของคืน จากหน้าต่างเลื่อนของข้อมูลระหว่างคืน ไม่ใช่ค่าชั่วขณะหรือต่ำสุดตอนกลางวัน", + "@supplementTheLowestSustainedSleepingHeart72e5dd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheNightSMeanRaw25e383": "ค่าเฉลี่ยเซ็นเซอร์ดิบของคืน แสดงเป็นความต่างจากคืนล่าสุด ๆ ของคุณ ไม่มีขั้นตอนใดแปลงเป็นองศา", + "@supplementTheNightSMeanRaw25e383": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheRatioOfLowTo817781": "อัตราส่วนกำลังความถี่ต่ำต่อสูงของความแปรปรวนช่วงเวลาจังหวะหัวใจ จาก Lomb–Scargle periodogram ข้อมูลมีระยะห่างไม่เท่ากัน การใช้ FFT จึงไม่ถูกต้อง", + "@supplementTheRatioOfLowTo817781": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThereIsNoRestingHeart36a9ca": "ไม่มีอัตราการเต้นหัวใจขณะพักจากคืนที่คำนวณคะแนนแล้วให้เทียบ", + "@supplementThereIsNoRestingHeart36a9ca": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThereIsNoScoredNight5d353d": "ไม่มีคืนที่คำนวณคะแนนแล้วให้อ่านค่านี้", + "@supplementThereIsNoScoredNight5d353d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTheseRecordingsAreNotStamped66b52f": "ข้อมูลนี้ไม่ได้ระบุว่าสายรัดใดบันทึก และค่านี้ต้องปรับเทียบรายสายรัด จึงไม่แสดงแทนการเดา", + "@supplementTheseRecordingsAreNotStamped66b52f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementThisDayCameFromAn2dc4b2": "วันนี้มาจากข้อมูลนำเข้าที่ครอบคลุมเฉพาะกลางคืน จึงไม่มีข้อมูลช่วงตื่น", + "@supplementThisDayCameFromAn2dc4b2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTimeAsleepAsAFraction516f7f": "สัดส่วนเวลาหลับต่อเวลาบนเตียง", + "@supplementTimeAsleepAsAFraction516f7f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTimeToMove7afe98": "ได้เวลาขยับ", + "@supplementTimeToMove7afe98": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTodayHasNotProducedAnyf103a0": "ยังไม่มีกิจกรรมวันนี้ให้อ่าน ยังไม่มีข้อมูลมาถึงแอป", + "@supplementTodayHasNotProducedAnyf103a0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTooFewCleanBeatTo5c2edf": "ช่วงเวลาระหว่างจังหวะหัวใจคุณภาพดีน้อยเกินกว่าจะคำนวณ", + "@supplementTooFewCleanBeatTo5c2edf": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTooFewHalfHourStretchesbe11a5": "ช่วงครึ่งชั่วโมงที่อ่านการหายใจได้ดีตลอดคืนมีน้อยเกินกว่าจะเทียบกัน", + "@supplementTooFewHalfHourStretchesbe11a5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTooFewHeartRateSamples412047": "บันทึกตัวอย่างอัตราการเต้นหัวใจได้น้อยเกินกว่าจะคำนวณ", + "@supplementTooFewHeartRateSamples412047": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTooFewRecordedSessionsTofa71f6": "การออกกำลังกายที่บันทึกมีน้อยเกินกว่าจะอธิบายรูปแบบแทนความคลาดเคลื่อน", + "@supplementTooFewRecordedSessionsTofa71f6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTotalCholesterol175f97": "คอเลสเตอรอลรวม", + "@supplementTotalCholesterol175f97": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTotalSleepTimeFromThee13b95": "เวลานอนรวมจากช่วงนอนตามมุมแกน z ของข้อมือ แบ่งระยะด้วยแบบจำลองที่รวมการเคลื่อนไหวและอัตราการเต้นหัวใจ", + "@supplementTotalSleepTimeFromThee13b95": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTotalTestosterone9e1b98": "เทสโทสเตอโรนรวม", + "@supplementTotalTestosterone9e1b98": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTrainingImpulseTimeInEachcd2945": "แรงกระตุ้นการฝึก: เวลาในแต่ละโซนอัตราการเต้นหัวใจ ถ่วงน้ำหนักตามภาระทางสรีรวิทยาของโซนนั้น", + "@supplementTrainingImpulseTimeInEachcd2945": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTransferrinSaturation31bc19": "ความอิ่มตัวของทรานส์เฟอร์ริน", + "@supplementTransferrinSaturation31bc19": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTriglycerides95ae7f": "ไตรกลีเซอไรด์", + "@supplementTriglycerides95ae7f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUnexpectedResponseFromProvider8b5e12": "ผู้ให้บริการตอบกลับในรูปแบบที่ไม่คาดหมาย", + "@supplementUnexpectedResponseFromProvider8b5e12": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUnknownSensor98a1f7": "เซ็นเซอร์ไม่ทราบชนิด", + "@supplementUnknownSensor98a1f7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUnusualForYou770b0d": "ต่างจากปกติของคุณ", + "@supplementUnusualForYou770b0d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUnusualOvernightPhysiology69c322": "สรีรวิทยาระหว่างคืนต่างจากปกติ", + "@supplementUnusualOvernightPhysiology69c322": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUnusualTogether4ca5cd": "ต่างจากปกติพร้อมกัน", + "@supplementUnusualTogether4ca5cd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementVO2maxEst25e886": "VO2max (ประมาณ)", + "@supplementVO2maxEst25e886": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementViewData9a8de9": "ดูข้อมูล", + "@supplementViewData9a8de9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementVitaminB12be7c1e": "วิตามินบี 12", + "@supplementVitaminB12be7c1e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementVitaminD25OHacb2ca": "วิตามินดี (25-OH)", + "@supplementVitaminD25OHacb2ca": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWHOOPSOwnNightlyValue5e1394": "ค่ารายคืนของ WHOOP เอง อ่านจากคอลัมน์ออกซิเจนในเลือดของไฟล์ที่นำเข้า และเก็บตามเดิม", + "@supplementWHOOPSOwnNightlyValue5e1394": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWebsterColeKripkeRescoringHRV378025": "ปรับคะแนน Webster / Cole–Kripke + แบ่งระยะด้วย HRV", + "@supplementWebsterColeKripkeRescoringHRV378025": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWindDown1d651a": "เตรียมเข้านอน", + "@supplementWindDown1d651a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWindDownMovementNudgesGoalsc032fa": "เตรียมเข้านอน เตือนขยับ เป้าหมาย และสรุปรายสัปดาห์", + "@supplementWindDownMovementNudgesGoalsc032fa": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWithheld96ac7e": "ไม่แสดงค่า", + "@supplementWithheld96ac7e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWithinUserDispersion6ba4c5": "การกระจายภายในบุคคล", + "@supplementWithinUserDispersion6ba4c5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWorking13b7bf": "กำลังดำเนินการ…", + "@supplementWorking13b7bf": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYouHaveNoWakeAlarmaf3d5a": "คุณยังไม่ได้ตั้งปลุกตื่นสำหรับคืนนี้", + "@supplementYouHaveNoWakeAlarmaf3d5a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYouHaveSetYourZones535d10": "คุณกำหนดโซนเอง จึงไม่มีจุดอ้างอิงช่วงสำรองที่วัดได้สำหรับแสดงการกระจาย", + "@supplementYouHaveSetYourZones535d10": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYouVeBeenStillForbb79a9": "คุณอยู่นิ่งมาสองสามชั่วโมงแล้ว", + "@supplementYouVeBeenStillForbb79a9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourAgeIsNotOn9fe209": "ยังไม่ได้ระบุอายุ ซึ่งจำเป็นต่อการคำนวณค่านี้", + "@supplementYourAgeIsNotOn9fe209": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourBandHasnTSynced0a4dfd": "สายรัดไม่ได้ซิงค์มาระยะหนึ่งแล้ว", + "@supplementYourBandHasnTSynced0a4dfd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourBeatToBeatPatternfed8f0": "รูปแบบระหว่างจังหวะหัวใจวันนี้ดูไม่สม่ำเสมอ เป็นการคัดกรอง ไม่ใช่การวินิจฉัย หากมีอาการควรพบแพทย์", + "@supplementYourBeatToBeatPatternfed8f0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourHeightIsNotOn733908": "ยังไม่ได้ระบุส่วนสูง ซึ่งจำเป็นต่อการคำนวณค่านี้", + "@supplementYourHeightIsNotOn733908": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourMorningBriefingIsReadydd0ae8": "สรุปตอนเช้าของคุณพร้อมแล้ว", + "@supplementYourMorningBriefingIsReadydd0ae8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourNightlySignalsDeviateFromc8d20a": "สัญญาณระหว่างคืนต่างจากปกติของคุณ", + "@supplementYourNightlySignalsDeviateFromc8d20a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRating83cd62": "คะแนนของคุณ", + "@supplementYourRating83cd62": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRecoveryIsReadya1734c": "ข้อมูลการฟื้นตัวพร้อมแล้ว", + "@supplementYourRecoveryIsReadya1734c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRecoveryMarkersAreBelow2fc2f7": "ค่าชี้วัดการฟื้นตัวต่ำกว่าช่วงปกติของคุณ ผ่อนลงสักหน่อย", + "@supplementYourRecoveryMarkersAreBelow2fc2f7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRestingHRHasFallenca6165": "อัตราการเต้นหัวใจขณะพักลดลงจากปกติช่วงล่าสุดอย่างชัดเจน", + "@supplementYourRestingHRHasFallenca6165": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRestingHRHasRisen59f637": "อัตราการเต้นหัวใจขณะพักสูงขึ้นจากปกติช่วงล่าสุดอย่างชัดเจน", + "@supplementYourRestingHRHasRisen59f637": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourRestingHeartRateTrend8eccb6": "แนวโน้มอัตราการเต้นหัวใจขณะพักเปลี่ยนไป", + "@supplementYourRestingHeartRateTrend8eccb6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourSexIsNotOn676db8": "ยังไม่ได้ระบุเพศ ซึ่งสูตรคำนวณนี้จำเป็นต้องใช้", + "@supplementYourSexIsNotOn676db8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourStrapAlarmJustFiredd366d3": "สายรัดของคุณเพิ่งปลุก", + "@supplementYourStrapAlarmJustFiredd366d3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourWeekInReviewabd176": "ทบทวนสัปดาห์ของคุณ", + "@supplementYourWeekInReviewabd176": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYourWeightIsNotOn4ae5a6": "ยังไม่ได้ระบุน้ำหนัก ซึ่งจำเป็นต่อการคำนวณค่านี้", + "@supplementYourWeightIsNotOn4ae5a6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementYouVeBeenInA933b2c": "คุณอยู่ในท่าพิมพ์งานเกิน 90 นาทีโดยไม่ได้เดิน", + "@supplementYouVeBeenInA933b2c": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAlcoholUnitsea84fd": "หน่วยแอลกอฮอล์", + "@supplementAlcoholUnitsea84fd": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementAnImprovement00aad0": "ดีขึ้น", + "@supplementAnImprovement00aad0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBrMin0041f9": "ครั้ง/นาที", + "@supplementBrMin0041f9": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementBreakfast9e3a82": "มื้อเช้า", + "@supplementBreakfast9e3a82": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCaffeineMgf15138": "คาเฟอีน (มก.)", + "@supplementCaffeineMgf15138": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementCme283e1": "ซม.", + "@supplementCme283e1": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDinner78cbc7": "มื้อเย็น", + "@supplementDinner78cbc7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementDown77346d": "ลดลง", + "@supplementDown77346d": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEnergy173d91": "พลังงาน", + "@supplementEnergy173d91": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementEveryDaya3fd74": "ทุกวัน", + "@supplementEveryDaya3fd74": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementFiguref85bdc": "ภาพประกอบ", + "@supplementFiguref85bdc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementG54fd17": "ก.", + "@supplementG54fd17": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementIOSCanOnlyShowThe2139b2": "iOS แสดงหน้าต่างจับคู่ได้เฉพาะก่อนแอปใช้ Bluetooth ปิด OpenStrap ให้สนิทแล้วเปิดใหม่เพื่อแสดงหน้าต่างนี้", + "@supplementIOSCanOnlyShowThe2139b2": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementKcal72037b": "kcal", + "@supplementKcal72037b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementKg138984": "กก.", + "@supplementKg138984": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementKm08ec69": "กม.", + "@supplementKm08ec69": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementLunch094530": "มื้อกลางวัน", + "@supplementLunch094530": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementM6b0d31": "ม.", + "@supplementM6b0d31": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMinb6c935": "นาที", + "@supplementMinb6c935": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMissed09f750": "พลาด", + "@supplementMissed09f750": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementMood89b9fb": "อารมณ์", + "@supplementMood89b9fb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNoTrendYetNotEnoughc23fe5": "ยังไม่มีแนวโน้ม บันทึกจำนวนวันไม่พอ", + "@supplementNoTrendYetNotEnoughc23fe5": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNotTaken3d2bc8": "ยังไม่ได้ใช้", + "@supplementNotTaken3d2bc8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementNothing0feca7": "ไม่มี", + "@supplementNothing0feca7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementReadinesseb830b": "การฟื้นตัว", + "@supplementReadinesseb830b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementRestingHeartRatec5adc7": "อัตราการเต้นหัวใจขณะพัก", + "@supplementRestingHeartRatec5adc7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementScore75ebcb": "คะแนน", + "@supplementScore75ebcb": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementScreensMinab5656": "เวลาใช้หน้าจอ (นาที)", + "@supplementScreensMinab5656": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepEfficiency548fe0": "ประสิทธิภาพการนอน", + "@supplementSleepEfficiency548fe0": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSleepQualitya146dc": "คุณภาพการนอน", + "@supplementSleepQualitya146dc": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSnack1ba61a": "ของว่าง", + "@supplementSnack1ba61a": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSoreness91da9e": "ปวดเมื่อย", + "@supplementSoreness91da9e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementSteady0c69e7": "คงที่", + "@supplementSteady0c69e7": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStrain26d10f": "ความหนัก", + "@supplementStrain26d10f": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementStress165bd3": "ความเครียด", + "@supplementStress165bd3": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTimeAsleep78b642": "เวลาที่หลับ", + "@supplementTimeAsleep78b642": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTrendingDownfc2716": "มีแนวโน้มลดลง", + "@supplementTrendingDownfc2716": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementTrendingUp34094b": "มีแนวโน้มเพิ่มขึ้น", + "@supplementTrendingUp34094b": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementUp7c0a25": "เพิ่มขึ้น", + "@supplementUp7c0a25": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementVanHees2015WindowDetectionbef776": "ตรวจช่วงเวลา van Hees 2015 + HR ลดลงระหว่างคืน", + "@supplementVanHees2015WindowDetectionbef776": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementVanHees2015WebsterCole3d69f8": "van Hees 2015 · ปรับคะแนน Webster / Cole–Kripke", + "@supplementVanHees2015WebsterCole3d69f8": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWaterMl7902c6": "น้ำ (มล.)", + "@supplementWaterMl7902c6": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWeightKge50726": "น้ำหนัก (กก.)", + "@supplementWeightKge50726": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWorkoutc87292": "ออกกำลังกาย", + "@supplementWorkoutc87292": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWorseThanUsual06f439": "แย่กว่าปกติ", + "@supplementWorseThanUsual06f439": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "supplementWristOptical06ad7e": "แสงที่ข้อมือ", + "@supplementWristOptical06ad7e": { + "description": "Presentation-only text for existing interface, exports or notifications." + }, + "presentationBluetoothHeartRateSensor": "เซ็นเซอร์อัตราการเต้นหัวใจ Bluetooth", + "presentationGarminWatch": "นาฬิกา Garmin", + "presentationPolarSensor": "เซ็นเซอร์ Polar", + "presentationCorosWatch": "นาฬิกา Coros", + "presentationCOROSWatch": "นาฬิกา COROS", + "presentationSmartRingR11MR10M": "แหวนอัจฉริยะ (R11M/R10M)", + "presentationDaFitMOYOUNGWatch": "นาฬิกา DaFit / MOYOUNG", + "presentationWearFitBand": "สายรัด WearFit", + "presentationSmartRingBandLefunProtocol": "แหวน/สายรัดอัจฉริยะ (โพรโทคอล Lefun)", + "presentationHPlusHRBand": "สายรัด HPlus HR", + "presentationFossilSkagenHybridSmartwatch": "นาฬิกาไฮบริด Fossil/Skagen", + "presentationColmiRing": "แหวน Colmi", + "presentationNoSleepWasScoredForThisDayRestingHR": "วันนี้ไม่มีการนอนที่คำนวณคะแนนแล้ว HR ขณะพักวัดจากช่วงนอนเท่านั้น ไม่ใช้ชั่วโมงที่ตื่น", + "presentationBaevskyStressIndex0100RestingAutonomicTensionPRV": "ดัชนีความเครียด Baevsky → 0–100; ความตึงตัวของระบบประสาทอัตโนมัติขณะพัก (PRV)", + "presentationNoReadinessInputsPresentNeverImputed": "ไม่มีข้อมูลสำหรับคำนวณการฟื้นตัว — “—” (ไม่เติมค่าแทน)", + "presentationMETValueYourWeightRefinedByHeartRateOr": "ค่า MET × น้ำหนักของคุณ ปรับด้วยอัตราการเต้นหัวใจ หรือใช้อัตราการเต้นหัวใจเพียงอย่างเดียวสำหรับกิจกรรมที่ไม่มีค่า MET", + "presentationMood": "อารมณ์", + "presentationSleepQuality": "คุณภาพการนอน", + "presentationHeightCm": "ส่วนสูง (ซม.)", + "presentationHeightIn": "ส่วนสูง (นิ้ว)", + "presentationWeightLb": "น้ำหนัก (ปอนด์)", + "presentationS": "วิ", + "presentationV": "µV", + "presentationReadsTheRingDirectlyNoAccountNoKeyExchange": "อ่านจากแหวนโดยตรง ไม่ต้องมีบัญชีหรือแลกเปลี่ยนคีย์", + "presentationPebble2OrPebble2SEOnlyPairsOnly": "เฉพาะ Pebble 2 หรือ Pebble 2 SE ขณะนี้จับคู่ได้เท่านั้น ยังไม่อ่านหรือเก็บข้อมูล", + "presentationTheOriginalFossilSkagenHybridSmartwatchNotTheNewer": "นาฬิกาไฮบริด Fossil/Skagen รุ่นดั้งเดิม ไม่ใช่ Hybrid HR รุ่นใหม่ จับคู่และเชื่อมต่อได้ แต่ยังไม่คำนวณค่าจากข้อมูล", + "presentationABudgetActivityBandPairsAndBanksItsRaw": "สายรัดกิจกรรมราคาประหยัด จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationPairsAndBanksItsRawDataNothingIsDecoded": "จับคู่และเก็บข้อมูลดิบได้ ยังไม่ถอดรหัส", + "presentationAGenericRingOrBandSoldUnderManyStorefront": "แหวนหรือสายรัดทั่วไปที่ขายภายใต้หลายชื่อร้าน จับคู่และเชื่อมต่อได้ ยังไม่รายงานข้อมูล", + "presentationAGenericHPlusFamilyHRBandPairsAndBanks": "สายรัด HR ตระกูล HPlus ทั่วไป จับคู่และเก็บประวัติได้ ยังไม่ถอดรหัสเป็นค่าตัวเลข", + "presentationPairsAndBanksItsRawDataInTheBackground": "จับคู่และเก็บข้อมูลดิบในเบื้องหลังได้ แต่ยังไม่คำนวณค่า", + "presentationAnUnbrandedDaFitMOYOUNGStyleWatchPairsAndBanks": "นาฬิกาแบบ DaFit/MOYOUNG ไม่ระบุแบรนด์ จับคู่และเก็บข้อมูลอุปกรณ์ได้ แต่ยังไม่คำนวณค่า", + "presentationAnUnbrandedMakibesHR3BoardPairsAndBanksIts": "บอร์ด Makibes HR3 ไม่ระบุแบรนด์ จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationAnUnbrandedID115BoardPairsAndBanksItsRaw": "บอร์ด ID115 ไม่ระบุแบรนด์ จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationAnUnbrandedXWatchBoardPairsAndBanksItsRaw": "บอร์ด XWatch ไม่ระบุแบรนด์ จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationAnUnbrandedWatch9BoardPairsAndBanksItsRaw": "บอร์ด Watch9 ไม่ระบุแบรนด์ จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationAnSMAQ2OSSSmartwatchPairsAndBanksIts": "นาฬิกาอัจฉริยะ SMA-Q2-OSS จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationATLW64OrNO1F1FitnessBandPairsAnd": "สายรัดฟิตเนส TLW64 หรือ NO1 F1 จับคู่และเก็บข้อมูลดิบได้ แต่ยังไม่คำนวณค่า", + "presentationCaffeine": "คาเฟอีน", + "presentationAlcohol": "แอลกอฮอล์", + "presentationMeasurementsOf": "{have} จาก {total} ค่าที่วัด", + "@presentationMeasurementsOf": { + "placeholders": { + "have": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "presentationAveragePulse": "เฉลี่ย {value} bpm", + "@presentationAveragePulse": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "presentationSoreness": "ปวดเมื่อย", + "presentationScreensBeforeBed": "ใช้หน้าจอก่อนนอน", + "presentationIn": "นิ้ว", + "presentationLb": "ปอนด์", + "presentationMl": "มล.", + "presentationMg": "มก.", + "presentationUnits": "หน่วย", + "presentationWeightRepsLogged": "บันทึก {weight} {unit} × {reps} แล้ว", + "@presentationWeightRepsLogged": { + "placeholders": { + "weight": { + "type": "String" + }, + "unit": { + "type": "String" + }, + "reps": { + "type": "int" + } + } + }, + "presentationVolumeUnit": "ปริมาณ {unit}", + "@presentationVolumeUnit": { + "placeholders": { + "unit": { + "type": "String" + } + } + }, + "journalTagCaffeine": "คาเฟอีน", + "journalTagAlcohol": "แอลกอฮอล์", + "journalTagLateMeal": "กินดึก", + "journalTagStress": "ความเครียด", + "journalTagPoorSleep": "นอนไม่ดี", + "journalTagTravel": "เดินทาง", + "journalTagScreensLate": "ใช้หน้าจอดึก", + "journalTagMeds": "ยา", + "journalTagSick": "ป่วย", + "journalTagSauna": "ซาวน่า", + "journalTagColdPlunge": "แช่น้ำเย็น", + "journalTagSocial": "สังสรรค์", + "journalTagWorkout": "ออกกำลังกาย", + "journalTagRestDay": "วันพัก", + "liveHrShowingDeviceSemantics": "กำลังแสดง {label} แตะเพื่อเปลี่ยนอุปกรณ์", + "@liveHrShowingDeviceSemantics": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "devicesResetSourceSemantics": "คืนลำดับเริ่มต้นของ{signal}", + "@devicesResetSourceSemantics": { + "placeholders": { + "signal": { + "type": "String" + } + } + }, + "metricDetailStepsGoalValue": "{count, plural, other{{value} ก้าว}}", + "@metricDetailStepsGoalValue": { + "placeholders": { + "count": { + "type": "int" + }, + "value": { + "type": "String" + } + } + }, + "scrubberNothingSelected": "ยังไม่ได้เลือก", + "supplementUnreadableField": "{field} ไม่ใช่ตัวเลข ยังไม่ได้บันทึก", + "@supplementUnreadableField": { + "placeholders": { + "field": { + "type": "String" + } + } + }, + "activityZonesNameWarmUp": "อบอุ่นร่างกาย", + "activityZonesNameEasy": "เบา", + "activityZonesNameAerobic": "แอโรบิก", + "activityZonesNameThreshold": "เทรชโฮลด์", + "activityZonesNameMaxEffort": "ออกแรงสูงสุด", + "dataBackupFolder": "โฟลเดอร์สำรองข้อมูล", + "dataBackupFolderDefault": "โฟลเดอร์แอป (ค่าเริ่มต้น)", + "dataBackupFolderSub": "เลือกตำแหน่งเก็บข้อมูลสำรองใหม่ ข้อมูลสำรองเดิมยังอยู่ที่เดิม", + "dataBackupFolderUseDefault": "ใช้โฟลเดอร์เริ่มต้น", + "dataBackupFolderSaved": "บันทึกโฟลเดอร์สำรองข้อมูลแล้ว", + "dataBackupFolderRetry": "ลอง “สำรองข้อมูลตอนนี้” อีกครั้ง หรือเลือกโฟลเดอร์อื่น", + "@dataBackupFolder": { + "description": "Android automatic backup folder setting." + }, + "@dataBackupFolderDefault": { + "description": "Android automatic backup folder setting." + }, + "@dataBackupFolderSub": { + "description": "Android automatic backup folder setting." + }, + "@dataBackupFolderUseDefault": { + "description": "Android automatic backup folder setting." + }, + "@dataBackupFolderSaved": { + "description": "Android automatic backup folder setting." + }, + "@dataBackupFolderRetry": { + "description": "Android automatic backup folder setting." + }, + "findingIllnessTitle": "อัตราการเต้นหัวใจขณะพักสูงต่อเนื่อง", + "@findingIllnessTitle": { + "description": "Findings log / health-exception copy (lib/compute/findings.dart)." + }, + "findingIllnessDetail": "หลายคืนล่าสุดแสดงอัตราการเต้นหัวใจขณะพักสูงกว่าปกติ อาจมาจากคืนเดียวที่สูงมากหรือหลายคืนที่สูงเล็กน้อย มีเพียงสัญญาณเดียว จึงเป็นรูปแบบ ไม่ใช่สาเหตุ", + "@findingIllnessDetail": { + "description": "Findings log / health-exception copy (lib/compute/findings.dart)." + }, + "findingLowReadinessTitle": "การฟื้นตัวต่ำ", + "@findingLowReadinessTitle": { + "description": "Findings log / health-exception copy (lib/compute/findings.dart)." + }, + "findingLowReadinessDetail": "การฟื้นตัวอยู่ในช่วงต่ำที่สุด สัญญาณของคืนนั้นรวมกันต่ำกว่าปกติของคุณมาก", + "@findingLowReadinessDetail": { + "description": "Findings log / health-exception copy (lib/compute/findings.dart)." + }, + "findingLowReadinessScoredDetail": "คะแนนการฟื้นตัว {score} อยู่ในช่วงต่ำที่สุด สัญญาณของคืนนั้นรวมกันต่ำกว่าปกติของคุณมาก", + "@findingLowReadinessScoredDetail": { + "description": "Findings log / health-exception copy (lib/compute/findings.dart).", + "placeholders": { + "score": { + "type": "int" + } + } + }, + "devicesWhatItDoesStored": "เก็บทุกอย่างที่ส่งมาภายใต้ชื่ออุปกรณ์ คะแนนจากอุปกรณ์นี้ยังอยู่ระหว่างทดลองและปิดไว้จนกว่าจะตรวจสอบกับฮาร์ดแวร์จริง", + "@devicesWhatItDoesStored": { + "description": "Row sub: a paired device with no beat-timing tier (wearable, scale, plain sensor)." + }, + "devicesWhatItDoesBeats": "เก็บช่วงเวลาจังหวะหัวใจภายใต้ชื่ออุปกรณ์ ระหว่างออกกำลังกายและหลังจบไม่กี่นาที การคำนวณคะแนนจากอุปกรณ์นี้ยังอยู่ระหว่างทดลองและปิดไว้", + "@devicesWhatItDoesBeats": { + "description": "Row sub: a workout sensor ranked for beat timing." + }, + "pairSensorExplainerWorkout": "อัตราการเต้นหัวใจสำหรับออกกำลังกาย ไม่แทนสายรัดของคุณ จะบันทึกระหว่างออกกำลังกายเมื่อผ่านการตรวจสอบฮาร์ดแวร์แล้ว ก่อนหน้านั้นจะไม่บันทึก", + "@pairSensorExplainerWorkout": { + "description": "Explanatory body before pairing a workout sensor (chest strap, arm band)." + }, + "pairSensorExplainerCoros": "นาฬิกากีฬา แต่ละการซิงค์อ่านแบตเตอรี่และอัตราการเต้นหัวใจไม่กี่วินาที ไม่ใช้ในการออกกำลังกายหรือคำนวณคะแนน", + "@pairSensorExplainerCoros": { + "description": "Explanatory body before pairing a Coros watch (synced in short windows, never armed by a workout)." + }, + "pairSensorExplainerWearable": "เก็บข้อมูลของอุปกรณ์และระบุว่าเป็นของอุปกรณ์นั้น การคำนวณค่าของเรา เช่น การนอน อัตราการเต้นหัวใจขณะพัก และความหนัก ยังอยู่ระหว่างทดลองและปิดไว้", + "@pairSensorExplainerWearable": { + "description": "Explanatory body before pairing a watch, ring or band that is not the primary band." + }, + "pairSensorExplainerMeasurement": "เก็บค่าที่อ่านได้ภายใต้ชื่ออุปกรณ์ การใช้ในโปรไฟล์ยังอยู่ระหว่างทดลองและปิดไว้จนกว่าจะตรวจสอบกับฮาร์ดแวร์จริง", + "@pairSensorExplainerMeasurement": { + "description": "Explanatory body before pairing a scale or thermometer." + }, + "pairSensorKeyReplacesTitle": "การจับคู่จะแทนที่คีย์ของแอป Oura", + "@pairSensorKeyReplacesTitle": { + "description": "Warning title on the ring pairing screen, shown before the user pairs." + }, + "pairSensorKeyReplacesBody": "แหวนเก็บได้หนึ่งคีย์ หากจับคู่โดยไม่ใช้คีย์ของแอป Oura จะตั้งคีย์ใหม่ และแอป Oura จะใช้กับแหวนไม่ได้จนกว่าจะรีเซ็ตแหวน", + "@pairSensorKeyReplacesBody": { + "description": "Warning body: pairing installs a new key that replaces the key the ring's own app uses." + }, + "devicePickerBlurbUltrahuman": "อ่านจากแหวนโดยตรง ไม่ต้องมีบัญชีหรือแลกเปลี่ยนคีย์", + "@devicePickerBlurbUltrahuman": { + "description": "Category row subtitle for an Ultrahuman smart ring." + }, + "devicePickerBlurbPebble": "เฉพาะ Pebble 2 หรือ Pebble 2 SE ซิงค์ก้าวและการนอนได้ ส่วนอัตราการเต้นหัวใจมีเฉพาะ Pebble 2 (SE ไม่มีเซ็นเซอร์หัวใจ)", + "@devicePickerBlurbPebble": { + "description": "Category row subtitle for a Pebble 2 / 2 SE watch." + }, + "pairSensorStoredOnSync": "เก็บข้อมูลเมื่อซิงค์", + "@pairSensorStoredOnSync": { + "description": "Row sub: paired wearable, whose records are stored when it syncs; no workout uses it." + }, + "pairSensorStoredOnReading": "เก็บค่าขณะที่วัด", + "@pairSensorStoredOnReading": { + "description": "Row sub: paired measurement device (a scale, a thermometer); no workout uses it." + }, + "pairSensorSyncedInWindows": "ซิงค์เป็นช่วงสั้น ๆ", + "@pairSensorSyncedInWindows": { + "description": "Row sub: paired Coros watch, which syncs in short windows and is never used by a workout." + }, + "pairSensorPairingMiband234": "กำลังจับคู่… หากสายรัดสั่น ให้แตะเพื่อยืนยัน", + "@pairSensorPairingMiband234": { + "description": "Row sub: a Mi Band 2/3 pairing, waiting for a tap on the band." + }, + "missingSignalSteps": "ไม่มีจำนวนก้าว", + "@missingSignalSteps": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own step count. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalSkinTempC": "ไม่มีอุณหภูมิผิว", + "@missingSignalSkinTempC": { + "description": "Sub-label on a device that cannot serve a metric because it does not report a skin temperature in degrees. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalActivityLevel": "ไม่มีข้อมูลกิจกรรม", + "@missingSignalActivityLevel": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own activity value per record. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalDeviceHrv": "ไม่มี HRV ที่อุปกรณ์คำนวณเอง", + "@missingSignalDeviceHrv": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own HRV figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalDeviceStages": "ไม่มีระยะการนอนที่อุปกรณ์แบ่งเอง", + "@missingSignalDeviceStages": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own sleep stages. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalDeviceResp": "ไม่มีอัตราการหายใจที่อุปกรณ์คำนวณเอง", + "@missingSignalDeviceResp": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own breathing rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalDeviceStress": "ไม่มีความเครียดที่อุปกรณ์คำนวณเอง", + "@missingSignalDeviceStress": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own stress figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "missingSignalDeviceSpo2": "ไม่มี SpO2 ที่อุปกรณ์คำนวณเอง", + "@missingSignalDeviceSpo2": { + "description": "Sub-label on a device that cannot serve a metric because it does not report its own SpO2 figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." + }, + "wearableFlagRowSub": "อยู่ระหว่างทดลอง เมื่อเปิดจะใช้ข้อมูลจากอุปกรณ์นี้คำนวณค่าของคุณ", + "@wearableFlagRowSub": { + "description": "Developer settings: sub-label under a paired wearable or workout sensor's name. Turning it on lets its data feed the app's numbers (experimental until checked on real hardware)." + }, + "wearableFlagActive": "ใช้งานอยู่", + "@wearableFlagActive": { + "description": "Developer settings: value shown for the wearable that is on and is the one whose data fills the days the main band did not record." + }, + "signalSteps": "ก้าว", + "@signalSteps": { + "description": "Human name for an input signal: step counts the device made itself. Used as a section heading and screen-reader label." + }, + "signalSkinTempC": "อุณหภูมิผิว (°C)", + "@signalSkinTempC": { + "description": "Human name for an input signal: skin temperature in absolute degrees Celsius. Used as a section heading and screen-reader label." + }, + "signalActivityLevel": "กิจกรรม", + "@signalActivityLevel": { + "description": "Human name for an input signal: the device's own activity value per record. Used as a section heading and screen-reader label." + }, + "signalDeviceHrv": "HRV ของอุปกรณ์เอง", + "@signalDeviceHrv": { + "description": "Human name for an input signal: the device's own HRV figure. Used as a section heading and screen-reader label." + }, + "signalDeviceStages": "ระยะการนอนของอุปกรณ์เอง", + "@signalDeviceStages": { + "description": "Human name for an input signal: the device's own sleep stages. Used as a section heading and screen-reader label." + }, + "signalDeviceResp": "อัตราการหายใจของอุปกรณ์เอง", + "@signalDeviceResp": { + "description": "Human name for an input signal: the device's own breathing rate. Used as a section heading and screen-reader label." + }, + "signalDeviceStress": "ความเครียดของอุปกรณ์เอง", + "@signalDeviceStress": { + "description": "Human name for an input signal: the device's own stress figure. Used as a section heading and screen-reader label." + }, + "signalDeviceSpo2": "SpO2 ของอุปกรณ์เอง", + "@signalDeviceSpo2": { + "description": "Human name for an input signal: the device's own SpO2 figure. Used as a section heading and screen-reader label." + }, + "wearableSettingsGroup": "ค่าจากอุปกรณ์สวมใส่", + "@wearableSettingsGroup": { + "description": "Wearable numbers (wearable*): how a non-WHOOP wearable's metrics are presented, the one-line reasons a metric is not available, and what a wearable unlocks before pairing." + }, + "wearablePresentationRowTitle": "แสดง", + "wearablePresentationRowSub": "หนึ่งค่าต่อรายการ หรือแสดงค่าของเราคู่กับค่าของอุปกรณ์", + "wearablePresentationOneNumber": "ค่าเดียว", + "wearablePresentationSideBySide": "แสดงคู่กัน", + "wearableEstimatesRowTitle": "ค่าประมาณ", + "wearableEstimatesRowSub": "ค่าที่เราประมาณเมื่ออุปกรณ์ของคุณไม่มีข้อมูล", + "wearableOurs": "ของเรา", + "wearableEstimated": "ค่าประมาณ", + "wearableNotAvailable": "ไม่มีข้อมูล", + "wearableMethodHr1min": "อัตราการเต้นหัวใจราย 1 นาที", + "wearableMethodHr5min": "อัตราการเต้นหัวใจราย 5 นาที", + "wearableMethodDeviceStages": "ระยะการนอนของอุปกรณ์", + "wearableMethodSkinTemp": "อุณหภูมิผิว", + "wearableMethodRest": "ช่วงพักจากอัตราการเต้นหัวใจราย 5 นาที", + "wearableMethodRhrOnly": "อัตราการเต้นหัวใจขณะพักเท่านั้น", + "wearableMethodZoneMinutes": "นาทีในโซนอัตราการเต้นหัวใจ", + "wearableMethodActivity": "จำนวนก้าวราย 5 นาที", + "wearableMethodPartialComposite": "อัตราการเต้นหัวใจขณะพักและอุณหภูมิผิวเท่านั้น (บางส่วน)", + "wearableProvisional": "เบื้องต้น", + "wearableMethodStrap": "สายคาดวัดหัวใจ ทุกวินาที", + "wearableMethodStrapBeats": "ช่วงเวลาระหว่างจังหวะหัวใจจากสายคาด", + "wearableMethodRhrStrapComposite": "อัตราการเต้นหัวใจขณะพักและช่วงเวลาจังหวะหัวใจจากสายคาด", + "wearableMethodRingBeats": "ช่วงเวลาระหว่างจังหวะหัวใจของอุปกรณ์เอง", + "wearableUnlocksTitle": "สิ่งที่อุปกรณ์นี้ช่วยให้ใช้ได้", + "wearableUnlocksOurs": "เราเป็นผู้วัด", + "wearableUnlocksDevice": "ค่าของอุปกรณ์เอง พร้อมระบุที่มา", + "wearableUnlocksEstimated": "ค่าประมาณ พร้อมระบุ", + "wearableUnlocksStrap": "เราวัดร่วมกับการใช้สายคาด", + "wearableUnlocksNone": "ไม่มีข้อมูล", + "wearableDayTitle": "ค่าวันนี้", + "wearableDayRowSub": "ค่าที่เราวัดจากอุปกรณ์นี้ เทียบคู่กับค่าของอุปกรณ์เอง", + "wearableNotActiveTitle": "ไม่ใช่อุปกรณ์สวมใส่ที่ใช้งานอยู่", + "wearableNotActiveWhy": "ใช้ค่าจากอุปกรณ์สวมใส่ครั้งละหนึ่งชิ้น และยังไม่ได้เปิดใช้อุปกรณ์นี้", + "wearableUseThis": "ใช้อุปกรณ์นี้ (นักพัฒนา)", + "wearableNoDayTitle": "วันนี้ยังไม่มีข้อมูล", + "wearableNoDayWhy": "ยังไม่ได้คำนวณข้อมูลรายวันจากอุปกรณ์นี้", + "wearableBandDayTitle": "วันนี้มีข้อมูลจากสายรัดของคุณ", + "wearableBandDayWhy": "สายรัดบันทึกข้อมูลวันนี้แล้ว ค่าวันนี้จึงมาจากสายรัด ไม่ใช่อุปกรณ์นี้", + "wearableWhyEstimateHidden": "มีเพียงค่าประมาณ และซ่อนค่าประมาณไว้ในการตั้งค่า", + "wearableWhyNoNight": "ไม่มีข้อมูลรายคืนของวันนี้ที่เก็บไว้", + "wearableWhyNeedsThreeNights": "ต้องมีสามคืน", + "wearableWhyNoNightHr": "ไม่มีอัตราการเต้นหัวใจระหว่างคืน", + "wearableWhySkinTempNotDecoded": "ยังไม่ได้ถอดรหัสอุณหภูมิผิว", + "wearableWhyNeedsBeats": "ต้องมีช่วงเวลาระหว่างจังหวะหัวใจ", + "wearableWhyNoWakeHr": "ไม่มีอัตราการเต้นหัวใจขณะตื่น", + "wearableWhyNoWakeHrOrProfile": "ไม่มีอัตราการเต้นหัวใจขณะตื่น หรือไม่มีโปรไฟล์", + "wearableWhyNeedsStrap": "ต้องมีการออกกำลังกายร่วมกับสายคาด", + "wearableWhyNeedsHistory": "ต้องมีประวัติหนึ่งคืน", + "wearableWhyNeedsThreeDaysHr": "ต้องมีอัตราการเต้นหัวใจสามวัน", + "wearableWhyNeedsRhrBaseline": "ต้องมีอัตราการเต้นหัวใจขณะพักปกติของคุณ", + "wearableWhyNoHrDip": "ไม่พบอัตราการเต้นหัวใจลดลงต่อเนื่องระหว่างคืน", + "wearableWhyNoNightForNaps": "ไม่มีข้อมูลรายคืนสำหรับเทียบการพักตอนกลางวัน", + "wearableWhyNeedsThreeNightsTemp": "ต้องมีอุณหภูมิผิวสามคืน", + "wearableWhyTooSparseForWorkouts": "อัตราการเต้นหัวใจทุก 5 นาทีระบุช่วงออกกำลังกายไม่ได้", + "wearableRowSleepWindow": "ความยาวช่วงนอนกลางคืน", + "wearableRowEfficiency": "ประสิทธิภาพการนอน", + "wearableRowSleepStages": "หลับลึก", + "wearableRowNaps": "การงีบ", + "wearableRowSleepDebt": "หนี้การนอน", + "wearableRowRestingHr": "อัตราการเต้นหัวใจขณะพัก", + "wearableRowNadir": "อัตราการเต้นหัวใจต่ำสุดของคืน", + "wearableRowHrv": "HRV", + "wearableRowRespiratoryRate": "อัตราการหายใจ", + "wearableRowSpo2": "ออกซิเจนในเลือด", + "wearableRowStress": "ความเครียด", + "wearableRowSkinTemp": "อุณหภูมิผิว", + "wearableRowReadiness": "การฟื้นตัว", + "wearableRowIrregularRhythm": "จังหวะไม่สม่ำเสมอ", + "wearableRowSteps": "ก้าว", + "wearableRowStrain": "ความหนัก", + "wearableRowCalories": "แคลอรี", + "wearableRowMovement": "การเคลื่อนไหว", + "wearableRowAutoWorkouts": "การออกกำลังกายที่พบ", + "wearableRowHrr": "การฟื้นตัวของอัตราการเต้นหัวใจ", + "wearableRowBaselines": "HR ขณะพักปกติ", + "wearableRowSkinTempBaseline": "อุณหภูมิผิวปกติ", + "wearableRowCircadian": "จุดสูงสุดนาฬิกาชีวภาพ", + "wearableRowStrapWorkouts": "ออกกำลังกายร่วมกับสายคาด", + "wearableUnitBpm": "bpm", + "wearableUnitMs": "ms", + "wearableUnitPct": "%", + "wearableUnitKcal": "kcal", + "wearableUnitBrMin": "ครั้ง/นาที", + "wearableUnitHours": "ชม.", + "wearableUnitSd": "SD", + "wearableUnitCelsius": "°C", + "wearableUnitMin": "นาที", + "wearableSourceOurs": "จาก {device} ของคุณ · {method}", + "@wearableSourceOurs": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + }, + "method": { + "type": "String", + "example": "1-min heart rate" + } + } + }, + "wearableSourceOursPlain": "จาก {device} ของคุณ", + "@wearableSourceOursPlain": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableSourceStrap": "จาก{method}", + "@wearableSourceStrap": { + "description": "Source line under a value a workout strap measured, not the wearable; method names the strap (e.g. a strap's beat-to-beat intervals)", + "placeholders": { + "method": { + "type": "String", + "example": "a strap's beat-to-beat intervals" + } + } + }, + "wearableSourceDevice": "ค่าของ {device} ของคุณเอง", + "@wearableSourceDevice": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableSourceEstimated": "ประมาณจาก {device} ของคุณ · {method}", + "@wearableSourceEstimated": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + }, + "method": { + "type": "String", + "example": "1-min heart rate" + } + } + }, + "wearableSourceEstimatedPlain": "ประมาณจาก {device} ของคุณ", + "@wearableSourceEstimatedPlain": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableDetailDeviceSays": "{device} ของคุณรายงานว่า", + "@wearableDetailDeviceSays": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableDetailNoDeviceValue": "{device} ของคุณไม่มีค่าของตัวเองสำหรับรายการนี้", + "@wearableDetailNoDeviceValue": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableBand": "ในข้อมูลทดสอบ ค่านี้ต่างจากค่าเดียวกันที่คำนวณรายวินาทีเฉลี่ยประมาณ {band} แต่ละวันอาจต่างมากกว่านี้", + "@wearableBand": { + "description": "Confidence line under a wearable value: the method's measured mean absolute error against 1 Hz data, from a synthetic validation run. An average, not a per-day bound.", + "placeholders": { + "band": { + "type": "String", + "example": "1 bpm" + } + } + }, + "wearableBandTruth": "ในคืนทดสอบ ความยาวช่วงนี้ต่างจากเวลาบนเตียงจริงเฉลี่ยประมาณ {band} แต่ละคืนอาจต่างมากกว่านี้", + "@wearableBandTruth": { + "description": "Confidence line under a wearable's sleep window: the method's measured mean absolute error of the window's length against the time in bed the synthetic validation nights were built with (a length, not where the edges fall). An average, not a per-night bound.", + "placeholders": { + "band": { + "type": "String", + "example": "30 min" + } + } + }, + "wearableBandPartial": "ในข้อมูลทดสอบ คะแนนที่ใช้อัตราการเต้นหัวใจขณะพักอย่างเดียวต่างจากคะแนนบางส่วนแบบเดียวกันที่คำนวณรายวินาทีเฉลี่ยประมาณ {band} ไม่ได้เทียบกับคะแนนการฟื้นตัวเต็มรูปแบบ", + "@wearableBandPartial": { + "description": "Confidence line under the partial (resting-HR-only) readiness value: its measured mean absolute error against the same partial score from 1 Hz data, from a synthetic validation run.", + "placeholders": { + "band": { + "type": "String", + "example": "3" + } + } + }, + "wearableScoresTitle": "คะแนนของ {device} ของคุณเอง", + "@wearableScoresTitle": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoNightReading": "ไม่มีค่ารายคืนจาก {device} ของคุณ", + "@wearableWhyNoNightReading": { + "placeholders": { + "device": { + "type": "String", + "example": "Ultrahuman ring" + } + } + }, + "wearableWhyNoStagedNight": "{device} ของคุณไม่ได้แบ่งระยะการนอนคืนใด", + "@wearableWhyNoStagedNight": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoMovementData": "ต้องใช้ข้อมูลการเคลื่อนไหวที่ {device} ของคุณไม่ส่งให้", + "@wearableWhyNoMovementData": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoDeviceHrv": "ต้องใช้ช่วงเวลาระหว่างจังหวะหัวใจ แต่ {device} ของคุณไม่ได้ส่ง HRV", + "@wearableWhyNoDeviceHrv": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoDeviceResp": "{device} ของคุณไม่ได้ส่งข้อมูลการหายใจ", + "@wearableWhyNoDeviceResp": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoDeviceSpo2": "{device} ของคุณไม่ได้ส่งออกซิเจนในเลือด", + "@wearableWhyNoDeviceSpo2": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoDeviceStress": "{device} ของคุณไม่ได้ส่งความเครียด", + "@wearableWhyNoDeviceStress": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyReadinessRhrOnly": "ต้องใช้สองค่าจาก HRV, HR ขณะพัก การหายใจ และอุณหภูมิผิวที่เราวัด แต่ {device} ของคุณให้เราได้เพียง HR ขณะพัก", + "@wearableWhyReadinessRhrOnly": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoDeviceSteps": "{device} ของคุณไม่ได้ส่งจำนวนก้าว", + "@wearableWhyNoDeviceSteps": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoWake": "{device} ของคุณไม่รายงานการตื่น และเรายังระบุการตื่นจากอัตราการเต้นหัวใจรายนาทีไม่ได้", + "@wearableWhyNoWake": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNeverBeats": "ต้องใช้ช่วงเวลาระหว่างจังหวะหัวใจ ซึ่ง {device} ของคุณไม่มี", + "@wearableWhyNeverBeats": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNeverResp": "{device} ของคุณไม่มีข้อมูลการหายใจ", + "@wearableWhyNeverResp": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNeverSpo2": "{device} ของคุณไม่มีออกซิเจนในเลือด", + "@wearableWhyNeverSpo2": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNeverStress": "{device} ของคุณไม่มีความเครียด", + "@wearableWhyNeverStress": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNeverSkinTemp": "{device} ของคุณไม่มีอุณหภูมิผิว", + "@wearableWhyNeverSkinTemp": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNoMovementRecord": "{device} ของคุณไม่เก็บข้อมูลการเคลื่อนไหวที่เราถอดรหัสได้", + "@wearableWhyNoMovementRecord": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableScoreSleep": "คะแนนการนอน", + "@wearableScoreSleep": { + "description": "A device's own score, named on its page (wearableScore*). Never one of ours." + }, + "wearableScoreReadiness": "คะแนนความพร้อม", + "wearableScoreBodyBattery": "พลังงานร่างกาย", + "wearableScoreImpedance": "อิมพีแดนซ์ร่างกาย", + "wearableWhyNoDeviceNap": "{device} ของคุณไม่ได้บันทึกการงีบ", + "@wearableWhyNoDeviceNap": { + "placeholders": { + "device": { + "type": "String", + "example": "Garmin watch" + } + } + }, + "wearableWhyNotDecoded": "{device} ของคุณบันทึกข้อมูลที่ต้องใช้ แต่เรายังไม่ถอดรหัส", + "@wearableWhyNotDecoded": { + "placeholders": { + "device": { + "type": "String", + "example": "Oura Ring" + } + } + }, + "wearableWhyBeatsNotSeparated": "ยังไม่ได้คำนวณจากจังหวะหัวใจของ {device} เพราะแยกจังหวะจากสายคาดออกจากจังหวะของอุปกรณ์ในเวลากลางคืนไม่ได้", + "@wearableWhyBeatsNotSeparated": { + "placeholders": { + "device": { + "type": "String", + "example": "Oura Ring" + } + } + }, + "devicePickerBlurbThermometer": "บันทึกแต่ละค่าเป็นอุณหภูมิร่างกาย", + "@devicePickerBlurbThermometer": { + "description": "Device picker blurb under this device category." + }, + "devicePickerBlurbMiscaleBc": "บันทึกน้ำหนักที่นิ่งแล้วและอิมพีแดนซ์ชีวภาพแต่ละครั้ง รวมข้อมูลที่เก็บไว้", + "@devicePickerBlurbMiscaleBc": { + "description": "Device picker blurb under this device category." + }, + "devicePickerBlurbMiscale2": "บันทึกน้ำหนักที่นิ่งแล้วแต่ละครั้ง รวมข้อมูลที่เก็บไว้", + "@devicePickerBlurbMiscale2": { + "description": "Device picker blurb under this device category." + }, + "iosUninstallUnpairsWarning": "บน iOS การลบ OpenStrap จะยกเลิกการจับคู่สายรัดและเซ็นเซอร์ทั้งหมดที่จับคู่ที่นี่ออกจากโทรศัพท์ด้วย แอปอื่นรวมถึงแอปผู้ผลิตจะสูญเสียการจับคู่เหล่านั้นเช่นกัน", + "@iosUninstallUnpairsWarning": { + "description": "iOS only: AccessorySetupKit pairings are removed by iOS for all apps when OpenStrap is deleted." + }, + "logFoodEditTitle": "แก้ไขรายการนี้", + "@logFoodEditTitle": { + "description": "Log food sheet: title when editing an existing entry" + }, + "logFoodDateLabel": "วันที่", + "@logFoodDateLabel": { + "description": "Log food sheet: row label for the day the food was eaten" + }, + "logFoodTimeLabel": "เวลา", + "@logFoodTimeLabel": { + "description": "Log food sheet: row label for the time the food was eaten" + }, + "logFoodSearchLabel": "ค้นหาอาหารของคุณ", + "@logFoodSearchLabel": { + "description": "Log food sheet: label of the search field over past foods" + }, + "logFoodSearchHint": "อาหารที่คุณเคยบันทึก", + "@logFoodSearchHint": { + "description": "Log food sheet: hint in the search field over past foods" + }, + "logFoodSearchNoMatch": "ไม่มีอาหารที่คุณเคยบันทึกตรงกัน", + "@logFoodSearchNoMatch": { + "description": "Log food sheet: shown when the search over past foods finds nothing" + }, + "logFoodRemoveEntry": "ลบรายการนี้", + "@logFoodRemoveEntry": { + "description": "Log food sheet: button that removes the entry being edited" + }, + "nutritionProteinToday": "โปรตีนวันนี้", + "@nutritionProteinToday": { + "description": "Nutrition Today tab: label of the protein-versus-target card" + }, + "nutritionProteinToGo": "เหลืออีก {grams} ก.", + "@nutritionProteinToGo": { + "description": "Nutrition Today tab: grams of protein still needed to reach the target", + "placeholders": { + "grams": { + "type": "int" + } + } + }, + "nutritionTargetReached": "ถึงเป้าหมายแล้ว", + "@nutritionTargetReached": { + "description": "Nutrition Today tab: protein target met or exceeded" + }, + "dayTimelineZoomNoHr": "ไม่มีอัตราการเต้นหัวใจในช่วงนี้", + "@dayTimelineZoomNoHr": { + "description": "Shown in place of the zoomed day chart when the chosen window has no heart rate." + }, + "dayTimelineZoomPerMinute": "ค่าเฉลี่ยราย 1 นาที ลากจุดปรับเพื่อขยาย เมื่อช่วงไม่เกินสองชั่วโมงจะแสดงทุกวินาทีหากยังเก็บข้อมูลไว้", + "@dayTimelineZoomPerMinute": { + "description": "Footnote under the day heart-rate chart at per-minute resolution." + }, + "dayTimelineZoomPerMinuteOnly": "ค่าเฉลี่ยราย 1 นาที ไม่ได้เก็บค่ารายวินาทีของช่วงนี้ไว้แล้ว", + "@dayTimelineZoomPerMinuteOnly": { + "description": "Footnote when zoomed in but the per-second rows have been pruned." + }, + "dayTimelineZoomPerSecond": "ทุกวินาทีที่สายรัดบันทึก เก็บค่ารายวินาทีไว้เฉพาะวันล่าสุด", + "@dayTimelineZoomPerSecond": { + "description": "Footnote when the zoomed day chart shows per-second readings." + }, + "dataExportHeartRate": "ส่งออกอัตราการเต้นหัวใจรายนาที", + "@dataExportHeartRate": { + "description": "Data screen row: export per-minute heart rate as CSV." + }, + "dataExportHeartRateSub": "CSV หนึ่งไฟล์สำหรับวันที่เลือก มีค่าเฉลี่ย 1 นาทีของทุกนาทีที่บันทึก ข้อมูลรายวินาทีอยู่ในการส่งออกฐานข้อมูล", + "@dataExportHeartRateSub": { + "description": "Subtitle for the per-minute heart rate CSV export row." + }, + "dataHeartRateRangeHelp": "เก็บอัตราการเต้นหัวใจตั้งแต่ {first} ถึง {last}", + "@dataHeartRateRangeHelp": { + "description": "Date range picker heading for the heart rate export, naming the available range.", + "placeholders": { + "first": { + "type": "String" + }, + "last": { + "type": "String" + } + } + }, + "pairSensorUnreachableIos": "iPhone ให้แอปเข้าถึงเฉพาะเซ็นเซอร์ที่ปรากฏในหน้าต่างจับคู่ของระบบ ขณะนี้ยังแสดง {label} ที่นั่นไม่ได้ โปรดจับคู่บน Android ก่อน", + "@pairSensorUnreachableIos": { + "description": "Pairing a sensor iOS cannot reach through the system pairing sheet.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "sleepDetailStagedBy": "แบ่งระยะโดย {label}", + "@sleepDetailStagedBy": { + "description": "Pill naming the device whose own sleep staging is shown.", + "placeholders": { + "label": { + "type": "String" + } + } + }, + "sleepDetailDeviceMissingStages": "{label} ไม่รายงาน{stages} เวลานั้นจึงนับอยู่ในระยะอื่นของอุปกรณ์", + "@sleepDetailDeviceMissingStages": { + "description": "Note that a device cannot report some sleep stages; stages is a list of stage names.", + "placeholders": { + "label": { + "type": "String" + }, + "stages": { + "type": "String" + } + } + }, + "trendNormalForYou": "ปกติสำหรับคุณ", + "@trendNormalForYou": { + "description": "Trend verdict: the reading is inside the user's usual range." + }, + "trendAboveUsual": "สูงกว่าปกติ", + "@trendAboveUsual": { + "description": "Trend verdict: the reading is above the user's usual range." + }, + "trendBelowUsual": "ต่ำกว่าปกติ", + "@trendBelowUsual": { + "description": "Trend verdict: the reading is below the user's usual range." + }, + "trendVsUsual": "ต่างจากค่าปกติ {usual} อยู่ {diff}", + "@trendVsUsual": { + "description": "Difference between the reading and the centre of the user's usual range; diff is signed and formatted with its unit.", + "placeholders": { + "diff": { + "type": "String" + }, + "usual": { + "type": "String" + } + } + }, + "trendUsualRange": "ช่วงปกติ {lo}–{hi}{unit}", + "@trendUsualRange": { + "description": "The user's usual range in words; unit is empty or starts with a space.", + "placeholders": { + "lo": { + "type": "String" + }, + "hi": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "trendNeedsDays": "ช่วงปกติจะแสดงหลังมีข้อมูล {need} วัน ขณะนี้ {have} วัน", + "@trendNeedsDays": { + "description": "Short note shown instead of the usual-range band while there is not enough history.", + "placeholders": { + "need": { + "type": "int" + }, + "have": { + "type": "int" + } + } + }, + "monthGridLegendBetter": "ดีกว่าปกติ", + "@monthGridLegendBetter": { + "description": "Month grid legend: day outside the usual range in the good direction." + }, + "monthGridLegendUsual": "ปกติสำหรับคุณ", + "@monthGridLegendUsual": { + "description": "Month grid legend: day inside the usual range." + }, + "monthGridLegendWorse": "แย่กว่าปกติ", + "@monthGridLegendWorse": { + "description": "Month grid legend: day outside the usual range in the bad direction." + }, + "monthGridLegendOutside": "นอกช่วงปกติของคุณ", + "@monthGridLegendOutside": { + "description": "Month grid legend: day outside the usual range for a metric with no better direction." + }, + "monthGridRangeFootnote": "หนึ่งช่องต่อวัน แถบด้านบนหมายถึงสูงกว่าช่วงปกติ ด้านล่างหมายถึงต่ำกว่า ช่องที่มีแต่เส้นขอบคือไม่มีค่า", + "@monthGridRangeFootnote": { + "description": "Month grid footnote explaining the cell marks." + }, + "monthGridNoRangeTitle": "{title}: ยังไม่มีช่วงปกติ", + "@monthGridNoRangeTitle": { + "description": "Month grid: status card title when a metric has no usual range to colour its days against, e.g. 'Sleep: no usual range yet'.", + "placeholders": { + "title": { + "type": "String" + } + } + }, + "monthGridFlatBody": "ค่าของทุกวันใกล้เคียงกัน จึงยังไม่มีช่วงปกติให้เทียบวันใด", + "@monthGridFlatBody": { + "description": "Month grid: status card body when there is enough history but it is too flat to give a usual range." + }, + "monthGridRowSemantics": "{title}: มีค่า {have} จาก {total} วัน ต่ำกว่าช่วงปกติ {below} วัน และสูงกว่า {above} วัน", + "@monthGridRowSemantics": { + "description": "Screen-reader summary of one month grid row.", + "placeholders": { + "title": { + "type": "String" + }, + "have": { + "type": "int" + }, + "total": { + "type": "int" + }, + "below": { + "type": "int" + }, + "above": { + "type": "int" + } + } + }, + "zoneRowsRange": "{lo}–{hi} bpm", + "@zoneRowsRange": { + "description": "Heart-rate zone row: the zone's range in beats per minute.", + "placeholders": { + "lo": { + "type": "int" + }, + "hi": { + "type": "int" + } + } + }, + "zoneRowsRangeTop": "{lo}+ bpm", + "@zoneRowsRangeTop": { + "description": "Heart-rate zone row: the top zone, which has no upper edge.", + "placeholders": { + "lo": { + "type": "int" + } + } + }, + "zoneRowsMinutes": "{minutes} นาที", + "@zoneRowsMinutes": { + "description": "Heart-rate zone row: minutes spent in the zone.", + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "advancedTitle": "กราฟขั้นสูง", + "@advancedTitle": { + "description": "Title of the screen that holds the research charts, reached from Health." + }, + "advancedIntro": "มุมมองเพื่อการศึกษาจากข้อมูลเดิม ข้อมูลที่นี่ไม่เปลี่ยนคะแนนของคุณ", + "@advancedIntro": { + "description": "One-line introduction at the top of the Advanced charts screen." + }, + "advancedBeatsTitle": "ระหว่างจังหวะหัวใจ", + "@advancedBeatsTitle": { + "description": "Advanced charts screen: row opening the beat-to-beat charts." + }, + "advancedBeatsSub": "แต่ละจังหวะเทียบจังหวะก่อน HRV ตลอดคืน และความสามารถในการชะลออัตราการเต้นหัวใจ", + "@advancedBeatsSub": { + "description": "Advanced charts screen: what the beat-to-beat row contains." + }, + "advancedRhythmTitle": "เวลานอนและจังหวะประจำวัน", + "@advancedRhythmTitle": { + "description": "Advanced charts screen: row and screen title for the sleep-timing and daily-rhythm research charts." + }, + "advancedRhythmSub": "การนอนรายชั่วโมง ความแปรปรวนขณะนิ่ง และรูปแบบวันนี้ที่คาดการณ์", + "@advancedRhythmSub": { + "description": "Advanced charts screen: what the sleep-timing row contains." + }, + "healthAdvancedLinkTitle": "กราฟขั้นสูง", + "@healthAdvancedLinkTitle": { + "description": "Health tab: link row to the Advanced charts screen." + }, + "healthAdvancedLinkSub": "รายละเอียดระหว่างจังหวะหัวใจและเวลานอน สำหรับผู้สนใจ", + "@healthAdvancedLinkSub": { + "description": "Health tab: subtitle of the link row to the Advanced charts screen." + }, + "tabToday": "วันนี้", + "@tabToday": { + "description": "Bottom tab: today's scores and plan." + }, + "tabSleep": "การนอน", + "@tabSleep": { + "description": "Bottom tab: last night, sleep plan, alarm and body clock." + }, + "tabActivity": "กิจกรรม", + "@tabActivity": { + "description": "Bottom tab: workouts, steps and food. Also the Activity screen title." + }, + "profileBandBattery": "สายรัด {pct}%", + "@profileBandBattery": { + "description": "Profile devices row: the band's battery level.", + "placeholders": { + "pct": { + "type": "int" + } + } + }, + "profileExportRow": "ส่งออกและสำรองข้อมูล", + "@profileExportRow": { + "description": "Profile row: open export, backup and import." + }, + "profileExportRowSub": "สเปรดชีต สำเนาครบชุด และการนำเข้าประวัติ", + "@profileExportRowSub": { + "description": "Subtitle of the export row on Profile." + }, + "profileSettingsRow": "การตั้งค่า", + "@profileSettingsRow": { + "description": "Profile row: open Settings." + }, + "profileSettingsRowSub": "สายรัด แอป ข้อมูล ความเป็นส่วนตัว และขั้นสูง", + "@profileSettingsRowSub": { + "description": "Subtitle of the Settings row on Profile: its groups." + }, + "settingsGroupApp": "แอป", + "@settingsGroupApp": { + "description": "Settings group: notifications, units, appearance, time format, cycle tracking." + }, + "settingsGroupData": "ข้อมูล", + "@settingsGroupData": { + "description": "Settings group: export, health app sync, phone steps." + }, + "settingsGroupAdvanced": "ขั้นสูง", + "@settingsGroupAdvanced": { + "description": "Settings group: automation and other rarely changed settings." + }, + "settingsCycleTrackingRowSubHealth": "เพิ่มรอบเดือนในสุขภาพ เมื่อปิดจะซ่อนและเก็บข้อมูลที่บันทึกไว้", + "@settingsCycleTrackingRowSubHealth": { + "description": "Subtitle of the cycle tracking switch." + }, + "sleepTabPlanTitle": "แผนการนอนของคุณ", + "@sleepTabPlanTitle": { + "description": "Sleep tab section: sleep need, debt and target bedtime." + }, + "sleepTabMoreTitle": "นาฬิกาปลุกและนาฬิกาชีวภาพ", + "@sleepTabMoreTitle": { + "description": "Sleep tab section with links to the alarm and the body clock." + }, + "healthWellbeingTitle": "จิตใจ นิสัย และยา", + "@healthWellbeingTitle": { + "description": "Health tab section with doors to mind, habits, medication and cycle." + }, + "healthWellbeingMindSub": "การหายใจ อารมณ์ และบันทึกประจำวัน", + "@healthWellbeingMindSub": { + "description": "Health tab: subtitle of the Mind door." + }, + "healthWellbeingHabitsSub": "นิสัยประจำวัน นับจำนวนวันที่ทำได้", + "@healthWellbeingHabitsSub": { + "description": "Health tab: subtitle of the Habits door." + }, + "healthWellbeingMedsSub": "ยาวันนี้และสัปดาห์ที่ผ่านมา", + "@healthWellbeingMedsSub": { + "description": "Health tab: subtitle of the Medication door." + }, + "healthWellbeingCycleSub": "บันทึกประจำเดือนและดูวันปัจจุบันในรอบ", + "@healthWellbeingCycleSub": { + "description": "Health tab: subtitle of the Cycle door." + }, + "activityStepsFoodTitle": "ก้าวและอาหาร", + "@activityStepsFoodTitle": { + "description": "Activity tab section with doors to steps and nutrition." + }, + "activityStepsSub": "วันนี้และทุกวันก่อนหน้า", + "@activityStepsSub": { + "description": "Activity tab: subtitle of the Steps door." + }, + "activityNutritionSub": "บันทึกอาหารและดูโปรตีนวันนี้", + "@activityNutritionSub": { + "description": "Activity tab: subtitle of the Nutrition door." + }, + "homeBackToToday": "กลับไปวันนี้", + "@homeBackToToday": { + "description": "Today tab: button shown after stepping back to an earlier day." + }, + "homeSomeDataMissingTitle": "ข้อมูลบางส่วนของวันนี้ขาดหาย", + "@homeSomeDataMissingTitle": { + "description": "Today tab: one card listing every missing reading and why." + }, + "homeFirstWeekTitle": "สัปดาห์แรก ๆ ของคุณ", + "@homeFirstWeekTitle": { + "description": "Today tab: card saying when each score first appears." + }, + "homeFirstWeekWear": "สวมสายรัดคืนนี้", + "@homeFirstWeekWear": { + "description": "First weeks card step." + }, + "homeFirstWeekSleep": "การนอน: เช้าหลังคืนแรก", + "@homeFirstWeekSleep": { + "description": "First weeks card step." + }, + "homeFirstWeekStrain": "ความหนัก: เริ่มวันที่ {day}", + "@homeFirstWeekStrain": { + "description": "First weeks card step. day is the first day strain can be scored.", + "placeholders": { + "day": { + "type": "int" + } + } + }, + "homeFirstWeekRecovery": "การฟื้นตัว: เริ่มคืนที่ {night} เมื่อเรียนรู้ค่าปกติของคุณแล้ว", + "@homeFirstWeekRecovery": { + "description": "First weeks card step. night is the first night recovery can be scored.", + "placeholders": { + "night": { + "type": "int" + } + } + }, + "homeFirstWeekSoFar": "{count, plural, =1{บันทึกแล้ว 1 วัน} other{บันทึกแล้ว {count} วัน}}", + "@homeFirstWeekSoFar": { + "description": "First weeks card footer.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeFirstWeekDone": "เสร็จแล้ว: {step}", + "@homeFirstWeekDone": { + "description": "Screen-reader label for a finished first-weeks step.", + "placeholders": { + "step": { + "type": "String" + } + } + }, + "homeCoachSetUpChip": "ถามเกี่ยวกับข้อมูลของคุณ: ตั้งค่าโค้ช", + "@homeCoachSetUpChip": { + "description": "Today tab chip when no coach model is configured." + }, + "profileSetupCycleSub": "บันทึกประจำเดือนในสุขภาพ เปลี่ยนภายหลังได้", + "@profileSetupCycleSub": { + "description": "Onboarding: subtitle of the cycle tracking switch." + }, + "homeRecoverySleeping": "กำลังนอน…", + "@homeRecoverySleeping": { + "description": "Recovery ring value while last night is still in progress (no confirmed wake yet)." + }, + "homeRecoveryAfterWake": "คำนวณคะแนนการฟื้นตัวหลังคุณตื่น", + "@homeRecoveryAfterWake": { + "description": "Why the recovery ring has no number while the night is still in progress." + }, + "homeRecoveryFinishingUp": "กำลังดำเนินการขั้นสุดท้าย", + "@homeRecoveryFinishingUp": { + "description": "Caption under a greyed, provisional recovery number: wake detected, the night's data is still arriving." + }, + "homeRecoveryUpdated": "อัปเดต {time} · {from} → {to}", + "@homeRecoveryUpdated": { + "description": "Quiet note when today's recovery changed after it was first shown (re-analysis or late sync).", + "placeholders": { + "time": { + "type": "String" + }, + "from": { + "type": "int" + }, + "to": { + "type": "int" + } + } + }, + "dataRecoveryChanged": "การฟื้นตัวเปลี่ยนไป: {list}", + "@dataRecoveryChanged": { + "description": "After re-analysis, the days whose recovery changed, e.g. 'Oct 8 2 → 28, Oct 6 40 → 44'.", + "placeholders": { + "list": { + "type": "String" + } + } + }, + "deviceUseScoresTitle": "ใช้อุปกรณ์นี้คำนวณคะแนน", + "@deviceUseScoresTitle": { + "description": "Device page: switch title on a paired non-WHOOP wearable. On makes it the wearable the app's scores come from." + }, + "deviceUseWorkoutsTitle": "ใช้ระหว่างออกกำลังกาย", + "@deviceUseWorkoutsTitle": { + "description": "Device page: switch title on a paired heart-rate strap. On uses its data during workouts." + }, + "deviceUseReadingsTitle": "ใช้ค่าที่อ่านได้ (น้ำหนัก) ในค่าของคุณ", + "@deviceUseReadingsTitle": { + "description": "Device page: switch title on a paired scale. On uses its weighings in the app's numbers." + }, + "deviceUseBeta": "เบตา", + "@deviceUseBeta": { + "description": "Small chip beside a device's use switch, marking the feature as beta." + }, + "deviceUseBetaSub": "อยู่ระหว่างทดลอง ยังไม่ได้ตรวจสอบคะแนนจากอุปกรณ์นี้กับฮาร์ดแวร์จริง", + "@deviceUseBetaSub": { + "description": "Device page: one-line note under the beta use switch." + }, + "deviceUseWorking": "กำลังอัปเดตข้อมูลรายวัน…", + "@deviceUseWorking": { + "description": "Device page: shown under the use switch while past days are being recalculated after it was flipped." + }, + "deviceUseSheetTitle": "ใช้ {device} คำนวณคะแนนหรือไม่?", + "@deviceUseSheetTitle": { + "description": "Confirmation sheet title before a wearable starts feeding scores.", + "placeholders": { + "device": { + "type": "String" + } + } + }, + "deviceUseSheetWhat": "จะใช้อุปกรณ์นี้เป็นแหล่งคำนวณคะแนน และคำนวณวันเก่าที่มีข้อมูลอุปกรณ์นี้ใหม่ บางค่าเป็นค่าประมาณและมีป้ายระบุ", + "@deviceUseSheetWhat": { + "description": "Confirmation sheet: what turning a wearable on does." + }, + "deviceUseSheetSwitch": "ใช้ได้ครั้งละหนึ่งอุปกรณ์ จึงจะปิด {other}", + "@deviceUseSheetSwitch": { + "description": "Confirmation sheet: shown when another wearable is feeding scores now; it stops when this one starts.", + "placeholders": { + "other": { + "type": "String" + } + } + }, + "deviceUseSheetOff": "ปิดได้ทุกเมื่อ จากนั้นข้อมูลที่อุปกรณ์นี้เพิ่มเข้ามาจะถูกนำออก", + "@deviceUseSheetOff": { + "description": "Confirmation sheet: the switch can be turned off, and the device's contribution is removed." + }, + "deviceUseSheetConfirm": "ใช้อุปกรณ์นี้", + "@deviceUseSheetConfirm": { + "description": "Confirmation sheet: confirm button." + }, + "deviceUseSheetCancel": "ไว้ก่อน", + "@deviceUseSheetCancel": { + "description": "Confirmation sheet: cancel button." + }, + "settingsReportIssueRowTitle": "รายงานปัญหา", + "@settingsReportIssueRowTitle": { + "description": "Settings row that opens the issue report screen." + }, + "settingsReportIssueRowSub": "ส่งสิ่งที่คุณเลือกให้ผู้ดูแล ข้อมูลของคุณจะเข้ารหัส แต่รายละเอียดรายงานไม่เข้ารหัส", + "@settingsReportIssueRowSub": { + "description": "Settings row subtitle for Report an issue." + }, + "reportNavTitle": "รายงานปัญหา", + "@reportNavTitle": { + "description": "Issue report screen title." + }, + "reportCategoryGroup": "ประเภทปัญหา", + "@reportCategoryGroup": { + "description": "Issue report: heading over the category choices." + }, + "reportCategorySync": "การซิงค์", + "@reportCategorySync": { + "description": "Issue report category." + }, + "reportCategorySleep": "การนอน", + "@reportCategorySleep": { + "description": "Issue report category." + }, + "reportCategoryRecovery": "การฟื้นตัว", + "@reportCategoryRecovery": { + "description": "Issue report category." + }, + "reportCategoryWorkout": "ออกกำลังกาย", + "@reportCategoryWorkout": { + "description": "Issue report category." + }, + "reportCategoryPairing": "การจับคู่", + "@reportCategoryPairing": { + "description": "Issue report category." + }, + "reportCategoryOther": "อื่น ๆ", + "@reportCategoryOther": { + "description": "Issue report category." + }, + "reportTitleLabel": "หัวข้อ", + "@reportTitleLabel": { + "description": "Issue report: title field label." + }, + "reportTitleHint": "สรุปปัญหาในหนึ่งบรรทัด", + "@reportTitleHint": { + "description": "Issue report: title field hint." + }, + "reportDescriptionLabel": "สิ่งที่เกิดขึ้น", + "@reportDescriptionLabel": { + "description": "Issue report: description field label." + }, + "reportDescriptionHint": "คุณทำอะไร คาดหวังอะไร และพบอะไร", + "@reportDescriptionHint": { + "description": "Issue report: description field hint." + }, + "reportAttachGroup": "ไฟล์แนบ", + "@reportAttachGroup": { + "description": "Issue report: heading over screenshot and database options." + }, + "reportScreenshotRow": "เพิ่มภาพหน้าจอ", + "@reportScreenshotRow": { + "description": "Issue report: pick a screenshot." + }, + "reportScreenshotRemove": "ลบภาพหน้าจอ", + "@reportScreenshotRemove": { + "description": "Issue report: remove the picked screenshot." + }, + "reportDatabaseRow": "แนบข้อมูลสุขภาพ 2 สัปดาห์ล่าสุด", + "@reportDatabaseRow": { + "description": "Issue report: switch to attach the database. Off by default." + }, + "reportDatabaseWarning": "การนอน อัตราการเต้นหัวใจ และข้อมูลสุขภาพอื่นใน 14 วันล่าสุด (ข้อมูลรายวินาทีอาจมีน้อยวันกว่านี้หากรายงานใหญ่เกินไป) พร้อมคะแนนรายวันและการตั้งค่า ส่งเฉพาะเมื่อเปิดตัวเลือกนี้ และเซิร์ฟเวอร์ลบหลัง 14 วัน รายงานที่แนบข้อมูลสุขภาพอาจใหญ่ถึง 95 MB ควรใช้ Wi-Fi หากทำได้", + "@reportDatabaseWarning": { + "description": "Issue report: plain warning under the database switch." + }, + "reportIncludedGroup": "ข้อมูลที่รวมอยู่", + "@reportIncludedGroup": { + "description": "Issue report: heading over the list of files in the report." + }, + "reportIncludedNote": "หมวดหมู่ หัวข้อ คำอธิบาย เวอร์ชันแอป แพลตฟอร์ม เวอร์ชันระบบ รุ่นโทรศัพท์ รหัสการติดตั้ง และสถานะการแนบฐานข้อมูลหรือภาพหน้าจอจะส่งโดยไม่เข้ารหัสเพื่อติดตามรายงาน และเก็บไว้ 90 วัน ข้อมูลอื่นทั้งหมดเข้ารหัสบนโทรศัพท์ก่อนส่ง มีเพียงผู้ดูแลที่อ่านได้ และลบหลัง 30 วัน หรือ 14 วันหากแนบฐานข้อมูล ส่วน “แชร์ในเครื่อง” ต่างกัน ไฟล์ ZIP ที่ส่งให้หน้าต่างแชร์ไม่เข้ารหัส", + "@reportIncludedNote": { + "description": "Issue report: note under the file list." + }, + "reportFileManifest": "รายการไฟล์นี้", + "@reportFileManifest": { + "description": "Issue report file description: manifest.json." + }, + "reportFileMeta": "เวอร์ชันแอป รุ่นโทรศัพท์ เวอร์ชันระบบ ภาษา เขตเวลา และรหัสการติดตั้งแบบสุ่ม", + "@reportFileMeta": { + "description": "Issue report file description: meta.json." + }, + "reportFileDevice": "สายรัดและเซ็นเซอร์ที่จับคู่: ประเภท การเชื่อมต่อ แบตเตอรี่ และเวลาซิงค์ล่าสุด", + "@reportFileDevice": { + "description": "Issue report file description: device.json." + }, + "reportFileState": "สถานะซิงค์และการคำนวณคะแนน พร้อมข้อผิดพลาดล่าสุด", + "@reportFileState": { + "description": "Issue report file description: state.json." + }, + "reportFileSyncLog": "บันทึกการซิงค์ล่าสุดของแอป", + "@reportFileSyncLog": { + "description": "Issue report file description: logs/sync.log." + }, + "reportFileTelemetry": "ข้อผิดพลาดและเหตุการณ์ที่โทรศัพท์บันทึกใน 7 วันล่าสุด", + "@reportFileTelemetry": { + "description": "Issue report file description: logs/telemetry.json." + }, + "reportFileUser": "หมวดหมู่ หัวข้อ และคำอธิบายของคุณ", + "@reportFileUser": { + "description": "Issue report file description: user.txt." + }, + "reportFileScreenshot": "ภาพหน้าจอที่คุณเลือก", + "@reportFileScreenshot": { + "description": "Issue report file description: the screenshot." + }, + "reportFileDatabase": "ฐานข้อมูลสุขภาพทั้งหมดของคุณ แบบบีบอัด", + "@reportFileDatabase": { + "description": "Issue report file description: database.db.gz." + }, + "reportFileDatabaseSlice": "ข้อมูลสุขภาพ 14 วันล่าสุด พร้อมคะแนนรายวันและการตั้งค่า แบบบีบอัด", + "@reportFileDatabaseSlice": { + "description": "Issue report file description: database_14d.db.gz." + }, + "reportFullDatabaseRow": "ฐานข้อมูลสุขภาพทั้งหมด (แชร์ในเครื่องเท่านั้น)", + "@reportFullDatabaseRow": { + "description": "Issue report: switch to put the whole database in the locally shared file. Off by default; never uploaded." + }, + "reportFullDatabaseWarning": "ประวัติสุขภาพทั้งหมดของคุณ รวมเฉพาะในไฟล์ที่สร้างด้วย “แชร์ในเครื่อง” ไม่ส่งไปเซิร์ฟเวอร์ของเรา", + "@reportFullDatabaseWarning": { + "description": "Issue report: plain line under the full database switch." + }, + "reportFullDatabaseNoUpload": "ฐานข้อมูลทั้งหมดใหญ่เกินกว่าจะอัปโหลด ใช้ “แชร์ในเครื่อง” แล้วส่งไฟล์ให้เรา", + "@reportFullDatabaseNoUpload": { + "description": "Issue report: shown under Create ticket while the full database switch is on (Create ticket is disabled)." + }, + "reportDatabaseCovered": "รวมอยู่ในฐานข้อมูลทั้งหมดด้านล่างแล้ว", + "@reportDatabaseCovered": { + "description": "Issue report: line under the 2-week switch while the full database switch is on." + }, + "reportStageSlice": "กำลังเตรียมข้อมูล 2 สัปดาห์ล่าสุด…", + "@reportStageSlice": { + "description": "Report screen: progress text inside the busy button while the 2-week database is built." + }, + "reportSend": "สร้างรายงานปัญหา", + "@reportSend": { + "description": "Issue report: send button." + }, + "reportSaveInstead": "แชร์ในเครื่อง", + "@reportSaveInstead": { + "description": "Issue report: save the archive on the phone, nothing sent." + }, + "reportNeedTitle": "เพิ่มหัวข้อก่อน", + "@reportNeedTitle": { + "description": "Issue report: shown when sending without a title." + }, + "reportSentTitle": "สร้างรายงานปัญหาแล้ว", + "@reportSentTitle": { + "description": "Issue report: success card title." + }, + "reportSentBody": "รหัสรายงานปัญหาของคุณคือ {id} โปรดแจ้งรหัสนี้เมื่อติดต่อเราเรื่องนี้", + "@reportSentBody": { + "description": "Issue report: success card body with the report ID.", + "placeholders": { + "id": { + "type": "String" + } + } + }, + "reportCopyId": "คัดลอกรหัส", + "@reportCopyId": { + "description": "Issue report: copy the report ID." + }, + "reportNotSentTitle": "ยังไม่ได้สร้างรายงานปัญหา", + "@reportNotSentTitle": { + "description": "Issue report: failure card title." + }, + "reportTooLarge": "รายงานนี้ใหญ่เกินกว่าจะอัปโหลด ใช้ “แชร์ในเครื่อง” แล้วส่งไฟล์ให้เรา หรือปิดการแนบข้อมูลสุขภาพหรือลบภาพหน้าจอ", + "@reportTooLarge": { + "description": "Issue report: 413 or local size check." + }, + "reportRateLimited": "วันนี้คุณสร้างรายงานปัญหาแล้ว 3 รายการ ลองใหม่พรุ่งนี้ หรือแชร์รายการนี้ในเครื่องแทน", + "@reportRateLimited": { + "description": "Issue report: 429." + }, + "reportStorageFull": "ขณะนี้เซิร์ฟเวอร์รายงานไม่มีพื้นที่เก็บฐานข้อมูล คุณสร้างรายงานโดยไม่แนบฐานข้อมูลได้", + "@reportStorageFull": { + "description": "Issue report: 507 storage full." + }, + "reportSendWithoutDb": "สร้างรายงานโดยไม่แนบฐานข้อมูล", + "@reportSendWithoutDb": { + "description": "Issue report: resend after 507." + }, + "reportSendFailed": "สร้างรายงานปัญหาไม่ได้ ตรวจสอบการเชื่อมต่อ หรือแชร์ในเครื่องแทน", + "@reportSendFailed": { + "description": "Issue report: network or server error." + }, + "reportMyReportsGroup": "รายงานของฉัน", + "@reportMyReportsGroup": { + "description": "Issue report: heading over reports sent from this phone." + }, + "reportMyReportsSub": "แตะเพื่อลบทันที มิฉะนั้นจะลบวันที่ {date}", + "@reportMyReportsSub": { + "description": "Issue report: row subtitle for a sent report.", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "reportDelete": "ลบ", + "@reportDelete": { + "description": "Issue report: delete a sent report." + }, + "reportDeleteFailed": "ลบไม่ได้ ลองอีกครั้งภายหลัง", + "@reportDeleteFailed": { + "description": "Issue report: delete failed." + }, + "reportDeleteConfirmTitle": "ลบรายงาน {id} หรือไม่?", + "@reportDeleteConfirmTitle": { + "description": "Issue report: confirm before deleting a sent report.", + "placeholders": { + "id": { + "type": "String" + } + } + }, + "reportDeleteConfirmBody": "จะลบจากเซิร์ฟเวอร์ทันที และรหัสจะเปิดรายงานไม่ได้อีก ย้อนกลับไม่ได้", + "@reportDeleteConfirmBody": { + "description": "Issue report: what deleting a sent report does." + }, + "reportSaveFailedTitle": "แชร์รายงานไม่ได้", + "@reportSaveFailedTitle": { + "description": "Report screen: title of the card shown when building or sharing the local zip failed. Nothing was sent." + }, + "reportSaveFailedBody": "เกิดข้อผิดพลาดขณะสร้างหรือแชร์ไฟล์ ไม่ได้สร้างรายงานปัญหา", + "@reportSaveFailedBody": { + "description": "Report screen: body of the save-failed card." + }, + "reportSaveRetry": "ลองอีกครั้ง", + "@reportSaveRetry": { + "description": "Report screen: button that retries saving the report locally." + }, + "reportStageCollecting": "กำลังรวบรวมข้อมูลแอป…", + "@reportStageCollecting": { + "description": "Report screen: progress text inside the busy button." + }, + "reportStageLogs": "กำลังอ่านบันทึก…", + "@reportStageLogs": { + "description": "Report screen: progress text inside the busy button." + }, + "reportStageDatabase": "กำลังบีบอัดฐานข้อมูล…", + "@reportStageDatabase": { + "description": "Report screen: progress text inside the busy button." + }, + "reportStagePacking": "กำลังรวมไฟล์…", + "@reportStagePacking": { + "description": "Report screen: progress text inside the busy button." + }, + "reportStageEncrypting": "กำลังเข้ารหัส…", + "@reportStageEncrypting": { + "description": "Report screen: progress text inside the busy button." + }, + "reportStageUploading": "กำลังอัปโหลด {size} MB…", + "@reportStageUploading": { + "description": "Report screen: progress text inside the busy button, with the ticket size in megabytes (e.g. 64 or 0.4).", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "reportStageSharing": "กำลังเตรียมแชร์…", + "@reportStageSharing": { + "description": "Report screen: progress text inside the busy button." + }, + "homeRecoveryStartsIn": "{count, plural, =1{เริ่มแสดงการฟื้นตัวในอีก 1 คืน} other{เริ่มแสดงการฟื้นตัวในอีก {count} คืน}}", + "@homeRecoveryStartsIn": { + "description": "First weeks card step: live countdown until recovery can first be scored. count is the number of nights still needed.", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "healthWellbeingAllSub": "การหายใจ อารมณ์ บันทึกประจำวัน นิสัย และยา", + "@healthWellbeingAllSub": { + "description": "Health tab: subtitle of the single door into the wellness screen (mind, habits, medication, cycle tabs)." + }, + "healthWellbeingAllSubCycle": "การหายใจ อารมณ์ บันทึกประจำวัน นิสัย ยา และรอบเดือน", + "@healthWellbeingAllSubCycle": { + "description": "Health tab: subtitle of the wellness door when cycle tracking is on (the Cycle tab is shown)." + }, + "reportIdCopied": "คัดลอก {id} แล้ว", + "@reportIdCopied": { + "description": "Snackbar after copying the ticket ID on the report screen.", + "placeholders": { + "id": { + "type": "String" + } + } + }, + "dataReanalyzeFailed": "วิเคราะห์ใหม่ไม่สำเร็จ: {error}", + "@dataReanalyzeFailed": { + "description": "Re-analyze result: the pass itself failed.", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "dataReanalyzeDaysFailed": "{n, plural, other{วิเคราะห์ไม่ได้ {n} วัน หากเกิดซ้ำ โปรดรายงานปัญหา}}", + "@dataReanalyzeDaysFailed": { + "description": "Re-analyze result: N days could not be derived.", + "placeholders": { + "n": { + "type": "int" + } + } + }, + "napsInFuture": "การงีบนั้นยังไม่สิ้นสุด บันทึกเมื่อตื่นแล้ว", + "@napsInFuture": { + "description": "Validation error when a manually logged nap ends after the current time." + }, + "journalComposeEntrySaveFailed": "ยังไม่บันทึก ข้อมูลที่กรอกยังอยู่ที่นี่ โปรดลองอีกครั้ง", + "@journalComposeEntrySaveFailed": { + "description": "Snackbar shown when saving the day's journal entry fails; the screen stays open with the entry intact." + }, + "journalComposeLoadFailed": "เปิดบันทึกประจำวันของวันนี้ไม่ได้", + "@journalComposeLoadFailed": { + "description": "Shown in place of the journal form when reading the day's entry fails." + }, + "journalComposeTryAgain": "ลองอีกครั้ง", + "@journalComposeTryAgain": { + "description": "Button that retries loading the journal entry after a failure." + }, + "journalComposeAddToJournal": "เพิ่มในบันทึกประจำวัน", + "@journalComposeAddToJournal": { + "description": "Journal AI chat sheet: primary button that copies the proposed tags and note into the day's entry." + }, + "workoutLoadFailedTitle": "อ่านข้อมูลกิจกรรมไม่ได้", + "@workoutLoadFailedTitle": { + "description": "Title of the card shown on the Activity tab when the sessions failed to load from the database." + }, + "workoutLoadFailedBody": "โหลดการออกกำลังกายไม่สำเร็จ ไม่มีการลบข้อมูล เป็นข้อผิดพลาดในการอ่าน ไม่ใช่ข้อมูลสูญหาย", + "@workoutLoadFailedBody": { + "description": "Body of the card shown on the Activity tab when the sessions failed to load from the database." + }, + "liveHrNoReadingTitle": "ไม่มีค่าที่วัดสด", + "liveHrNotPairedWhy": "ยังไม่ได้จับคู่สายรัด", + "liveHrNotPairedFix": "จับคู่จากโปรไฟล์เพื่ออ่านจังหวะหัวใจสด", + "liveHrNotConnectedWhy": "สายรัดของคุณไม่ได้เชื่อมต่อ", + "liveHrNotConnectedFix": "จังหวะหัวใจสดต้องมีการเชื่อมต่อ แอปจะเชื่อมต่อเมื่อเปิดโดยมีสายรัดอยู่ในระยะ", + "liveHrNoRecentBeatWhy": "ไม่มีจังหวะหัวใจใน {seconds} วินาทีล่าสุด", + "@liveHrNoRecentBeatWhy": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "liveHrStreamingFix": "สายรัดสตรีมข้อมูลขณะสวมที่ข้อมือและเปิดแอปอยู่", + "liveHrTraceCaption": "{count} ค่าล่าสุด — {min}–{max} bpm ไม่ได้เก็บข้อมูลนี้ เป็นสตรีมสด ไม่ใช่บันทึกประจำวัน", + "@liveHrTraceCaption": { + "placeholders": { + "count": { + "type": "int" + }, + "min": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "notifRecoveryReadyBody": "การฟื้นตัว {score}", + "@notifRecoveryReadyBody": { + "description": "OS notification body when the day's recovery score is ready.", + "placeholders": { + "score": { + "type": "int" + } + } + }, + "notifRecoveryReadySleptBody": "การฟื้นตัว {score} นอน {hours} ชม. {minutes} นาที", + "@notifRecoveryReadySleptBody": { + "description": "OS notification body when the day's recovery score is ready, with last night's sleep time.", + "placeholders": { + "score": { + "type": "int" + }, + "hours": { + "type": "int" + }, + "minutes": { + "type": "int" + } + } + }, + "notifStepGoalBody": "คุณเดินประมาณ {steps} ก้าว ถึงหรือเกินเป้าหมาย {goal} ก้าวแล้ว", + "@notifStepGoalBody": { + "description": "OS notification body when the day's step estimate reaches the goal.", + "placeholders": { + "steps": { + "type": "int" + }, + "goal": { + "type": "int" + } + } + }, + "notifLowBatteryBody": "แบตเตอรี่สายรัดเหลือ {percent}% ควรชาร์จเร็ว ๆ นี้", + "@notifLowBatteryBody": { + "description": "OS notification body when the band's battery is low.", + "placeholders": { + "percent": { + "type": "int" + } + } + }, + "profileImplausibleFields": "ตรวจสอบ {fields}: อยู่นอกช่วง จึงยังไม่ได้บันทึก", + "@profileImplausibleFields": { + "description": "Shown when a typed age, height or weight is outside the believable range.", + "placeholders": { + "fields": { + "type": "String" + } + } + }, + "notifBatteryForecastBeforeWakeBody": "หากลด {rate}%/ชม. จะหมดประมาณ {time} ก่อนคุณตื่น ชาร์จตอนนี้เพื่อเก็บข้อมูลการนอนคืนนี้", + "@notifBatteryForecastBeforeWakeBody": { + "description": "OS notification body when the band is forecast to run flat before the user wakes. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", + "placeholders": { + "rate": { + "type": "String" + }, + "time": { + "type": "String" + } + } + }, + "notifBatteryForecastReserveBody": "หากลด {rate}%/ชม. จะหมดประมาณ {time} หลังเวลาตื่นปกติเล็กน้อย ตอนลุกจะเหลือราว {left}% ชาร์จตอนนี้เพื่อเก็บข้อมูลการนอนคืนนี้", + "@notifBatteryForecastReserveBody": { + "description": "OS notification body when the band is forecast to wake with almost no charge left. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", + "placeholders": { + "rate": { + "type": "String" + }, + "time": { + "type": "String" + }, + "left": { + "type": "int" + } + } + }, + "notifBatteryForecastAfterWakeBody": "หากลด {rate}%/ชม. จะหมดประมาณ {time} หลังเวลาตื่นปกติ", + "@notifBatteryForecastAfterWakeBody": { + "description": "OS notification body when the band's battery forecast lasts past the usual wake time. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", + "placeholders": { + "rate": { + "type": "String" + }, + "time": { + "type": "String" + } + } + }, + "notifWindDownBody": "เวลาเข้านอนของคุณประมาณ {time} เริ่มผ่อนคลายได้แล้ว", + "@notifWindDownBody": { + "description": "OS notification body for the wind-down reminder. time is a clock time, already formatted.", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "notifWorkoutIdleBody": "ไม่พบการออกแรงเกินระดับพักมา {minutes} นาที หากจบแล้ว ให้สิ้นสุดการออกกำลังกายจากแท็บออกกำลังกาย", + "@notifWorkoutIdleBody": { + "description": "OS notification body when a live workout has shown no effort for a while.", + "placeholders": { + "minutes": { + "type": "int" + } + } + } +} diff --git a/lib/ui2/profile/profile.dart b/lib/ui2/profile/profile.dart index 6002cc659..00a74c6ce 100644 --- a/lib/ui2/profile/profile.dart +++ b/lib/ui2/profile/profile.dart @@ -198,6 +198,7 @@ const Map _kLanguageNames = { 'zh': '中文', 'hi': 'हिन्दी', 'ru': 'Русский', + 'th': 'ไทย', }; String _languageLabel(BuildContext c, String? code) => code == null diff --git a/test/notification_number_bodies_l10n_test.dart b/test/notification_number_bodies_l10n_test.dart index a46940f2a..1f37ec276 100644 --- a/test/notification_number_bodies_l10n_test.dart +++ b/test/notification_number_bodies_l10n_test.dart @@ -52,7 +52,7 @@ void main() { }; test('every numbered body is translated, in every shipped locale', () { - for (final code in ['de', 'es', 'fr', 'hi', 'ru', 'zh']) { + for (final code in ['de', 'es', 'fr', 'hi', 'ru', 'th', 'zh']) { for (final e in bodies().entries) { expect(e.value, isNotEmpty, reason: e.key); expect(localizedNotificationText(l(code), e.value), @@ -86,7 +86,7 @@ void main() { }); test('the titles over these bodies are translated too', () { - for (final code in ['de', 'es', 'fr', 'hi', 'ru', 'zh']) { + for (final code in ['de', 'es', 'fr', 'hi', 'ru', 'th', 'zh']) { for (final title in [ 'Charge your strap before bed', 'Wind down', diff --git a/test/thai_l10n_test.dart b/test/thai_l10n_test.dart new file mode 100644 index 000000000..c817125b3 --- /dev/null +++ b/test/thai_l10n_test.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:openstrap_edge/l10n/app_localizations.dart'; +import 'package:openstrap_edge/state/locale_controller.dart'; +import 'package:openstrap_edge/ui2/profile/profile.dart'; +import 'package:openstrap_edge/ui2/ui2.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('Thai covers the English messages and preserves ICU arguments', () { + Map arb(String code) => + jsonDecode(File('lib/l10n/app_$code.arb').readAsStringSync()) + as Map; + final en = arb('en'); + final th = arb('th'); + final keys = en.keys.where((key) => !key.startsWith('@')).toSet(); + expect(th['@@locale'], 'th'); + expect(th.keys.where((key) => !key.startsWith('@')).toSet(), keys); + for (final key in keys) { + expect(th[key], isA(), reason: key); + expect(th[key], isNotEmpty, reason: key); + final metadata = en['@$key'] as Map?; + final arguments = metadata?['placeholders'] as Map?; + for (final argument in arguments?.keys ?? []) { + expect( + RegExp( + '\\{${RegExp.escape(argument)}(?:\\}|,)', + ).hasMatch(th[key] as String), + isTrue, + reason: '$key must preserve $argument', + ); + } + } + }); + + test('Thai plural and select messages render numbers and dynamic names', () { + final th = lookupAppLocalizations(const Locale('th')); + expect(th.localeName, 'th'); + for (final n in [0, 1, 2, 14]) { + expect(th.dataFilesShared(n), 'แชร์แล้ว $n ไฟล์'); + } + expect(th.calmBreathingMinutesSemantic(5), '5 นาที'); + expect( + th.investigateDroppedThin(2), + 'ไม่นับ 2 คืนเพราะมีชั่วโมงที่สังเกตได้น้อยเกินไป', + ); + expect(th.activityExerciseCategory('Abs'), 'หน้าท้อง'); + expect(th.activityExerciseCategory('Custom'), 'Custom'); + expect(th.activityExerciseEquipment('Pullupbar', 'Pull-up bar'), 'บาร์โหน'); + expect( + th.activityExerciseEquipment('custom', 'My equipment'), + 'My equipment', + ); + expect( + th.notifRecoveryReadySleptBody(80, 7, 30), + 'การฟื้นตัว 80 นอน 7 ชม. 30 นาที', + ); + }); + + testWidgets('Thai is reachable in the picker and persists after selection', ( + tester, + ) async { + SharedPreferences.setMockInitialValues({}); + tester.view.physicalSize = const Size(360, 560); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + final controller = LocaleController.seed('en'); + addTearDown(controller.dispose); + + await tester.pumpWidget( + ChangeNotifierProvider.value( + value: controller, + child: AnimatedBuilder( + animation: controller, + builder: (context, child) => MaterialApp( + theme: buildTheme(Brightness.dark), + locale: controller.locale, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + home: const ProfileHomeView(stats: ProfileStats(name: 'Tester')), + ), + ), + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('English').first); + await tester.pumpAndSettle(); + await tester.ensureVisible(find.text('ไทย')); + await tester.tap(find.text('ไทย')); + await tester.pumpAndSettle(); + + expect(tester.takeException(), isNull); + expect(controller.locale, const Locale('th')); + expect(find.text('โปรไฟล์'), findsOneWidget); + expect(find.text('ภาษา'), findsOneWidget); + expect((await LocaleController.bootstrap()).code, 'th'); + }); +} From f2318e5e2e4a9ff51a72a84789be13ae467419f5 Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 1 Nov 2026 14:51:39 +0530 Subject: [PATCH 2/3] l10n(th): translate the strings added on main since this branch Step calibration, raw-reading retention and compaction, the ChatGPT reset warning and the CVHR no-comparison note were added to English after this branch was cut, and the Thai key-parity test caught them. --- lib/l10n/app_th.arb | 64 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 0315afdc0..893eb7ab3 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -5016,6 +5016,7 @@ } } }, + "investigateCvhrNoComparisonYet": "ยังมีคืนก่อนหน้าไม่มากพอที่จะบอกได้ว่าการแกว่งของอัตราการเต้นหัวใจที่หน้านี้นับอยู่สูงกว่าปกติหรือไม่", "investigateCvhrInsideUsual": "ในคืนล่าสุด ๆ รอบการเปลี่ยนแปลงอัตราการเต้นหัวใจที่การคัดกรองนี้นับได้ยังอยู่ในช่วงของ {n} คืนก่อนหน้า", "@investigateCvhrInsideUsual": { "description": "Sentence: recent heart-rate cycling has stayed within the user's own usual range", @@ -11373,6 +11374,7 @@ "@settingsResetPairingKeyWarning": { "description": "Warning after reset when a sensor pairing key could not be removed from secure storage" }, + "settingsResetChatGptWarning": "ลบข้อมูลแอปแล้ว แต่การลงชื่อเข้าใช้ ChatGPT อาจยังไม่ถูกลบออกทั้งหมด ให้ยกเลิกการเชื่อมต่อ OpenStrap ในการตั้งค่า ChatGPT เพื่อให้แน่ใจว่าสิทธิ์การเข้าถึงถูกเพิกถอนแล้ว การลบทั้งหมดอีกครั้งจะลองลบเฉพาะสิ่งที่ยังเหลืออยู่ในอุปกรณ์นี้เท่านั้น", "settingsResetBody": "จะลบข้อมูลของแอปนี้บนอุปกรณ์นี้อย่างถาวร:\n\n· ทุกวันที่วัด การนอน การออกกำลังกาย และเส้นทาง\n· ผลแล็บ มื้ออาหาร ยาที่ใช้ นิสัย การฝึกหายใจ และเซ็ตที่บันทึกทั้งหมด\n· บันทึกประจำวัน รอบเดือน และช่วงปกติที่แอปเรียนรู้\n· โปรไฟล์ การตั้งค่าทั้งหมด และคีย์ AI ที่เก็บไว้\n· วิดเจ็ตหน้าจอหลักและการเตือนตามกำหนดทั้งหมด\n\nสำเนาที่ส่งออกและข้อมูลสำรองในโฟลเดอร์เก่าหรือโฟลเดอร์ที่เข้าถึงไม่ได้อาจยังอยู่ โปรดลบแยกต่างหาก\n\nจะยกเลิกการจับคู่สายรัด และสายรัดส่งประวัติที่ส่งให้แล้วซ้ำไม่ได้ ส่งออกจาก “ข้อมูลของคุณ” ก่อนหากต้องการเก็บสำเนา", "@settingsResetBody": { "description": "Confirmation dialog body listing exactly what a full reset deletes" @@ -16111,5 +16113,65 @@ "type": "int" } } - } + }, + "settingsStepCalibration": "ปรับเทียบจำนวนก้าว", + "settingsStepCalibrationSub": "เรียนรู้ว่าสายรัดนับการเดินของคุณมากหรือน้อยเกินไปเท่าใด แล้วแก้ไขบนโทรศัพท์ ไม่มีการเขียนข้อมูลลงสายรัด และไม่มีข้อมูลออกจากอุปกรณ์", + "stepCalTitle": "ปรับเทียบจำนวนก้าว", + "stepCalIntro": "สายรัดนับก้าวจากเซ็นเซอร์การเคลื่อนไหวของตัวเอง และความคลาดเคลื่อนขึ้นอยู่กับตัวคุณ ขั้นตอนเหล่านี้ใช้วัดค่านั้น ไม่มีข้อมูลออกจากโทรศัพท์ของคุณ", + "stepCalSlowTitle": "เดินช้า", + "stepCalSlowSub": "เดินช้า ๆ โดยใส่โทรศัพท์ไว้ในกระเป๋า", + "stepCalSlowGuide": "เดินช้า ๆ อย่างสม่ำเสมอ รัดสายให้กระชับ นับเอง 100 ก้าว", + "stepCalBriskTitle": "เดินเร็ว", + "stepCalBriskSub": "เดินด้วยความเร็วปกติของคุณ", + "stepCalBriskGuide": "เดินด้วยความเร็วปกติ นับเอง 100 ก้าว", + "stepCalJogTitle": "วิ่งเหยาะ", + "stepCalJogSub": "วิ่งเหยาะอย่างสม่ำเสมอ", + "stepCalJogGuide": "วิ่งเหยาะอย่างสม่ำเสมอ นับเอง 100 ก้าว", + "stepCalEverydayTitle": "ทำกิจกรรมในบ้าน", + "stepCalEverydaySub": "เก็บของในบ้านสามนาที โดยใส่โทรศัพท์ไว้ในกระเป๋า", + "stepCalEverydayGuide": "ทำกิจวัตรทั่วไปในบ้าน เช่น ถือของ ยกของ เก็บของ โดยใส่โทรศัพท์ไว้ในกระเป๋า สามนาที ไม่ต้องตั้งใจเดินไปมา", + "stepCalCalibrated": "ปรับเทียบแล้ว — วัดไป {n} ครั้ง", + "stepCalNotCalibrated": "ยังไม่ได้ปรับเทียบ", + "stepCalBandSeen": "{count, plural, other{ก้าวที่สายรัดตรวจพบ}}", + "stepCalCountYourself": "นับก้าวด้วยตัวเอง หยุดเมื่อถึง {target} ก้าว", + "stepCalElapsed": "ทำต่อไป — ขั้นตอนนี้จับเวลา", + "stepCalHowManyCounted": "คุณนับได้กี่ก้าว?", + "stepCalFinish": "เสร็จสิ้น", + "stepCalCancel": "ยกเลิก", + "stepCalKeepWalking": "ยังไม่มีข้อมูล — เริ่มเดินโดยรัดสายให้กระชับ", + "stepCalKeepMoving": "ยังไม่มีข้อมูล — พกโทรศัพท์ไว้กับตัวและเคลื่อนไหวต่อไป", + "stepCalNoSignal": "สายรัดไม่ได้บันทึกอะไรเลยระหว่างขั้นตอนนั้น", + "stepCalNoPhoneAccess": "ขั้นตอนนี้ต้องใช้ตัวนับก้าวของโทรศัพท์ แต่ไม่ได้รับสิทธิ์เข้าถึง ตัวนับนั้นใช้เป็นค่าอ้างอิงสำหรับการเคลื่อนไหวในบ้าน", + "stepCalPhoneNotReady": "ตัวนับก้าวของโทรศัพท์ไม่ตอบสนอง ลองอีกครั้งในอีกสักครู่", + "stepCalNoPhone": "โทรศัพท์ของคุณไม่ได้นับก้าวเลยระหว่างที่ทำขั้นตอนนั้น ครั้งหน้าให้ใส่ไว้ในกระเป๋า — โทรศัพท์คือค่าอ้างอิงสำหรับการเคลื่อนไหวในบ้าน", + "stepCalBandQuiet": "สายรัดแทบไม่ตรวจพบการเคลื่อนไหว ควรตรวจสอบว่าสวมสายรัดกระชับและกำลังส่งข้อมูลอยู่", + "stepCalTooShort": "ขั้นตอนนั้นสั้นเกินไปที่จะใช้วัด เดินให้ครบจำนวน", + "stepCalMismatch": "สายรัดนับได้มากกว่าที่คุณนับมาก มีการเคลื่อนไหวอื่นที่ไม่ใช่การเดินถูกนับเข้าไปด้วย", + "stepCalWrongSource": "ขั้นตอนนั้นใช้ค่าอ้างอิงผิด", + "stepCalBadData": "ขั้นตอนนั้นได้ข้อมูลเซ็นเซอร์ที่อ่านไม่ได้", + "stepCalRatioOutOfRange": "จำนวนที่คุณนับกับที่สายรัดนับต่างกันมากเกินกว่าจะใช้ได้ ทำขั้นตอนนี้ซ้ำและเดินให้ครบจำนวน", + "stepCalCadenceOutOfRange": "สายรัดหาจังหวะการเดินในขั้นตอนนั้นไม่พบ เริ่มเดินทันทีหลังกดเริ่มและรักษาความเร็วให้สม่ำเสมอ", + "stepCalRoutineTooShort": "ขั้นตอนนั้นจบก่อนหมดเวลา ทำต่อไปจนกว่าจะเสร็จ", + "stepCalSaveFailed": "บันทึกการปรับเทียบนั้นไม่ได้", + "stepCalDoneGait": "บันทึกแล้ว คุณนับได้ {count} ก้าว และสายรัดตรวจพบ {band} ก้าว ต่อจากนี้การเดินแบบนี้จะถูกแก้ไข {pct}%", + "stepCalDoneHousehold": "บันทึกแล้ว โทรศัพท์ของคุณนับได้ {count} ก้าว จาก {band} ก้าวที่สายรัดตรวจพบ การเคลื่อนไหวในบ้านจะถูกปรับสเกลเป็น {gain}", + "dataStorageGroup": "พื้นที่จัดเก็บ", + "dataKeepHistory": "เก็บค่าที่อ่านได้ดิบ", + "dataKeepHistorySub": "สำเนาแบบบีบอัดของค่าที่อ่านได้รายวินาทีในแต่ละวัน ซึ่งเก็บไว้หลังจากแอปล้างข้อมูลแล้ว วันที่เก่ากว่านี้ยังคงมีคะแนนอยู่ แต่จะคำนวณคะแนนใหม่ไม่ได้เมื่อการให้คะแนนได้รับการปรับปรุง", + "dataKeepDays": "{days} วัน", + "dataKeepYear": "1 ปี", + "dataKeepForever": "ตลอดไป", + "dataKeepShorterTitle": "เก็บค่าที่อ่านได้ดิบไว้ {window}?", + "dataKeepShorterBody": "ค่าที่อ่านได้ที่เก่ากว่าค่าล่าสุดประมาณ {window} จะถูกลบตอนนี้ วันเหล่านั้นยังคงมีคะแนนอยู่ แต่จะคำนวณคะแนนใหม่ไม่ได้หลังการอัปเดตในอนาคต", + "dataKeepShorterConfirm": "ลบค่าที่อ่านได้ที่เก่ากว่า", + "dataKeepShorterCancel": "เก็บไว้", + "dataCompact": "บีบอัดฐานข้อมูล", + "dataCompactSub": "ล้างข้อมูลที่การตั้งค่าด้านบนไม่ได้เก็บไว้แล้ว จากนั้นคืนพื้นที่ที่ไม่ได้ใช้ให้โทรศัพท์ ต้องมีพื้นที่ว่างประมาณสองเท่าของขนาดฐานข้อมูล", + "dataCompactPruning": "กำลังล้างข้อมูลเก่า…", + "dataCompactVacuuming": "กำลังบีบอัด…", + "dataCompactFreed": "คืนพื้นที่ได้ {freed} MB ตอนนี้ฐานข้อมูลมีขนาด {size} MB", + "dataCompactNoSpace": "ล้างข้อมูลเก่าแล้ว แต่การบีบอัดต้องมีพื้นที่ว่าง {need} MB และโทรศัพท์มีอยู่ {free} MB", + "dataCompactUnknownSpace": "ล้างข้อมูลเก่าแล้ว แต่อ่านพื้นที่ว่างของโทรศัพท์ไม่ได้ จึงไม่ได้บีบอัดไฟล์", + "dataCompactBusy": "กำลังซิงค์หรือมีเซสชันสดทำงานอยู่ ลองอีกครั้งเมื่อเสร็จแล้ว", + "dataSizeMb": "{mb} MB" } From cb2006b56456733c86ff23be692e742197e11f53 Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 1 Nov 2026 14:59:41 +0530 Subject: [PATCH 3/3] l10n(th): carry the template descriptions for the newly translated keys --- lib/l10n/app_th.arb | 152 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 893eb7ab3..798460b54 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -5017,6 +5017,9 @@ } }, "investigateCvhrNoComparisonYet": "ยังมีคืนก่อนหน้าไม่มากพอที่จะบอกได้ว่าการแกว่งของอัตราการเต้นหัวใจที่หน้านี้นับอยู่สูงกว่าปกติหรือไม่", + "@investigateCvhrNoComparisonYet": { + "description": "Sentence: too few older nights exist yet to compare the recent heart-rate cycling against" + }, "investigateCvhrInsideUsual": "ในคืนล่าสุด ๆ รอบการเปลี่ยนแปลงอัตราการเต้นหัวใจที่การคัดกรองนี้นับได้ยังอยู่ในช่วงของ {n} คืนก่อนหน้า", "@investigateCvhrInsideUsual": { "description": "Sentence: recent heart-rate cycling has stayed within the user's own usual range", @@ -11375,6 +11378,9 @@ "description": "Warning after reset when a sensor pairing key could not be removed from secure storage" }, "settingsResetChatGptWarning": "ลบข้อมูลแอปแล้ว แต่การลงชื่อเข้าใช้ ChatGPT อาจยังไม่ถูกลบออกทั้งหมด ให้ยกเลิกการเชื่อมต่อ OpenStrap ในการตั้งค่า ChatGPT เพื่อให้แน่ใจว่าสิทธิ์การเข้าถึงถูกเพิกถอนแล้ว การลบทั้งหมดอีกครั้งจะลองลบเฉพาะสิ่งที่ยังเหลืออยู่ในอุปกรณ์นี้เท่านั้น", + "@settingsResetChatGptWarning": { + "description": "Warning after reset when the ChatGPT sign-in may not have been revoked or removed from secure storage" + }, "settingsResetBody": "จะลบข้อมูลของแอปนี้บนอุปกรณ์นี้อย่างถาวร:\n\n· ทุกวันที่วัด การนอน การออกกำลังกาย และเส้นทาง\n· ผลแล็บ มื้ออาหาร ยาที่ใช้ นิสัย การฝึกหายใจ และเซ็ตที่บันทึกทั้งหมด\n· บันทึกประจำวัน รอบเดือน และช่วงปกติที่แอปเรียนรู้\n· โปรไฟล์ การตั้งค่าทั้งหมด และคีย์ AI ที่เก็บไว้\n· วิดเจ็ตหน้าจอหลักและการเตือนตามกำหนดทั้งหมด\n\nสำเนาที่ส่งออกและข้อมูลสำรองในโฟลเดอร์เก่าหรือโฟลเดอร์ที่เข้าถึงไม่ได้อาจยังอยู่ โปรดลบแยกต่างหาก\n\nจะยกเลิกการจับคู่สายรัด และสายรัดส่งประวัติที่ส่งให้แล้วซ้ำไม่ได้ ส่งออกจาก “ข้อมูลของคุณ” ก่อนหากต้องการเก็บสำเนา", "@settingsResetBody": { "description": "Confirmation dialog body listing exactly what a full reset deletes" @@ -16131,9 +16137,32 @@ "stepCalEverydaySub": "เก็บของในบ้านสามนาที โดยใส่โทรศัพท์ไว้ในกระเป๋า", "stepCalEverydayGuide": "ทำกิจวัตรทั่วไปในบ้าน เช่น ถือของ ยกของ เก็บของ โดยใส่โทรศัพท์ไว้ในกระเป๋า สามนาที ไม่ต้องตั้งใจเดินไปมา", "stepCalCalibrated": "ปรับเทียบแล้ว — วัดไป {n} ครั้ง", + "@stepCalCalibrated": { + "description": "Badge on a category row: how many supervised routines are behind its gain.", + "placeholders": { + "n": { + "type": "int" + } + } + }, "stepCalNotCalibrated": "ยังไม่ได้ปรับเทียบ", "stepCalBandSeen": "{count, plural, other{ก้าวที่สายรัดตรวจพบ}}", + "@stepCalBandSeen": { + "placeholders": { + "count": { + "type": "int" + } + } + }, "stepCalCountYourself": "นับก้าวด้วยตัวเอง หยุดเมื่อถึง {target} ก้าว", + "@stepCalCountYourself": { + "description": "Instruction during a gait routine. The wearer counts their own steps; the band's live count is shown only as feedback, because a run that ended on the band's own count would always fit exactly 1.0.", + "placeholders": { + "target": { + "type": "int" + } + } + }, "stepCalElapsed": "ทำต่อไป — ขั้นตอนนี้จับเวลา", "stepCalHowManyCounted": "คุณนับได้กี่ก้าว?", "stepCalFinish": "เสร็จสิ้น", @@ -16154,24 +16183,145 @@ "stepCalRoutineTooShort": "ขั้นตอนนั้นจบก่อนหมดเวลา ทำต่อไปจนกว่าจะเสร็จ", "stepCalSaveFailed": "บันทึกการปรับเทียบนั้นไม่ได้", "stepCalDoneGait": "บันทึกแล้ว คุณนับได้ {count} ก้าว และสายรัดตรวจพบ {band} ก้าว ต่อจากนี้การเดินแบบนี้จะถูกแก้ไข {pct}%", + "@stepCalDoneGait": { + "description": "Result of a gait calibration: what the wearer counted, what the band counted, and the percentage correction now applied. Signed, so a reduction reads as -12%.", + "placeholders": { + "count": { + "type": "int" + }, + "band": { + "type": "int" + }, + "pct": { + "type": "int" + } + } + }, "stepCalDoneHousehold": "บันทึกแล้ว โทรศัพท์ของคุณนับได้ {count} ก้าว จาก {band} ก้าวที่สายรัดตรวจพบ การเคลื่อนไหวในบ้านจะถูกปรับสเกลเป็น {gain}", + "@stepCalDoneHousehold": { + "description": "Result of a household calibration: the phone's count (the reference), the band's count, and the resulting scale as a fixed-2 string.", + "placeholders": { + "count": { + "type": "int" + }, + "band": { + "type": "int" + }, + "gain": { + "type": "String" + } + } + }, "dataStorageGroup": "พื้นที่จัดเก็บ", + "@dataStorageGroup": { + "description": "Data screen group title: storage settings and compaction." + }, "dataKeepHistory": "เก็บค่าที่อ่านได้ดิบ", + "@dataKeepHistory": { + "description": "Row title: how long the compressed raw-reading archive is kept." + }, "dataKeepHistorySub": "สำเนาแบบบีบอัดของค่าที่อ่านได้รายวินาทีในแต่ละวัน ซึ่งเก็บไว้หลังจากแอปล้างข้อมูลแล้ว วันที่เก่ากว่านี้ยังคงมีคะแนนอยู่ แต่จะคำนวณคะแนนใหม่ไม่ได้เมื่อการให้คะแนนได้รับการปรับปรุง", + "@dataKeepHistorySub": { + "description": "Row sub for the archive window setting." + }, "dataKeepDays": "{days} วัน", + "@dataKeepDays": { + "description": "Archive window value: a number of days.", + "placeholders": { + "days": { + "type": "int" + } + } + }, "dataKeepYear": "1 ปี", + "@dataKeepYear": { + "description": "Archive window value: one year." + }, "dataKeepForever": "ตลอดไป", + "@dataKeepForever": { + "description": "Archive window value: never delete." + }, "dataKeepShorterTitle": "เก็บค่าที่อ่านได้ดิบไว้ {window}?", + "@dataKeepShorterTitle": { + "description": "Confirm title when the archive window is shortened.", + "placeholders": { + "window": { + "type": "String" + } + } + }, "dataKeepShorterBody": "ค่าที่อ่านได้ที่เก่ากว่าค่าล่าสุดประมาณ {window} จะถูกลบตอนนี้ วันเหล่านั้นยังคงมีคะแนนอยู่ แต่จะคำนวณคะแนนใหม่ไม่ได้หลังการอัปเดตในอนาคต", + "@dataKeepShorterBody": { + "description": "Confirm body when the archive window is shortened.", + "placeholders": { + "window": { + "type": "String" + } + } + }, "dataKeepShorterConfirm": "ลบค่าที่อ่านได้ที่เก่ากว่า", + "@dataKeepShorterConfirm": { + "description": "Confirm button: shorten the window and delete older archive." + }, "dataKeepShorterCancel": "เก็บไว้", + "@dataKeepShorterCancel": { + "description": "Cancel button: keep the current window." + }, "dataCompact": "บีบอัดฐานข้อมูล", + "@dataCompact": { + "description": "Row title: compact the database file." + }, "dataCompactSub": "ล้างข้อมูลที่การตั้งค่าด้านบนไม่ได้เก็บไว้แล้ว จากนั้นคืนพื้นที่ที่ไม่ได้ใช้ให้โทรศัพท์ ต้องมีพื้นที่ว่างประมาณสองเท่าของขนาดฐานข้อมูล", + "@dataCompactSub": { + "description": "Row sub for Compact database." + }, "dataCompactPruning": "กำลังล้างข้อมูลเก่า…", + "@dataCompactPruning": { + "description": "Progress line while old data is cleared before compaction." + }, "dataCompactVacuuming": "กำลังบีบอัด…", + "@dataCompactVacuuming": { + "description": "Progress line while the database file is rewritten." + }, "dataCompactFreed": "คืนพื้นที่ได้ {freed} MB ตอนนี้ฐานข้อมูลมีขนาด {size} MB", + "@dataCompactFreed": { + "description": "Compaction result: megabytes freed and the new size.", + "placeholders": { + "freed": { + "type": "int" + }, + "size": { + "type": "int" + } + } + }, "dataCompactNoSpace": "ล้างข้อมูลเก่าแล้ว แต่การบีบอัดต้องมีพื้นที่ว่าง {need} MB และโทรศัพท์มีอยู่ {free} MB", + "@dataCompactNoSpace": { + "description": "Compaction refused: not enough free storage.", + "placeholders": { + "need": { + "type": "int" + }, + "free": { + "type": "int" + } + } + }, "dataCompactUnknownSpace": "ล้างข้อมูลเก่าแล้ว แต่อ่านพื้นที่ว่างของโทรศัพท์ไม่ได้ จึงไม่ได้บีบอัดไฟล์", + "@dataCompactUnknownSpace": { + "description": "Compaction refused: free storage could not be read." + }, "dataCompactBusy": "กำลังซิงค์หรือมีเซสชันสดทำงานอยู่ ลองอีกครั้งเมื่อเสร็จแล้ว", - "dataSizeMb": "{mb} MB" + "@dataCompactBusy": { + "description": "Compaction refused: a sync or session is running." + }, + "dataSizeMb": "{mb} MB", + "@dataSizeMb": { + "description": "A size in megabytes, shown as the row value.", + "placeholders": { + "mb": { + "type": "int" + } + } + } }