feat(i18n): bring the Thai translation up to date with dev

Translates the keys dev gained since the branch was cut, the help center
above all, and drops the six keys dev no longer has. Registers th
everywhere a language is listed: notification emails, the rate-limit
message, the placeholder check and the wiki. The two tests that counted
the languages by hand now derive the count from SUPPORTED_LANGUAGES.
This commit is contained in:
Maurice
2026-09-24 16:44:30 +02:00
parent ba9936f90a
commit b7f777024a
23 changed files with 3589 additions and 129 deletions
+1
View File
@@ -130,6 +130,7 @@ const RATE_LIMIT_MESSAGES: Record<string, string> = {
id: 'Terlalu banyak percobaan. Coba lagi nanti.',
ja: '試行回数が多すぎます。時間をおいて再度お試しください。',
ko: '시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요.',
th: 'พยายามหลายครั้งเกินไป โปรดลองอีกครั้งภายหลัง',
uk: 'Занадто багато спроб. Спробуйте пізніше.',
sv: 'För många försök. Prova igen senare.',
ca: 'Massa intents. Torneu-ho a provar més tard.',
@@ -18,6 +18,7 @@ import pl from '../pl/externalNotifications';
import ru from '../ru/externalNotifications';
import sk from '../sk/externalNotifications';
import sv from '../sv/externalNotifications';
import th from '../th/externalNotifications';
import tr from '../tr/externalNotifications';
import uk from '../uk/externalNotifications';
import zhTW from '../zh-TW/externalNotifications';
@@ -54,6 +55,7 @@ const LOCALES = {
id,
ja,
ko,
th,
uk,
gr,
sv,
@@ -19,6 +19,7 @@ import pl from './pl';
import ru from './ru';
import sk from './sk';
import sv from './sv';
import th from './th';
import tr from './tr';
import type { TranslationStrings } from './types';
import uk from './uk';
@@ -61,6 +62,7 @@ const LOCALES: Record<string, TranslationStrings> = {
ru,
sk,
sv,
th,
tr,
uk,
vi,
+10
View File
@@ -166,6 +166,13 @@ const admin: TranslationStrings = {
'admin.placesEnrich.title': "สถานที่เสริมคุณค่า",
'admin.placesEnrich.subtitle':
"แสดงรูปภาพและคำอธิบายขณะเพิ่มสถานที่ มีการใช้ Wikipedia และ OpenStreetMap เสมอ Google จะถูกเพิ่มไว้ด้านบนเมื่อเปิดรูปภาพสถานที่หรือรายละเอียดสถานที่",
'admin.placesGoogleOnly.title': 'ค้นหาด้วย Google เท่านั้น',
'admin.placesGoogleOnly.subtitle':
'ทุกการค้นหาและทุกคำแนะนำจะส่งไปที่ Google Places เมื่อปิด ดัชนีของ TREK เองและ OpenStreetMap จะตอบก่อน และจะถาม Google เฉพาะเมื่อไม่พบผลลัพธ์',
'admin.placesGoogleOnly.missingKey':
'ต้องมีคีย์ API ของ Google Maps หากไม่มี การค้นหาจะใช้ดัชนีของ TREK เองและ OpenStreetMap ไม่ว่าสวิตช์นี้จะตั้งไว้อย่างไร',
'admin.placesGoogleOnly.otherProvider':
'ต้องใช้ Google เป็นผู้ให้บริการสถานที่ หากเลือก Amap หรือ OpenStreetMap การค้นหาจะไม่ส่งไปที่ Google ไม่ว่าสวิตช์นี้จะตั้งไว้อย่างไร',
'admin.bagTracking.title': "ติดตามกระเป๋า",
'admin.bagTracking.subtitle': "เปิดใช้งานการกำหนดน้ำหนักและถุงสำหรับการบรรจุสินค้า",
'admin.collab.chat.title': "แชท",
@@ -361,6 +368,7 @@ const admin: TranslationStrings = {
'admin.plugins.perm.hook:photo-provider': "มอบภาพถ่ายให้กับความทรงจำ",
'admin.plugins.perm.hook:calendar-source': "จัดให้มีกิจกรรมในปฏิทิน",
'admin.plugins.perm.hook:place-detail-provider': "เพิ่มรายละเอียด (บทวิจารณ์ คะแนน และลิงก์) ให้กับสถานที่",
'admin.plugins.perm.hook:search-provider': 'ตอบการค้นหาสถานที่จากดัชนีของตัวเอง ควบคู่กับผลลัพธ์ของ TREK',
'admin.plugins.perm.hook:trip-warning-provider': "แจ้งเตือนการตรวจสอบความถูกต้องในการเดินทาง (แสดงใน Planner)",
'admin.plugins.perm.hook:table-contributor': "เพิ่มคอลัมน์และการดำเนินการให้กับมุมมองการเดินทาง (การจอง สถานที่ วัน)",
'admin.plugins.perm.hook:map-marker-provider': "เพิ่มเครื่องหมายลงในแผนที่การเดินทาง (เช่น แสดงการจองหรือ POI)",
@@ -733,6 +741,7 @@ const admin: TranslationStrings = {
'admin.trekApi.notIncluded': "ไม่รวมอยู่",
'admin.amapKey': "คีย์ API ของ Amap (高德地图)",
'admin.amapKeyHint': "สำหรับค้นหาสถานที่ในจีนแผ่นดินใหญ่ที่ Google ใช้ไม่ได้และ OpenStreetMap ครอบคลุมไม่มาก ต้องใช้คีย์ “Web 服务” (เว็บเซอร์วิส) ไม่ใช่คีย์ JS API รับได้ที่ console.amap.com",
'admin.keyFromEnv': 'ตั้งค่าผ่าน {name}',
'admin.placesProvider.title': "ผู้ให้บริการค้นหาสถานที่",
'admin.placesProvider.subtitle': "ดัชนีของ TREK และ OpenStreetMap ตอบทุกการค้นหา การตั้งค่านี้เลือกผู้ให้บริการอื่นที่จะถามเมื่อไม่พบข้อมูล: อัตโนมัติจะเลือก Google หากมีคีย์ แล้วจึง Amap",
'admin.placesProvider.auto': "อัตโนมัติ",
@@ -761,5 +770,6 @@ const admin: TranslationStrings = {
'admin.placesUsageTitle': "คีย์นี้ใช้ทำอะไร",
'admin.mapsKeyHintShort': "เพิ่มรูปภาพ คะแนน และเวลาเปิดทำการ ทุกการค้นหาจะส่งไปยัง Google",
'admin.amapKeyHintShort': "สำหรับค้นหาสถานที่ในจีนแผ่นดินใหญ่ ต้องใช้คีย์เว็บเซอร์วิส ไม่ใช่คีย์ JS API",
'admin.collab.links.subtitle': 'ลิงก์และบุ๊กมาร์กที่แบ่งปัน',
};
export default admin;
+9
View File
@@ -82,6 +82,11 @@ const collab: TranslationStrings = {
'collab.polls.options': "ตัวเลือก",
'collab.polls.delete': "ลบ",
'collab.polls.closedSection': "ปิดแล้ว",
'collab.chat.imageLimit': 'คุณแนบรูปภาพได้สูงสุด {max} รูปต่อข้อความ',
'collab.chat.uploading': 'กำลังอัปโหลด {percent}%',
'collab.chat.attachImages': 'แนบรูปภาพ',
'collab.chat.attachedImage': 'รูปภาพที่แนบ',
'collab.chat.closeImage': 'ปิดรูปภาพ',
'collab.tabs.links': "ลิงก์",
'collab.links.add': "เพิ่มลิงก์",
'collab.chat.imageRejected': "อนุญาตเฉพาะรูป JPEG, PNG, GIF และ WebP ขนาดไม่เกิน 10 MB",
@@ -93,5 +98,9 @@ const collab: TranslationStrings = {
'collab.links.pin': "ปักหมุดลิงก์",
'collab.links.unpin': "เลิกปักหมุดลิงก์",
'collab.links.delete': "ลบลิงก์",
'collab.links.edit': 'แก้ไขลิงก์',
'collab.links.open': 'เปิดลิงก์',
'collab.links.confirmDeleteTitle': 'ลบลิงก์ใช่ไหม',
'collab.links.confirmDeleteBody': 'ลิงก์นี้จะถูกลบอย่างถาวร',
};
export default collab;
+21
View File
@@ -194,6 +194,16 @@ const collection: TranslationStrings = {
'collections.file.importTitle': "นำเข้ารายการ",
'collections.file.choose': "เลือกไฟล์รายการ",
'collections.file.confirm': "นำเข้า",
'collections.file.targetNew': 'รายการใหม่',
'collections.file.targetNewHint': 'ใช้ไฟล์เป็นรายการแยกต่างหาก',
'collections.file.targetExisting': 'เพิ่มลงในรายการ',
'collections.file.targetExistingHint': 'ลงในรายการที่คุณมีอยู่แล้ว',
'collections.file.searchLists': 'ค้นหารายการ',
'collections.file.intoHint': 'สถานที่ที่มีอยู่ในรายการจะคงเดิม รวมถึงชื่อและสีของรายการ ป้ายกำกับที่มากับไฟล์จะถูกเพิ่มเข้าไป',
'collections.file.confirmInto': 'เพิ่มลงในรายการ',
'collections.file.doneInto': 'เพิ่ม {count} สถานที่ลงใน {name} แล้ว',
'collections.file.doneIntoDuplicates': 'เพิ่ม {count} แห่งลงใน {name} แล้ว มี {duplicates} แห่งอยู่แล้ว',
'collections.file.doneIntoNothing': 'ทุกสถานที่ในไฟล์มีอยู่ใน {name} แล้ว',
'collections.file.change': "เปลี่ยน",
'collections.file.labelCount': "{count} ป้ายกำกับ",
'collections.file.hint': "สถานที่จะเข้ามาเป็นรายการใหม่ของคุณเอง คะแนน สมาชิก และรูปภาพที่อัปโหลดจะไม่ถูกนำมาด้วย",
@@ -202,6 +212,17 @@ const collection: TranslationStrings = {
'collections.file.errorTooLarge': "ไฟล์นั้นใหญ่เกินกว่าจะเป็นรายการได้",
'collections.file.errorUnreadable': "ไม่สามารถอ่านไฟล์นั้นได้",
'collections.file.errorNotACollection': "ไฟล์นั้นไม่ใช่ไฟล์รายการของ TREK",
'collections.file.formatTrek': 'รายการ TREK',
'collections.file.formatTrekHint': 'สำหรับ TREK อื่น พร้อมป้ายกำกับและสถานะ',
'collections.file.formatGpxHint': 'จุดอ้างอิงสำหรับ OsmAnd, Organic Maps, Garmin และแอปแผนที่อื่นๆ',
'collections.file.gpxOmitted': '{count} สถานที่ไม่มีพิกัดและไม่ได้รวมอยู่ในไฟล์ GPX',
'collections.file.gpxNothing': 'ไม่มีสถานที่ใดในนี้ที่มีพิกัด จึงไม่มีอะไรจะใส่ในไฟล์ GPX',
'collections.file.reading': 'กำลังอ่านไฟล์…',
'collections.file.gpxSkipped': 'จุดอ้างอิง {count} จุดที่ไม่มีพิกัดที่ใช้ได้จะถูกข้ามไป',
'collections.file.gpxTrack': 'ไฟล์นี้ยังมีจุดแทร็ก {count} จุด ระบบจะนำเข้าเฉพาะจุดอ้างอิง ไม่นำเข้าแทร็ก',
'collections.file.gpxEmpty': 'ไฟล์ GPX นี้ไม่มีจุดอ้างอิง จึงไม่มีอะไรให้นำเข้า',
'collections.file.errorNotGpx': 'นี่ไม่ใช่ไฟล์ GPX',
'collections.file.errorTooManyPlaces': 'ไฟล์นี้มีสถานที่มากกว่า {count} แห่ง โปรดแยกไฟล์แล้วนำเข้าทีละส่วน',
};
export default collection;
+15
View File
@@ -101,6 +101,7 @@ const dashboard: TranslationStrings = {
'dashboard.useUnsplashPhoto': "ใช้รูปภาพ Unsplash โดย {photographer}",
'dashboard.titleRequired': "ต้องระบุชื่อ",
'dashboard.endDateError': "วันที่สิ้นสุดต้องอยู่หลังวันที่เริ่มต้น",
'dashboard.tripTooLong': 'การเดินทางหนึ่งครั้งยาวได้สูงสุด {days} วัน',
'dashboard.dateShiftTitle': "วันที่เริ่มต้นใหม่",
'dashboard.dateShiftIntro': "คุณเปลี่ยนวันที่เริ่มต้นของการเดินทางครั้งนี้ แผนของคุณควรปรับตามวันที่ใหม่อย่างไร",
'dashboard.dateShiftKeepBookings': "ทำการจองตามวันที่ของพวกเขา",
@@ -110,6 +111,20 @@ const dashboard: TranslationStrings = {
'dashboard.dateShiftAllDesc':
"แผนการเดินทางทั้งหมดจะย้ายไปพร้อมกับวันที่ใหม่ รวมถึงการจองและที่พัก",
'dashboard.dateShiftHint': "เคล็ดลับ: หากต้องการเปลี่ยนแผนการเดินทางเพียงบางส่วน ให้ใช้ \"เพิ่มวัน\" ในเครื่องมือวางแผนแทน",
'dashboard.shrinkTitle': 'ลบวันใช่ไหม',
'dashboard.shrinkIntro': 'การบันทึกวันที่ใหม่จะลบวันเหล่านี้:',
'dashboard.shrinkMoreDays': '+อีก {count}',
'dashboard.shrinkLastDays': 'วันสุดท้ายจะถูกลบ ไม่ใช่วันแรก',
'dashboard.shrinkLastDaysHint': 'แผนรายวันจะย้ายตามวันที่ใหม่ ดังนั้นวันท้ายๆ ของแผนจะถูกลบเสมอ แม้ว่าวันเริ่มต้นจะเปลี่ยนไปก็ตาม',
'dashboard.shrinkBookingsHint': 'ยังคงอยู่ในส่วนการจอง รายการที่วันที่ยังอยู่ในช่วงการเดินทางจะกลับไปอยู่ในวันนั้น',
'dashboard.shrinkBookingsShiftHint': 'ยังคงอยู่ในส่วนการจอง โดยไม่ผูกกับวันใด',
'dashboard.shrinkStayHint': 'เช็คอินหรือเช็คเอาท์ในวันที่ถูกลบ จึงลบการพักทั้งหมด',
'dashboard.shrinkStayBookedHint':
'เช็คอินหรือเช็คเอาท์ในวันที่ถูกลบ จึงลบการพักทั้งหมด การจอง “{booking}” และค่าใช้จ่ายของการพักนี้ยังคงอยู่ในส่วนการจอง',
'dashboard.shrinkStayBookingHint': 'เช็คอินหรือเช็คเอาท์ในวันที่ถูกลบ จึงลบการพักทั้งหมด การจอง “{booking}” ยังคงอยู่ในส่วนการจอง',
'dashboard.shrinkConfirm': 'ลบวันและบันทึก',
'dashboard.shrinkUnknown':
'ไม่สามารถตรวจสอบวันของการเดินทางนี้ได้ หากวันที่ใหม่มีจำนวนวันน้อยลง การบันทึกจะลบวันท้ายๆ และทุกอย่างที่วางแผนไว้ในวันเหล่านั้น',
'dashboard.greeting.morning': "สวัสดีตอนเช้า",
'dashboard.greeting.afternoon': "สวัสดีตอนบ่าย",
'dashboard.greeting.evening': "สวัสดีตอนเย็น",
+35
View File
@@ -88,6 +88,41 @@ const dayplan: TranslationStrings = {
'dayplan.reorderUndo': "จัดลำดับวันใหม่",
'dayplan.reorderError': "ไม่สามารถเรียงลำดับวันใหม่ได้",
'dayplan.addDayError': "ไม่สามารถเพิ่มวันได้",
'dayplan.deleteDay': 'ลบวัน',
'dayplan.deleteDayTitle': 'ลบ {day} ใช่ไหม',
'dayplan.deleteDayBody': 'วันนี้จะถูกลบออกจากการเดินทาง ไม่สามารถย้อนกลับได้',
'dayplan.deleteDayEmpty': 'ไม่มีอะไรวางแผนไว้ในวันนี้',
'dayplan.impactPlaces': 'สถานที่ที่วางแผนไว้: {count}',
'dayplan.impactPlacesHint': 'ยังคงอยู่ในรายการสถานที่',
'dayplan.impactNotes': 'หมายเหตุ: {count}',
'dayplan.impactTexts': 'ชื่อและคำอธิบายของวัน: {count}',
'dayplan.impactDeletedHint': 'จะถูกลบไปด้วย',
'dayplan.impactBookings': 'การจอง: {count}',
'dayplan.impactStay': 'การพักที่ {name}',
'dayplan.deleteDayBookingsHint': 'ยังคงอยู่ในส่วนการจอง โดยไม่ผูกกับวันใด',
'dayplan.deleteDayStayHint': 'เช็คอินหรือเช็คเอาท์ในวันนี้และจะถูกยกเลิก',
'dayplan.deleteDayStayBookedHint': 'เช็คอินหรือเช็คเอาท์ในวันนี้และจะถูกยกเลิก พร้อมกับการจอง “{booking}” และค่าใช้จ่าย',
'dayplan.deleteDayStayBookingHint': 'เช็คอินหรือเช็คเอาท์ในวันนี้และจะถูกยกเลิก พร้อมกับการจอง “{booking}”',
'dayplan.deleteDayStayPaidHint': 'เช็คอินหรือเช็คเอาท์ในวันนี้และจะถูกยกเลิก พร้อมกับการจอง “{booking}” และค่าใช้จ่าย {amount}',
'dayplan.deleteDayShift': 'วันถัดไป: {count}',
'dayplan.deleteDayShiftHint': 'แต่ละวันจะเลื่อนวันที่เร็วขึ้นหนึ่งวัน',
'dayplan.deleteDayShiftBookingsHint': 'แต่ละวันจะเลื่อนวันที่เร็วขึ้นหนึ่งวัน การจองที่เลื่อนตาม: {count}',
'dayplan.deleteDayShrink': 'ตอนนี้การเดินทางสิ้นสุดวันที่ {date}',
'dayplan.deleteDayShrinkHint': 'ไม่มีวันแบบไม่ระบุวันที่ที่จะรับวันที่สุดท้ายต่อ',
'dayplan.impactStayShorter': 'การพักที่ {name}: น้อยลงหนึ่งคืน',
'dayplan.deleteDayStayShorterHint': 'เช็คเอาท์เปลี่ยนเป็นวันที่ {date} เนื่องจากการพักคร่อมวันนี้',
'dayplan.deleteDayStayShorterUndatedHint': 'การพักคร่อมวันนี้ และตอนนี้จะสิ้นสุดเร็วขึ้นหนึ่งวัน',
'dayplan.deleteDaySpareDated': '{day} รับวันที่ {date}',
'dayplan.deleteDaySpareDatedHint': 'เป็นวันแรกที่ไม่ระบุวันที่ และจะรับวันที่สุดท้ายของการเดินทางต่อ',
'dayplan.deleteDayLast': 'การเดินทางต้องมีอย่างน้อยหนึ่งวัน',
'dayplan.daysOffline': 'การเปลี่ยนวันต้องเชื่อมต่ออินเทอร์เน็ต',
'dayplan.deleteDaySuccess': 'ลบวันแล้ว',
'dayplan.deleteDayError': 'ลบวันไม่สำเร็จ',
'dayplan.addUndatedDay': 'ไม่ระบุวันที่',
'dayplan.addUndatedDayHint': 'เพิ่มวันแบบไม่ระบุวันที่ไว้ท้ายสุด วันที่ของการเดินทางยังคงเดิม',
'dayplan.addDatedDay': 'เพิ่ม {date}',
'dayplan.addDatedDayHint': 'เพิ่ม {date} และขยายการเดินทางออกไปหนึ่งวัน',
'dayplan.tripExtended': 'เพิ่มวันแล้ว ตอนนี้การเดินทางสิ้นสุดวันที่ {date} ช้ากว่าเดิมหนึ่งวัน',
'dayplan.addPlaceHere': "เพิ่มสถานที่ในวันนี้",
};
export default dayplan;
+173
View File
@@ -0,0 +1,173 @@
import type { TranslationStrings } from '../types';
const docsync: TranslationStrings = {
'docsync.title': 'ซิงค์เอกสาร',
'docsync.noProviders': 'ไม่มีผู้ให้บริการเอกสารที่พร้อมใช้งาน',
'docsync.noProvidersHint': 'ผู้ดูแลอินสแตนซ์เปิดใช้งานได้ที่ ผู้ดูแลระบบ, ส่วนเสริม, เอกสาร',
'docsync.addProvider': 'เชื่อมต่อผู้ให้บริการ',
'docsync.test': 'ทดสอบการเชื่อมต่อ',
'docsync.connect.optional': 'ไม่บังคับ',
'docsync.connected': 'เชื่อมต่อแล้ว',
'docsync.chooseFolder': 'เลือกโฟลเดอร์',
'docsync.noFolders': 'ยังไม่พบอะไรในอินสแตนซ์นี้',
'docsync.newFolderPlaceholder': 'ชื่อโฟลเดอร์ใหม่',
'docsync.syncNow': 'ซิงค์เลย',
'docsync.unlink': 'ตัดการเชื่อมต่อ',
'docsync.confirmUnlink': 'เอกสารจะยังคงอยู่ใน TREK และในที่จัดเก็บ มีเพียงการจับคู่ระหว่างกันเท่านั้นที่ถูกยกเลิก',
'docsync.syncEnabled': 'ซิงค์อัตโนมัติ',
'docsync.deletePolicy': 'เมื่อเอกสารถูกลบ',
'docsync.deleteUnlink': 'เก็บทั้งสองสำเนา',
'docsync.deleteTrash': 'ย้ายไปถังรีไซเคิล',
'docsync.conflictPolicy': 'เมื่อทั้งสองฝั่งมีการเปลี่ยนแปลง',
'docsync.onConflict.manual': 'ถามฉัน',
'docsync.onConflict.trek_wins': 'เก็บสำเนาของ TREK',
'docsync.onConflict.provider_wins': 'เก็บสำเนาของที่จัดเก็บ',
'docsync.webhookHint': 'วาง URL นี้ในผู้ให้บริการของคุณเพื่อให้การเปลี่ยนแปลงมาถึงทันที หากไม่มี TREK จะตรวจสอบตามรอบเวลา',
// Connection form fields. The keys mirror the `label` column in
// document_provider_fields, which stores a key suffix rather than text.
'docsync.providerUrl': 'ที่อยู่',
'docsync.providerApiToken': 'โทเค็น API',
'docsync.providerApiKey': 'คีย์ API',
'docsync.providerAppPassword': 'รหัสผ่านแอป',
'docsync.providerAppToken': 'โทเค็นแอป',
'docsync.providerUsername': 'ชื่อผู้ใช้',
'docsync.providerPassword': 'รหัสผ่าน',
'docsync.providerOrganization': 'ID องค์กร',
'docsync.providerBasePath': 'โฟลเดอร์หลัก',
'docsync.providerOTP': 'รหัสยืนยันสองขั้นตอน',
'docsync.allowInsecureTls': 'ยอมรับใบรับรองที่ลงนามด้วยตนเอง',
'docsync.hintPaperlessToken': 'สร้างได้ที่ My Profile ใน Paperless โทเค็นนี้มีสิทธิ์เต็มของบัญชีนั้น',
'docsync.hintPapraKey': 'สร้างได้ที่ API keys ใน Papra คีย์ของ Papra เข้าถึงทุกองค์กรที่คุณเป็นสมาชิกเสมอ',
'docsync.hintPapraOrg': 'ID org_… จากแถบที่อยู่ของ Papra',
'docsync.hintNextcloudLogin': 'ชื่อเข้าสู่ระบบ Nextcloud ของคุณ ไม่ใช่ที่อยู่อีเมล',
'docsync.hintNextcloudAppPassword': 'Settings, Security, Create new app password ห้ามใช้รหัสผ่านบัญชีของคุณ',
'docsync.hintOpenCloudToken': 'สร้างได้ที่ app tokens ใน OpenCloud',
'docsync.hintBasePath': 'ตำแหน่งที่ TREK ใช้ค้นหาโฟลเดอร์การเดินทาง ค่าเริ่มต้นคือ /TREK',
'docsync.hintSynologyUrl': 'ใส่พอร์ตด้วย เช่น https://nas.example.com:5001',
'docsync.hintSynologyUser': 'ควรใช้บัญชี DSM เฉพาะที่เข้าถึงได้เพียงโฟลเดอร์แชร์นี้',
'docsync.hintSynologyOtp': 'ต้องใช้เพียงครั้งเดียว หากบัญชีเปิดใช้การยืนยันตัวตนสองขั้นตอน',
'docsync.linkState.never': 'ยังไม่ได้ซิงค์',
'docsync.linkState.ok': 'ซิงค์ตรงกันแล้ว',
'docsync.linkState.partial': 'ซิงค์บางส่วน',
'docsync.linkState.failed': 'ล้มเหลว',
'docsync.linkState.needs_reauth': 'เข้าสู่ระบบอีกครั้ง',
'docsync.linkState.scope_lost': 'ไม่พบโฟลเดอร์แล้ว',
'docsync.linkState.orphaned': 'เจ้าของออกจากการเดินทางแล้ว',
'docsync.state.pending': 'รอดำเนินการ',
'docsync.state.synced': 'ซิงค์แล้ว',
'docsync.state.conflict': 'ขัดแย้ง',
'docsync.state.rejected_type': 'ไม่อนุญาตประเภทนี้',
'docsync.state.too_large': 'ใหญ่เกินไป',
'docsync.state.error': 'เกิดข้อผิดพลาด',
'docsync.state.remote_missing': 'ไม่พบที่ผู้ให้บริการ',
'docsync.state.local_deleted': 'ลบใน TREK แล้ว',
'docsync.state.scope_drift': 'ถูกย้ายออกจากโฟลเดอร์',
'docsync.conflict.resolve': 'แก้ไข {count} รายการ',
'docsync.conflict.title': 'ทั้งสองสำเนามีการเปลี่ยนแปลง',
'docsync.conflict.keepTrek': 'เก็บเวอร์ชันของ TREK',
'docsync.conflict.keepProvider': 'เก็บเวอร์ชันของผู้ให้บริการ',
'docsync.conflict.keepBoth': 'เก็บทั้งสอง',
// Failure reasons travel as codes, never as upstream text: a provider answers
// in English, or with a proxy's HTML login page, and neither belongs here.
'docsync.error.unreachable': 'ไม่สามารถติดต่อผู้ให้บริการได้',
'docsync.error.tls_untrusted': 'ใบรับรองถูกปฏิเสธ อนุญาตใบรับรองที่ลงนามด้วยตนเองหากคุณเชื่อถืออินสแตนซ์นี้',
'docsync.error.unauthorized': 'ข้อมูลเข้าสู่ระบบถูกปฏิเสธ',
'docsync.error.forbidden': 'บัญชีนี้ไม่ได้รับอนุญาตให้ทำสิ่งนั้น',
'docsync.error.not_found': 'ไม่พบที่ผู้ให้บริการ',
'docsync.error.scope_missing': 'โฟลเดอร์ที่เชื่อมต่อไม่มีอยู่แล้ว',
'docsync.error.rate_limited': 'ผู้ให้บริการกำลังจำกัดจำนวนคำขอ TREK จะลองอีกครั้งในภายหลัง',
'docsync.error.too_large': 'ไฟล์มีขนาดใหญ่เกินกว่าที่ผู้ให้บริการรับได้',
'docsync.error.unsupported_type': 'ผู้ให้บริการไม่รับไฟล์ประเภทนี้',
'docsync.error.quota_exceeded': 'พื้นที่ของผู้ให้บริการเต็มแล้ว',
'docsync.error.conflict': 'เอกสารมีการเปลี่ยนแปลงทั้งสองฝั่ง',
'docsync.error.checksum_mismatch': 'ข้อมูลที่ถ่ายโอนมาไม่สมบูรณ์',
'docsync.error.provider_error': 'ผู้ให้บริการรายงานข้อผิดพลาด',
'docsync.error.timeout': 'ผู้ให้บริการใช้เวลาตอบนานเกินไป',
'docsync.error.ssrf_blocked': 'ไม่อนุญาตที่อยู่นี้',
'docsync.error.mass_delete_guard': 'เอกสารส่วนใหญ่หายไปพร้อมกัน จึงไม่มีการเปลี่ยนแปลงใดๆ โปรดตรวจสอบว่าโฟลเดอร์ยังเมานต์อยู่',
'docsync.error.unknown': 'มีบางอย่างผิดพลาด',
// ── The dialog ─────────────────────────────────────────────────────────────
'docsync.sidebar.connected': 'ทริปนี้',
'docsync.addAnother': 'เพิ่มอีกอัน',
'docsync.syncing': 'กำลังซิงค์',
'docsync.card.pickFolder': 'เชื่อมต่อแล้ว โปรดเลือกโฟลเดอร์',
'docsync.empty.title': 'ยังไม่ได้เชื่อมต่อ',
'docsync.empty.hintOwner': 'เลือกที่จัดเก็บทางซ้าย TREK เก็บสำเนาของทุกอย่างไว้เอง จึงไม่มีอะไรสูญหายหากที่จัดเก็บนั้นหายไป',
'docsync.empty.hintMember': 'เจ้าของการเดินทางเป็นผู้ตั้งค่านี้ ไม่ว่าอย่างไรเอกสารก็ยังคงอยู่ใน TREK',
// How each product files things. Shown before anyone connects, because it is
// what the next screen will ask for.
'docsync.model.paperless': 'ไฟล์ตามแท็ก',
'docsync.model.papra': 'ไฟล์ตามแท็ก ภายในองค์กร',
'docsync.model.nextcloud': 'ไฟล์ในโฟลเดอร์',
'docsync.model.opencloud': 'ไฟล์ในสเปซ',
'docsync.model.synologydrive': 'ไฟล์ในโฟลเดอร์บน NAS',
// ── The flow bar ───────────────────────────────────────────────────────────
'docsync.flow.trek': 'TREK',
'docsync.flow.toProvider': 'ส่งออกไปยังที่จัดเก็บ',
'docsync.flow.toTrek': 'รับเข้าจากที่จัดเก็บ',
'docsync.flow.documents': 'เอกสาร',
'docsync.flow.summary.both': 'เอกสารเคลื่อนย้ายทั้งสองทาง',
'docsync.flow.summary.pull': 'เอกสารรับเข้าเท่านั้น',
'docsync.flow.summary.push': 'เอกสารส่งออกเท่านั้น',
'docsync.flow.summaryEditable.both': 'เคลื่อนย้ายทั้งสองทาง แตะช่องทางเพื่อหยุด',
'docsync.flow.summaryEditable.pull': 'รับเข้าเท่านั้น แตะอีกช่องทางเพื่อส่งออกด้วย',
'docsync.flow.summaryEditable.push': 'ส่งออกเท่านั้น แตะอีกช่องทางเพื่อรับเข้าด้วย',
// ── One binding ────────────────────────────────────────────────────────────
'docsync.binding.settings': 'การตั้งค่า',
'docsync.binding.folder': 'โฟลเดอร์',
'docsync.binding.lastRun': 'ทำงานล่าสุด',
'docsync.binding.autoOff': 'หยุดชั่วคราว',
'docsync.binding.neverRun': 'ยังไม่เคยทำงาน',
'docsync.binding.deleteHint': 'สิ่งที่จะเกิดกับสำเนาอีกฝั่ง',
'docsync.binding.conflictHint': 'สำเนาใดจะถูกเก็บไว้เมื่อเอกสารถูกแก้ไขทั้งสองที่',
'docsync.binding.autoHint': 'ตรวจสอบการเปลี่ยนแปลงในเบื้องหลัง',
'docsync.binding.webhookTitle': 'อัปเดตทันที',
'docsync.binding.copy': 'คัดลอก',
'docsync.binding.copied': 'คัดลอกแล้ว',
// ── Connecting ─────────────────────────────────────────────────────────────
'docsync.connect.submit': 'เชื่อมต่อ',
'docsync.connect.testing': 'กำลังพยายามติดต่อ',
'docsync.connect.okAs': 'ติดต่อได้แล้ว เข้าสู่ระบบในชื่อ {account}',
'docsync.connect.insecureHint': 'สำหรับอินสแตนซ์บนเครือข่ายของคุณเองที่ใช้ใบรับรองที่ลงนามด้วยตนเอง',
'docsync.connect.about.paperless': 'TREK จัดเก็บการเดินทางนี้ภายใต้แท็กของตัวเอง และไม่แตะส่วนอื่นในคลังเอกสารของคุณ',
'docsync.connect.about.papra': 'เลือกองค์กรที่การเดินทางนี้สังกัด TREK จะจัดเก็บไว้ภายใต้แท็กของตัวเองในองค์กรนั้น',
'docsync.connect.about.nextcloud': 'ใช้รหัสผ่านแอป ไม่ใช่รหัสผ่านบัญชี: ใช้งานได้แม้เปิดการยืนยันสองขั้นตอน และเพิกถอนแยกได้',
'docsync.connect.about.opencloud': 'TREK จะได้สเปซของตัวเองสำหรับการเดินทางนี้ แยกจากทุกอย่าง',
'docsync.connect.about.synologydrive': 'ควรใช้บัญชี DSM ที่เข้าถึงได้เพียงโฟลเดอร์แชร์ที่การเดินทางนี้ใช้',
// ── Picking the container ──────────────────────────────────────────────────
'docsync.scope.title': 'ควรเก็บการเดินทางนี้ไว้ที่ใดใน {provider}',
'docsync.scope.intro': 'จะซิงค์เฉพาะสิ่งที่อยู่ในนี้ สิ่งอื่นในที่จัดเก็บของคุณจะไม่เข้ามาใน TREK',
'docsync.scope.createTitle': 'สร้างใหม่',
'docsync.scope.createAction': 'สร้าง',
'docsync.scope.pickTitle': 'หรือใช้ที่คุณมีอยู่แล้ว',
'docsync.scope.search': 'ค้นหา',
'docsync.scope.noMatch': 'ไม่มีอะไรตรงกับสิ่งนั้น',
// ── Things a person has to decide ──────────────────────────────────────────
'docsync.issues.title': 'ต้องตรวจสอบ',
'docsync.issues.conflict': 'มีการเปลี่ยนแปลงทั้งสองที่ เลือกว่าจะเก็บอันไหน',
'docsync.issues.remote_missing': 'หายไปจากที่จัดเก็บ สำเนาใน TREK ยังอยู่',
'docsync.issues.rejected_type': 'ไม่อนุญาตไฟล์ประเภทนี้ที่นี่',
'docsync.issues.too_large': 'ใหญ่เกินขีดจำกัด',
'docsync.issues.error': 'การถ่ายโอนไม่สำเร็จ',
'docsync.error.unknown_provider': 'ผู้ให้บริการนี้ไม่พร้อมใช้งานในอินสแตนซ์นี้',
'docsync.error.provider_disabled': 'หยุดชั่วคราว: ผู้ดูแลระบบปิดผู้ให้บริการนี้ การซิงค์จะกลับมาทำงานเมื่อเปิดอีกครั้ง',
'docsync.binding.reconnect': 'เชื่อมต่อใหม่',
};
export default docsync;
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -1,4 +1,6 @@
import admin from './admin';
import dawarich from './dawarich';
import docsync from './docsync';
import airport from './airport';
import atlas from './atlas';
import backup from './backup';
@@ -8,7 +10,6 @@ import collab from './collab';
import collection from './collection';
import common from './common';
import dashboard from './dashboard';
import dawarich from './dawarich';
import day from './day';
import dayplan from './dayplan';
import files from './files';
@@ -108,5 +109,6 @@ const locale = {
...mobileCollections,
...storage,
...dawarich,
...docsync,
};
export default locale;
+2
View File
@@ -28,6 +28,8 @@ const login: TranslationStrings = {
'login.oidcSignIn': "ลงชื่อเข้าใช้ด้วย {name}",
'login.oidcOnly': "การตรวจสอบรหัสผ่านถูกปิดใช้งาน โปรดลงชื่อเข้าใช้โดยใช้ผู้ให้บริการ SSO ของคุณ",
'login.oidcLoggedOut': "คุณออกจากระบบแล้ว ลงชื่อเข้าใช้อีกครั้งโดยใช้ผู้ให้บริการ SSO ของคุณ",
'login.oidcRedirecting': 'กำลังพาคุณไปที่ {name}…',
'login.oidcRedirectSlow': 'ยังอยู่ที่นี่ใช่ไหม? ไปต่อที่ {name}',
'login.demoHint': "ลองสาธิต — ไม่ต้องลงทะเบียน",
'login.mfaTitle': "การรับรองความถูกต้องด้วยสองปัจจัย",
'login.mfaSubtitle': "ป้อนรหัส 6 หลักจากแอปยืนยันตัวตนของคุณ",
+2
View File
@@ -26,5 +26,7 @@ const map: TranslationStrings = {
'map.overview.hide': "ซ่อนทั้งทริป",
'map.overview.total': "ระยะทางรวม",
'map.attribution': "เครดิตแผนที่",
'map.overview.unrouted': 'มี {count} ช่วงที่คำนวณเส้นทางไม่ได้ ระยะทางจึงไม่ครบถ้วน',
'map.overview.dayUnrouted': 'มี {count} ช่วงของวันนี้ที่คำนวณเส้นทางไม่ได้',
};
export default map;
+2
View File
@@ -65,5 +65,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtNoneOnStage': "ไม่มีสิ่งนั้นตลอดช่วงเส้นทางนี้",
'mobileTrip.rtTruncated.one': "มี 1 ช่วงที่มีผลลัพธ์มากเกินกว่าจะแสดงในคำตอบเดียว เลือกประเภทให้น้อยลงเพื่อดูที่เหลือ",
'mobileTrip.rtTruncated.other': "มี {count} ช่วงที่มีผลลัพธ์มากเกินกว่าจะแสดงในคำตอบเดียว เลือกประเภทให้น้อยลงเพื่อดูที่เหลือ",
'mobileTrip.rtNoDay': 'ยังไม่ได้เลือกวัน',
'mobileTrip.rtNoDayHint': 'แผนที่แสดงทั้งการเดินทาง แตะวันด้านบนเพื่อดูเส้นทางขับรถของวันนั้น',
};
export default mobileTrip;
-126
View File
@@ -26,9 +26,6 @@ const packing: TranslationStrings = {
'packing.progress': "จัดแล้ว {packed} จาก {total} รายการ ({percent}%)",
'packing.clearChecked': "ลบ {count} ที่เลือกไว้",
'packing.clearCheckedShort': "ลบ {count}",
'packing.suggestions': "ข้อเสนอแนะ",
'packing.suggestionsTitle': "เพิ่มคำแนะนำ",
'packing.allSuggested': "เพิ่มข้อเสนอแนะทั้งหมดแล้ว",
'packing.allPacked': "จัดครบแล้ว!",
'packing.addPlaceholder': "เพิ่มรายการใหม่...",
'packing.categoryPlaceholder': "รายการ...",
@@ -36,7 +33,6 @@ const packing: TranslationStrings = {
'packing.filterOpen': "ยังไม่ได้จัด",
'packing.filterDone': "เสร็จแล้ว",
'packing.emptyTitle': "รายการจัดกระเป๋าว่างเปล่า",
'packing.emptyHint': "เพิ่มรายการหรือใช้คำแนะนำ",
'packing.emptyFiltered': "ไม่มีรายการที่ตรงกับตัวกรองนี้",
'packing.menuRename': "เปลี่ยนชื่อ",
'packing.menuCheckAll': "ทำเครื่องหมายทั้งหมดว่าจัดแล้ว",
@@ -85,128 +81,6 @@ const packing: TranslationStrings = {
'packing.toast.deleteError': "ลบไม่สำเร็จ",
'packing.toast.renameError': "เปลี่ยนชื่อไม่สำเร็จ",
'packing.toast.addError': "เพิ่มไม่สำเร็จ",
'packing.suggestions.items': [
{
name: "หนังสือเดินทาง",
category: "เอกสาร",
},
{
name: "บัตรประจำตัวประชาชน",
category: "เอกสาร",
},
{
name: "ประกันการเดินทาง",
category: "เอกสาร",
},
{
name: "ตั๋วเครื่องบิน",
category: "เอกสาร",
},
{
name: "บัตรเครดิต",
category: "การเงิน",
},
{
name: "เงินสด",
category: "การเงิน",
},
{
name: "วีซ่า",
category: "เอกสาร",
},
{
name: "เสื้อยืด",
category: "เสื้อผ้า",
},
{
name: "กางเกง",
category: "เสื้อผ้า",
},
{
name: "ชุดชั้นใน",
category: "เสื้อผ้า",
},
{
name: "ถุงเท้า",
category: "เสื้อผ้า",
},
{
name: "แจ็คเก็ต",
category: "เสื้อผ้า",
},
{
name: "ชุดนอน",
category: "เสื้อผ้า",
},
{
name: "ชุดว่ายน้ำ",
category: "เสื้อผ้า",
},
{
name: "เสื้อกันฝน",
category: "เสื้อผ้า",
},
{
name: "รองเท้าที่ใส่สบาย",
category: "เสื้อผ้า",
},
{
name: "แปรงสีฟัน",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "ยาสีฟัน",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "แชมพู",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "ยาระงับกลิ่นกาย",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "ครีมกันแดด",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "มีดโกน",
category: "เครื่องใช้ในห้องน้ำ",
},
{
name: "ที่ชาร์จ",
category: "อิเล็กทรอนิกส์",
},
{
name: "พาวเวอร์แบงค์",
category: "อิเล็กทรอนิกส์",
},
{
name: "หูฟัง",
category: "อิเล็กทรอนิกส์",
},
{
name: "อะแดปเตอร์สำหรับการเดินทาง",
category: "อิเล็กทรอนิกส์",
},
{
name: "กล้อง",
category: "อิเล็กทรอนิกส์",
},
{
name: "ยาแก้ปวด",
category: "สุขภาพ",
},
{
name: "พลาสเตอร์ยา",
category: "สุขภาพ",
},
{
name: "ยาฆ่าเชื้อ",
category: "สุขภาพ",
},
],
'packing.bagLimit': "จำกัดน้ำหนัก",
'packing.setBagLimit': "กำหนดขีดจำกัด",
};
+1
View File
@@ -83,6 +83,7 @@ const places: TranslationStrings = {
'places.reservationNotesPlaceholder': "บันทึกการจอง เลขที่ยืนยัน...",
'places.mapsSearchPlaceholder': "ค้นหาสถานที่...",
'places.mapsSearchError': "การค้นหาสถานที่ล้มเหลว",
'places.searchGoogleInstead': 'ไม่ใช่สถานที่ที่ต้องการใช่ไหม ค้นหาด้วย Google แทน',
'places.loadingDetails': "กำลังโหลดรายละเอียดสถานที่...",
'places.osmHint':
"ใช้การค้นหา OpenStreetMap (ไม่มีรูปภาพ เวลาทำการ หรือการให้คะแนน) เพิ่มคีย์ Google API ในการตั้งค่าเพื่อดูรายละเอียดทั้งหมด",
-1
View File
@@ -10,7 +10,6 @@ const reservations: TranslationStrings = {
'reservations.confirmed': "ยืนยันแล้ว",
'reservations.pending': "รอดำเนินการ",
'reservations.summary': "{confirmed} ยืนยันแล้ว {pending} รอดำเนินการ",
'reservations.fromPlan': "จากแผน",
'reservations.showFiles': "แสดงไฟล์",
'reservations.editTitle': "แก้ไขการจอง",
'reservations.status': "สถานะ",
+55 -1
View File
@@ -48,7 +48,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.window.showPoint': "แสดงบนแผนที่",
'roadtrip.window.incomplete': "ยังคำนวณช่วงพักรายวันไม่ได้จนกว่าจะมีเส้นทางเชื่อมต่อครบ",
'roadtrip.window.conflict': "เวลาที่กำหนดขัดกับการขับรถและช่วงพักรายวัน เวลาที่กำหนดเองจะไม่เปลี่ยน แต่การจัดตารางอัตโนมัติถูกพักไว้",
'roadtrip.window.tooLong': "เวลาเดินทางนี้ต้องใช้วันเพิ่มมากกว่า 365 วัน เลือกกรอบเวลารายวันที่นานขึ้น",
'roadtrip.window.tooLong': "เวลาเดินทางเหล่านี้จะต้องใช้วันเพิ่มมากกว่า {days} วัน เลือกกรอบเวลารายวันที่นานขึ้น",
'roadtrip.mode.roadtrip': "โรดทริป",
'roadtrip.mode.days': "วัน",
'roadtrip.mode.label': "มุมมองแผน",
@@ -108,6 +108,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.line.connect': "เชื่อมต่อวัน",
'roadtrip.line.dayColors': "สีแยกตามวัน",
'roadtrip.line.hint': "การขับรถเชื่อมต่อจะนับรวมในวันที่เดินทางถึง",
'roadtrip.line.hotelBookends': 'เริ่มและจบแต่ละวันที่ที่พักของคุณ',
'roadtrip.line.hotelBookendsHint': 'หลังคืนที่จองไว้ วันนั้นจะเริ่มที่ที่พักนั้น และก่อนคืนที่จองไว้ วันนั้นจะจบที่ที่พักที่จองไว้สำหรับคืนนั้น',
'roadtrip.avoid.section': "หลีกเลี่ยงเมื่อทำได้",
'roadtrip.avoid.toll': "ถนนเก็บค่าผ่านทาง",
'roadtrip.avoid.motorway': "ทางด่วน",
@@ -207,6 +209,15 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.slower': "ช้ากว่า {time}",
'roadtrip.alt.quicker': "เร็วกว่า {time}",
'roadtrip.alt.otherEngine': "ใช้เวลาจากระบบนำทางสำหรับการหลีกเลี่ยง ไม่ใช่ระบบหลัก",
'roadtrip.alt.notHeld': 'ตัวคำนวณเส้นทางของโรดทริปจะไม่ใช้เส้นทางนี้ จึงไม่ได้บันทึก',
'roadtrip.alt.ferryNotHeld':
'เส้นทางนี้ข้ามด้วยเรือเฟอร์รี่ เพิ่มเรือเฟอร์รี่เป็นการจองการขนส่ง แล้วเส้นทางขับรถจะไปตามนั้น หากเรือถึงในวันถัดไป ให้ใส่จุดแวะฝั่งตรงข้ามไว้ในวันนั้น',
'roadtrip.alt.legChanged': 'ช่วงนี้มีการเปลี่ยนแปลงระหว่างตรวจสอบเส้นทาง จึงไม่ได้บันทึกอะไร',
'roadtrip.alt.offline': 'เส้นทางอื่นบันทึกได้เฉพาะเมื่อออนไลน์ เชื่อมต่อใหม่เพื่อใช้เส้นทางนี้',
'roadtrip.alt.otherEngineStandard': 'เวลาคำนวณโดยตัวคำนวณเส้นทางหลัก ไม่ใช่ตัวที่ใช้วางแผนช่วงนี้',
'roadtrip.alt.avoidNotHeld': 'โรดทริปจะใช้เส้นทางนี้ก็ต่อเมื่อติ๊ก “{class}” ไว้ใน “{setting}” ในการตั้งค่า',
'roadtrip.alt.checking': 'กำลังตรวจสอบเส้นทางนี้ด้วยตัวคำนวณเส้นทางของโรดทริป…',
'roadtrip.alt.standIn': 'ตัวคำนวณเส้นทางแบบหลีกเลี่ยงไม่ตอบสำหรับช่วงนี้ ตัวคำนวณเส้นทางหลักจึงวาดแทน กำลังถามอีกครั้ง',
'roadtrip.day': "วันที่ {number}",
'roadtrip.quietDay.empty': "ยังไม่มีจุดแวะ — วางจุดแวะที่นี่",
'roadtrip.quietDay.one': "ตอนนี้มีเพียง {name} — วางจุดแวะที่นี่",
@@ -221,6 +232,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.stop.fillDefault': "ใช้ค่าเริ่มต้นของฉัน",
'roadtrip.stop.fillSet': "กำหนดระดับการเติมของจุดแวะนี้",
'roadtrip.leg.pending': "ยังไม่มีเส้นทาง",
'roadtrip.leg.arrivingFrom': 'จาก {name}',
'roadtrip.stop.addTitle': "เพิ่มเป็นจุดแวะ",
'roadtrip.stop.kind': "ประเภทจุดแวะ",
'roadtrip.stop.landsOn': "วันที่ {day} จุดแวะที่ {position}",
@@ -229,8 +241,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.stop.stay': "เวลาที่จุดแวะนี้",
'roadtrip.stop.pinned': "เวลาที่คุณกำหนด",
'roadtrip.stop.computed': "คำนวณจากการขับรถ",
'roadtrip.stop.endIsLeave': 'ในโรดทริป รถจะออกเดินทางเวลานี้',
'roadtrip.via.hint': "ลากเพื่อปรับเส้นทาง คลิกขวาเพื่อลบ",
'roadtrip.warn.late': "ถึงช้ากว่าเวลาที่กำหนด {minutes} นาที",
'roadtrip.warn.missedLeave': 'ถึงช้ากว่าเวลาที่คุณตั้งไว้ว่าจะออก {minutes} นาที',
'roadtrip.warn.overnight': "วันถัดไป",
'roadtrip.spill.title': "จากวันที่ {number}",
'roadtrip.spill.departs': "ออกเวลา {time}",
@@ -240,10 +254,50 @@ const roadtrip: TranslationStrings = {
'roadtrip.stay.custom': "นาที",
'roadtrip.stay.arrive': "ถึง",
'roadtrip.stay.leave': "ออก",
'roadtrip.stay.until': 'จนถึง {time}',
'roadtrip.stay.leavesAt': 'การแวะนี้มีเวลาสิ้นสุด รถจึงออกเดินทางเวลา {time}',
'roadtrip.stay.dayEndsFirst': 'วันเดินทางสิ้นสุดก่อน {time} จึงขับต่อในเช้าวันถัดไป',
'roadtrip.stay.clearLeave': 'ลบเวลาสิ้นสุด',
'roadtrip.alt.noMotorway': "ไม่มีทางด่วน",
'roadtrip.alt.noToll': "ไม่มีค่าผ่านทาง",
'roadtrip.alt.noFerry': "ไม่มีเรือเฟอร์รี่",
'roadtrip.summary.partial': "กำลังคำนวณเวลาขับรถส่วนที่เหลือ",
'roadtrip.stay.releaseTitle': 'ยกเลิกการค้างคืนใช่ไหม',
'roadtrip.stay.releaseBody': 'คืนที่ “{name}” จะถูกลบ จุดแวะยังคงอยู่ในเส้นทางขับรถเป็นจุดหยุดพัก',
'roadtrip.stay.releaseBookedBody':
'คืนที่ “{name}” จะถูกลบพร้อมกับการจอง “{booking}” และค่าใช้จ่ายที่ผูกไว้ จุดแวะยังคงอยู่ในเส้นทางขับรถเป็นจุดหยุดพัก',
'roadtrip.stay.releaseAction': 'เปลี่ยนเป็นจุดหยุดพัก',
'roadtrip.ride.departure': 'ออกเดินทาง {time}',
'roadtrip.ride.arrival': 'มาถึง {time}',
'roadtrip.ride.pickup': 'รับ {time}',
'roadtrip.ride.return': 'กลับ {time}',
'roadtrip.ride.open': 'เปิดการจอง',
'roadtrip.ride.undated': '{title} ไม่อยู่ในวันใดของการเดินทางนี้ เส้นทางขับรถจึงไม่ใช้รายการนี้',
'roadtrip.bookings.loose': 'จองไว้ในวันนี้ด้วย',
'roadtrip.ride.departureFlight': 'ออกเดินทาง {time}',
'roadtrip.ride.duration': 'ระยะเวลาตามการจอง',
'roadtrip.ride.checkIn': 'เช็คอิน',
'roadtrip.ride.boarding': 'ขึ้นโดยสาร',
'roadtrip.ride.missed': 'พลาด',
'roadtrip.ride.lateBy': 'สาย {time}',
'roadtrip.ride.reachedAt': 'ถึงเวลา {time}',
'roadtrip.ride.hintFlight': '{title} ออกเดินทางเวลา {departs} ปิดเช็คอินเวลา {pin}',
'roadtrip.ride.hintShip': '{title} ออกเรือเวลา {departs} ปิดเช็คอินเวลา {pin}',
'roadtrip.ride.hintBoarding': '{title} ออกเดินทางเวลา {departs} ขึ้นโดยสารภายใน {pin}',
'roadtrip.ride.lateHintFlight': 'รถถึง {place} เวลา {time} {title} ออกเดินทางเวลา {departs} ปิดเช็คอินเวลา {pin}',
'roadtrip.ride.lateHintShip': 'รถถึง {place} เวลา {time} {title} ออกเรือเวลา {departs} ปิดเช็คอินเวลา {pin}',
'roadtrip.ride.lateHintBoarding': 'รถถึง {place} เวลา {time} {title} ออกเดินทางเวลา {departs} ขึ้นโดยสารภายใน {pin}',
'roadtrip.day.rideMissed.flight': 'พลาดเที่ยวบิน',
'roadtrip.day.rideMissed.train': 'พลาดรถไฟ',
'roadtrip.day.rideMissed.ferry': 'พลาดเรือเฟอร์รี่',
'roadtrip.day.rideMissed.cruise': 'พลาดการล่องเรือ',
'roadtrip.day.rideMissed.bus': 'พลาดรถบัส',
'roadtrip.bookend.checkOut': 'เช็คเอาท์',
'roadtrip.bookend.from': 'เริ่มวัน',
'roadtrip.bookend.back': 'ค้างคืน',
'roadtrip.bookend.checkIn': 'เช็คอิน',
'roadtrip.bookend.afterCheckOut': 'ออกหลังเช็คเอาท์',
'roadtrip.bookend.noVia': 'ไม่มีจุดผ่านบนเส้นทางไปหรือกลับจากที่พักของคุณ ให้เพิ่มจุดแวะที่นั่นแทน',
};
export default roadtrip;
+3
View File
@@ -55,6 +55,9 @@ const system_notice: TranslationStrings = {
'system_notice.pager.counter': "{current} / {total}",
'system_notice.pager.goto': "ไปที่ประกาศ {n}",
'system_notice.pager.position': "ประกาศ {current} จาก {total}",
'system_notice.release_notes.feature_docsync_title': 'ซิงค์เอกสาร',
'system_notice.release_notes.feature_docsync_body':
'Paperless-ngx, Papra, Nextcloud, OpenCloud และ Synology Drive เอกสารของการเดินทางซิงค์ได้ทั้งสองทางกับที่จัดเก็บที่คุณใช้อยู่แล้ว',
'system_notice.release_notes.eyebrow': "ติดตั้งอัปเดตแล้ว",
'system_notice.release_notes.headline': "สามสิ่งที่ TREK ทำได้ด้วยตัวเองแล้ว",
'system_notice.release_notes.intro': "API สถานที่ของตัวเอง การวางแผนโรดทริปตั้งแต่ต้นจนจบ และประวัติตำแหน่งของคุณกลับมาอยู่ในมือคุณ",
+3
View File
@@ -86,6 +86,9 @@ const trip: TranslationStrings = {
'transit.transfersLabel': "การเปลี่ยนขบวน",
'transit.walkLabel': "เดิน",
'transit.searchHint': "ค้นหาการเชื่อมต่อจริงและเพิ่มโดยตรงไปยังวัน — ข้อมูลผ่าน Transitous",
'trip.confirm.deletePlaceNight': 'การดำเนินการนี้จะลบการพักที่จองไว้ที่ “{name}” ด้วย',
'trip.confirm.deletePlaceBooked': 'การดำเนินการนี้จะลบการพักที่จองไว้ที่ “{name}” การจอง “{booking}” และค่าใช้จ่ายที่ผูกไว้ด้วย',
'trip.confirm.deletePlaceBookedSame': 'การดำเนินการนี้จะลบการพักที่จองไว้ที่ “{name}” รวมถึงการจองและค่าใช้จ่ายที่ผูกไว้ด้วย',
'trip.toast.loadError': "ไม่สามารถโหลดทริปได้",
'transit.noResultsVia': "ไม่พบเส้นทางผ่าน {provider} ลองเปลี่ยนเวลาหรือตัวกรอง",
};
+1
View File
@@ -20,5 +20,6 @@ const undo: TranslationStrings = {
'undo.importBooking': "การนำเข้าการยืนยันการจอง",
'undo.addPlace': "เพิ่มสถานที่แล้ว",
'undo.done': "เลิกทำ: {action}",
'undo.failed': 'ไม่สามารถเลิกทำ: {action}',
};
export default undo;
+1
View File
@@ -118,6 +118,7 @@ You can set `DEFAULT_LANGUAGE` to any of the 23 languages TREK ships. The curren
| `id` | Bahasa Indonesia |
| `ja` | 日本語 |
| `ko` | 한국어 |
| `th` | ไทย |
| `uk` | Українська |
| `gr` | Ελληνικά |
| `sv` | Svenska |
+1
View File
@@ -27,6 +27,7 @@ TREK ships with translations for 23 languages. You can change your language at a
| `id` | Bahasa Indonesia |
| `ja` | 日本語 |
| `ko` | 한국어 |
| `th` | ไทย |
| `uk` | Українська |
| `gr` | Ελληνικά |
| `sv` | Svenska |