-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathen.json
More file actions
1218 lines (1218 loc) · 76.9 KB
/
Copy pathen.json
File metadata and controls
1218 lines (1218 loc) · 76.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"@astryx.pagination.label": {
"defaultMessage": "Pagination",
"description": "Aria label for the pagination navigation region."
},
"@astryx.pagination.previous": {
"defaultMessage": "Go to previous page",
"description": "Aria label for the previous-page button."
},
"@astryx.pagination.next": {
"defaultMessage": "Go to next page",
"description": "Aria label for the next-page button."
},
"@astryx.pagination.previousBy": {
"defaultMessage": "Go back {step, number} {step, plural, one {page} other {pages}}",
"description": "Aria label for the previous button when it advances more than one page per click (the `step` prop > 1). `step` is the number of pages skipped."
},
"@astryx.pagination.nextBy": {
"defaultMessage": "Go forward {step, number} {step, plural, one {page} other {pages}}",
"description": "Aria label for the next button when it advances more than one page per click (the `step` prop > 1). `step` is the number of pages skipped."
},
"@astryx.pagination.first": {
"defaultMessage": "Go to first page",
"description": "Aria label for the first-page button (« double chevron) in the input pagination variant."
},
"@astryx.pagination.last": {
"defaultMessage": "Go to last page",
"description": "Aria label for the last-page button (» double chevron) in the input pagination variant."
},
"@astryx.pagination.goToPage": {
"defaultMessage": "Go to page {page, number}",
"description": "Aria label for an individual page-number button. `page` is 1-based."
},
"@astryx.pagination.goToPageInput": {
"defaultMessage": "Go to page",
"description": "Aria label for the editable page/row number box in the input pagination variant. No number — the box holds the value itself."
},
"@astryx.pagination.pageLabel": {
"defaultMessage": "Page",
"description": "Visible label before the editable box in the input pagination variant. Example: \"Page [ 1 ] / 10\"."
},
"@astryx.pagination.ofTotalPages": {
"defaultMessage": "/ {total, number}",
"description": "Visible total shown after the editable box in the input pagination variant. Example: the \"/ 10\" in \"Page [ 1 ] / 10\"."
},
"@astryx.pagination.pageIndicators": {
"defaultMessage": "Page indicators",
"description": "Aria label for the dots-variant page-indicator group."
},
"@astryx.pagination.itemsPerPage": {
"defaultMessage": "Items per page",
"description": "Label for the page-size selector."
},
"@astryx.pagination.count": {
"defaultMessage": "{from, number}–{to, number} of {total, number}",
"description": "Visible range-of-total text on a pagination bar. Example: \"1–20 of 347\"; the en-dash is translator's choice."
},
"@astryx.pagination.pageOfTotal": {
"defaultMessage": "Page {current, number} of {total, number}",
"description": "Visible \"Page X of Y\" text on the compact pagination variant; also announced by screen readers. Keep short — sits in a compact toolbar."
},
"@astryx.pagination.pageAnnounce": {
"defaultMessage": "Page {current, number}",
"description": "Screen-reader announcement when a page changes and total is unknown."
},
"@astryx.powersearch.editor.field": {
"defaultMessage": "Field",
"description": "Noun form-label above the field-picker dropdown in the PowerSearch filter-builder popover (which data column to filter on). Not an action."
},
"@astryx.powersearch.editor.operator": {
"defaultMessage": "Operator",
"description": "Noun form-label above the operator dropdown in the PowerSearch filter-builder popover. Refers to a comparison verb (\"is\", \"contains\"), not a math or phone operator."
},
"@astryx.powersearch.editor.addFilter": {
"defaultMessage": "+ Add filter",
"description": "Button label inside a group in the PowerSearch filter-builder; adds another filter row (e.g. \"Status = Active\"). The leading \"+ \" is a plus-sign character."
},
"@astryx.powersearch.editor.removeFilter": {
"defaultMessage": "Remove filter",
"description": "Screen-reader-only label on the \"×\" icon button next to a filter row in the PowerSearch editor; removes that row. Imperative verb."
},
"@astryx.powersearch.editor.groupOperator": {
"defaultMessage": "Group operator",
"description": "Screen-reader-only label for the AND/OR toggle that combines sibling filters inside a filter group. Sighted users see just \"AND\" or \"OR\"."
},
"@astryx.powersearch.editor.group": {
"defaultMessage": "Group",
"description": "Fallback noun label shown on a nested filter-group chip when no AND/OR combining operator has been chosen. Use the noun (\"a cluster\"), not the verb \"to group\"."
},
"@astryx.powersearch.editor.delete": {
"defaultMessage": "Delete",
"description": "Button label inside the PowerSearch filter-editor popover; deletes the currently-edited filter row. Imperative verb form."
},
"@astryx.powersearch.editor.cancel": {
"defaultMessage": "Cancel",
"description": "Button label inside the PowerSearch filter-editor popover; closes the popover and discards pending edits. Imperative verb form."
},
"@astryx.powersearch.editor.apply": {
"defaultMessage": "Apply",
"description": "Primary button label inside the PowerSearch filter-editor popover; confirms the edited filter. Imperative verb; consumers may override to \"Save\"."
},
"@astryx.powersearch.valueEditor.value": {
"defaultMessage": "Value",
"description": "Noun form-label above a single free-text/number input in the PowerSearch value editor (e.g. the \"acme\" in `Name contains acme`). Not a verb or \"worth\"."
},
"@astryx.powersearch.valueEditor.values": {
"defaultMessage": "Values",
"description": "Plural noun form-label above a multi-value chip input in the PowerSearch value editor. Should match its singular counterpart `Value` in your language."
},
"@astryx.powersearch.valueEditor.time": {
"defaultMessage": "Time",
"description": "Noun form-label above a time-of-day (HH:MM) picker in the PowerSearch value editor. Clock time, not duration or era."
},
"@astryx.powersearch.valueEditor.date": {
"defaultMessage": "Date",
"description": "Noun form-label above a calendar-date picker in the PowerSearch value editor. Calendar date, not romantic date or fruit."
},
"@astryx.powersearch.valueEditor.relativeDate": {
"defaultMessage": "Relative date",
"description": "Label for the relative-date selector (e.g. \"Last 7 days\") in the PowerSearch value editor."
},
"@astryx.powersearch.valueEditor.startDate": {
"defaultMessage": "Start date",
"description": "Noun form-label above the start-of-range date picker in the PowerSearch value editor. Pairs with `End date` — keep the two parallel in your language."
},
"@astryx.powersearch.valueEditor.endDate": {
"defaultMessage": "End date",
"description": "Noun form-label above the end-of-range date picker in the PowerSearch value editor. Pairs with `Start date` — keep the two parallel."
},
"@astryx.powersearch.valueEditor.entities": {
"defaultMessage": "Entities",
"description": "\"Entities\" is jargon — plural noun form-label above an entity picker (people, teams, projects). Prefer a natural collective like \"items\" if your language has no equivalent."
},
"@astryx.powersearch.valueEditor.searchPlaceholder": {
"defaultMessage": "Search…",
"description": "Placeholder inside the search input in the PowerSearch entity/typeahead picker. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.valueEditor.enterValuePlaceholder": {
"defaultMessage": "Enter value…",
"description": "Placeholder inside a free-text single-value input in the PowerSearch value editor. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.valueEditor.addValuesPlaceholder": {
"defaultMessage": "Add values…",
"description": "Placeholder inside a multi-value chip input where the user types items and presses Enter to add each as a chip. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.valueEditor.enterNumberPlaceholder": {
"defaultMessage": "Enter number…",
"description": "Placeholder inside a numeric input in the PowerSearch value editor. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.valueEditor.selectValuesPlaceholder": {
"defaultMessage": "Select values…",
"description": "Placeholder on a dropdown for choosing values from a fixed enum list in the PowerSearch value editor. Imperative verb (user selects, not types)."
},
"@astryx.powersearch.operator.contains": {
"defaultMessage": "contains",
"description": "PowerSearch string operator, rendered inline as `<field> contains <value>` (e.g. `Name contains acme`). Lowercase verb form."
},
"@astryx.powersearch.operator.notContains": {
"defaultMessage": "does not contain",
"description": "PowerSearch negated string operator. Example: `Name does not contain test`. Lowercase; pairs with `contains`."
},
"@astryx.powersearch.operator.startsWith": {
"defaultMessage": "starts with",
"description": "PowerSearch string prefix operator. Example: `Email starts with admin@`. Lowercase."
},
"@astryx.powersearch.operator.notStartsWith": {
"defaultMessage": "does not start with",
"description": "PowerSearch negated prefix operator. Example: `Email does not start with test`. Lowercase; pairs with `starts with`."
},
"@astryx.powersearch.operator.endsWith": {
"defaultMessage": "ends with",
"description": "PowerSearch string suffix operator. Example: `Email ends with @meta.com`. Lowercase."
},
"@astryx.powersearch.operator.notEndsWith": {
"defaultMessage": "does not end with",
"description": "PowerSearch negated suffix operator. Example: `Email does not end with @gmail.com`. Lowercase; pairs with `ends with`."
},
"@astryx.powersearch.operator.is": {
"defaultMessage": "is",
"description": "PowerSearch equality operator for strings/enums. Example: `Status is Active`. Separate from `operator.equals` (numbers) — translations may diverge."
},
"@astryx.powersearch.operator.isNot": {
"defaultMessage": "is not",
"description": "PowerSearch inequality operator for strings/enums. Example: `Status is not Draft`. Pairs with `is`; separate from `operator.notEquals`."
},
"@astryx.powersearch.operator.equals": {
"defaultMessage": "is",
"description": "PowerSearch numeric equality operator. Example: `Age is 30`. Ships same English \"is\" as `operator.is` but is separate so numbers may diverge (e.g. \"equals\")."
},
"@astryx.powersearch.operator.notEquals": {
"defaultMessage": "is not",
"description": "PowerSearch numeric inequality operator. Example: `Count is not 0`. Same divergence option as `operator.equals`."
},
"@astryx.powersearch.operator.greaterThan": {
"defaultMessage": "is greater than",
"description": "PowerSearch numeric operator, strictly greater than. Example: `Age is greater than 18`. Lowercase."
},
"@astryx.powersearch.operator.lessThan": {
"defaultMessage": "is less than",
"description": "PowerSearch numeric operator, strictly less than. Example: `Priority is less than 5`. Lowercase."
},
"@astryx.powersearch.operator.greaterThanOrEqual": {
"defaultMessage": "is greater than or equal to",
"description": "PowerSearch numeric operator, ≥. Example: `Age is greater than or equal to 21`. A shorter form (e.g. \"≥\") is fine if idiomatic."
},
"@astryx.powersearch.operator.lessThanOrEqual": {
"defaultMessage": "is less than or equal to",
"description": "PowerSearch numeric operator, ≤. Example: `Priority is less than or equal to 3`. A shorter form is fine if idiomatic."
},
"@astryx.powersearch.operator.before": {
"defaultMessage": "is before",
"description": "PowerSearch date operator, strictly earlier. Example: `Created is before 2024-01-01`. Temporal, not spatial."
},
"@astryx.powersearch.operator.after": {
"defaultMessage": "is after",
"description": "PowerSearch date operator, strictly later. Example: `Updated is after 2024-06-01`. Temporal."
},
"@astryx.powersearch.operator.between": {
"defaultMessage": "is between",
"description": "PowerSearch date operator, inclusive range. Example: `Created is between 2024-01-01 and 2024-06-30`. The `and <end>` portion is composed separately."
},
"@astryx.powersearch.operator.isTrue": {
"defaultMessage": "is true",
"description": "PowerSearch boolean operator: matches truthy. Example: `Is admin is true`. Pairs with `is false`; field may be affirmative or a yes/no question."
},
"@astryx.powersearch.operator.isFalse": {
"defaultMessage": "is false",
"description": "PowerSearch boolean operator: matches falsy. Example: `Is admin is false`. Pairs with `is true`."
},
"@astryx.powersearch.operator.isAnyOf": {
"defaultMessage": "is any of",
"description": "PowerSearch list operator: value is in the set. Example: `Status is any of [Active, Paused, Draft]`. The value list is composed separately; pairs with `is none of`."
},
"@astryx.powersearch.operator.isNoneOf": {
"defaultMessage": "is none of",
"description": "PowerSearch negated list operator: value not in the set. Example: `Status is none of [Archived, Deleted]`. Pairs with `is any of`."
},
"@astryx.powersearch.valueEditor.itemsCount": {
"defaultMessage": "{count, number} {count, plural, one {item} other {items}}",
"description": "Overflow summary on a compact filter chip when the list of selected items is too long. Example: `3 items` or `1 item`."
},
"@astryx.powersearch.valueEditor.entitiesCount": {
"defaultMessage": "{count, number} {count, plural, one {entity} other {entities}}",
"description": "Overflow summary on a compact filter chip when the list of selected entities is too long. Example: `5 entities` or `1 entity`. Pair with `itemsCount` translation."
},
"@astryx.powersearch.valueEditor.dateRange": {
"defaultMessage": "date range",
"description": "Fallback lowercase noun rendered inline in a filter chip when a date-range value can't be formatted (e.g. `Created is between date range`). Keep lowercase."
},
"@astryx.powersearch.valueEditor.filtersCount": {
"defaultMessage": "{count, number} {count, plural, one {filter} other {filters}}",
"description": "Summary inside a filter chip when the value is a nested set of filters. Example: `3 filters` or `1 filter`."
},
"@astryx.powersearch.resultCount": {
"defaultMessage": "{count, number} {count, plural, one {result} other {results}}",
"description": "Live result-count text next to the PowerSearch input, announced to screen readers on change. Example: `12 results`, `1 result`; keep compact."
},
"@astryx.alertDialog.cancel": {
"defaultMessage": "Cancel",
"description": "Button label on the secondary/dismiss button of an AlertDialog (modal confirmation). Imperative verb; consumers usually override with task-specific text."
},
"@astryx.appShell.mobileNavigation": {
"defaultMessage": "Mobile navigation",
"description": "Screen-reader-only accessible name for the mobile-only navigation region on small viewports. \"Mobile\" = phone/tablet (small screen), not \"movable\"."
},
"@astryx.appShell.skipToContent": {
"defaultMessage": "Skip to content",
"description": "Text of the skip link — the first focusable element on the page, visible only while keyboard-focused. Activating it jumps focus past the navigation to the main content area. Imperative verb; keep short."
},
"@astryx.avatar.nameWithStatus": {
"defaultMessage": "{name}, {status}",
"description": "Screen-reader accessible name for an Avatar showing a status indicator; composes the person's name with the status label, e.g. \"Jane Doe, Online\". {name} = the avatar's name/alt text, {status} = the status dot's label. Adjust separator and order per locale."
},
"@astryx.avatarGroup.label": {
"defaultMessage": "Avatars",
"description": "Screen-reader-only fallback name for a horizontal cluster of user avatar images. Plural noun; consumers usually override with \"Team members\", \"Attendees\", etc."
},
"@astryx.avatarGroup.keyboardHint": {
"defaultMessage": "Use arrow keys to move between avatars",
"description": "Screen-reader-only instruction attached (via aria-describedby) to a group of interactive avatars that share a single Tab stop. Tells keyboard users the Left/Right arrow keys move focus between the avatars. Only announced when the group has interactive (link/button) avatars."
},
"@astryx.avatarGroup.overflow": {
"defaultMessage": "{count, number} more",
"description": "Accessible name for the \"+N\" overflow indicator at the end of an AvatarGroup — announces how many additional avatars are not shown. Example: `5 more`. The visible \"+N\" text is unaffected; this is the aria-label only."
},
"@astryx.banner.dismiss": {
"defaultMessage": "Dismiss",
"description": "\"Dismiss\" = close/hide this notification (not \"reject a person\"). Aria label AND tooltip on the small X button on a Banner."
},
"@astryx.calendar.previousMonth": {
"defaultMessage": "Previous month",
"description": "Screen-reader-only label on the left-arrow button in a Calendar's month header (navigates one month back). Pairs with `calendar.nextMonth`."
},
"@astryx.calendar.nextMonth": {
"defaultMessage": "Next month",
"description": "Screen-reader-only label on the right-arrow button in a Calendar's month header (navigates one month forward). Pairs with `calendar.previousMonth`."
},
"@astryx.calendar.daySelected": {
"defaultMessage": "{date}, selected",
"description": "Accessible name for the Calendar day button that is the current single-mode selection. `{date}` is the localized full date, e.g. \"Thursday, January 15, 2026\". The trailing state word tells screen-reader users the focused day is selected."
},
"@astryx.calendar.dayRangeStart": {
"defaultMessage": "{date}, range start",
"description": "Accessible name for the Calendar day button that begins the selected date range (or the first pick of an in-progress range). `{date}` is the localized full date."
},
"@astryx.calendar.dayRangeEnd": {
"defaultMessage": "{date}, range end",
"description": "Accessible name for the Calendar day button that ends the selected date range. `{date}` is the localized full date. Pairs with `calendar.dayRangeStart`."
},
"@astryx.calendar.dayRangeStartAndEnd": {
"defaultMessage": "{date}, range start and range end",
"description": "Accessible name for a Calendar day button that both begins and ends a completed one-day range. `{date}` is the localized full date."
},
"@astryx.calendar.dayInRange": {
"defaultMessage": "{date}, in range",
"description": "Accessible name for a Calendar day button strictly inside the selected date range (not an endpoint). `{date}` is the localized full date."
},
"@astryx.calendar.rangeStartAnnounce": {
"defaultMessage": "Start date {date}. Select an end date.",
"description": "Screen-reader announcement after the first pick of a Calendar range selection. `{date}` is the localized full date. Prompts the user that a second pick completes the range."
},
"@astryx.calendar.rangeCompleteAnnounce": {
"defaultMessage": "Selected range: {start} to {end}.",
"description": "Screen-reader announcement after the second pick completes a Calendar range selection. `{start}` and `{end}` are localized full dates in chronological order."
},
"@astryx.calendar.rangeClearedAnnounce": {
"defaultMessage": "Cleared start date {date}. Select a start date.",
"description": "Screen-reader announcement when the user clicks the in-progress range start again, which clears it instead of completing a zero-length range. `{date}` is the localized full date."
},
"@astryx.carousel.label": {
"defaultMessage": "Carousel",
"description": "Screen-reader-only fallback name for a horizontally-scrolling row of items. If \"carousel\" is unfamiliar in your locale, prefer the standard term (e.g. \"slider\")."
},
"@astryx.carousel.scrollLeft": {
"defaultMessage": "Scroll left",
"description": "Screen-reader-only label on the left arrow button in a Carousel. Pairs with `carousel.scrollRight`; in RTL locales, coordinate the two so left/right match layout."
},
"@astryx.carousel.scrollRight": {
"defaultMessage": "Scroll right",
"description": "Screen-reader-only label on the right arrow button in a Carousel. Pairs with `carousel.scrollLeft`; same RTL note."
},
"@astryx.carousel.slideLabel": {
"defaultMessage": "Slide {current, number} of {total, number}",
"description": "Screen-reader accessible name for one slide in a Carousel, giving its position. `current` is the 1-based slide number; `total` is the slide count."
},
"@astryx.chat.status.sending": {
"defaultMessage": "Sending",
"description": "Chat send-status caption under an outgoing message while it is being transmitted. Part of the set sending → sent → delivered → read (or failed) — keep tense/aspect consistent."
},
"@astryx.chat.status.sent": {
"defaultMessage": "Sent",
"description": "Chat send-status caption shown once the message reaches the server. Part of the set sending → **sent** → delivered → read (or failed) — keep tense consistent."
},
"@astryx.chat.status.delivered": {
"defaultMessage": "Delivered",
"description": "Chat send-status caption shown once the recipient's device received the message. Part of the set sending → sent → **delivered** → read (or failed)."
},
"@astryx.chat.status.read": {
"defaultMessage": "Read",
"description": "Chat send-status caption shown once the recipient opened the message. English past-participle (\"has been read\", /rɛd/), not the present verb — part of the set sending → sent → delivered → **read**."
},
"@astryx.chat.status.failed": {
"defaultMessage": "Failed",
"description": "Chat send-status caption shown when the send attempt errored. Part of the set — the terminal failure branch, orthogonal to the sent → delivered → read success track."
},
"@astryx.chat.messageAriaLabel": {
"defaultMessage": "Message {status}",
"description": "Screen-reader-only accessible name for a chat message row. `{status}` interpolates the localized status word (e.g. `Message sent`, `Message delivered`) — reorder if needed."
},
"@astryx.chat.pastedText.expand": {
"defaultMessage": "Expand",
"description": "Button label on a chip in the chat composer representing a long pasted text block; clicking reveals full content. \"Expand\" here means reveal more, not grow physically."
},
"@astryx.checkboxList.item.checkbox": {
"defaultMessage": "Checkbox",
"description": "Screen-reader-only last-ditch fallback name for a checkbox inside a list item when no label is provided. Should almost never render — consumers should supply a real label."
},
"@astryx.commandPalette.emptySearch": {
"defaultMessage": "No results",
"description": "Fallback empty-state text inside a CommandPalette when the user's query has no matches. Very short (2 words); neutral tone."
},
"@astryx.commandPalette.emptyBootstrap": {
"defaultMessage": "Type to search",
"description": "Onboarding empty-state text shown inside a CommandPalette on first open, before the user has typed anything. Imperative sentence fragment."
},
"@astryx.commandPalette.resultCount": {
"defaultMessage": "{count, number} {count, plural, one {result} other {results}}",
"description": "Screen-reader-only announcement of how many commands match the CommandPalette query as the user types. Example: `12 results`, `1 result`; keep compact."
},
"@astryx.commandPalette.noResultsFor": {
"defaultMessage": "No results for {query}",
"description": "Screen-reader-only announcement when a CommandPalette query matches nothing. `{query}` is the user's verbatim search text; keep it last if your language allows so truncation-by-AT still conveys the outcome."
},
"@astryx.commandPalette.loading": {
"defaultMessage": "Loading",
"description": "Screen-reader-only announcement that a CommandPalette search has started and results are being fetched. Present-progressive form; matches the visible spinner."
},
"@astryx.dateRangeInput.presetDateRanges": {
"defaultMessage": "Preset date ranges",
"description": "Screen-reader-only accessible name for the sidebar of quick-pick preset ranges inside a DateRangeInput popover (e.g. \"Last 7 days\", \"This month\")."
},
"@astryx.dateTimeInput.timePlaceholder": {
"defaultMessage": "Select a time",
"description": "Grey placeholder inside the empty time-of-day slot in a DateTimeInput. \"Time\" = clock time (HH:MM), not duration."
},
"@astryx.dialog.close": {
"defaultMessage": "Close",
"description": "\"Close\" = shut/dismiss the dialog, not \"nearby\" (English homograph). Aria label AND tooltip on the X at the top-right of a Dialog."
},
"@astryx.dropdownMenu.label": {
"defaultMessage": "Menu",
"description": "Screen-reader-only fallback name for a dropdown menu popover. Very generic; consumers usually override. Noun (\"a menu\"), not the imperative."
},
"@astryx.lightbox.close": {
"defaultMessage": "Close",
"description": "\"Close\" = shut/dismiss (not \"nearby\"). Screen-reader-only label on the X button that dismisses a Lightbox."
},
"@astryx.lightbox.previous": {
"defaultMessage": "Previous",
"description": "Screen-reader-only label on the left-arrow button in a Lightbox (navigates to previous media item). Pairs with `lightbox.next`."
},
"@astryx.lightbox.next": {
"defaultMessage": "Next",
"description": "Screen-reader-only label on the right-arrow button in a Lightbox (navigates to next media item). Pairs with `lightbox.previous`."
},
"@astryx.listInput.emptyTitle": {
"defaultMessage": "No {itemName}s yet",
"description": "EmptyState title shown inside a lab ListInput when its collection has no records. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\"); the source appends a literal \"s\" to pluralize it, which only works for regular English plurals. If your language cannot pluralize an interpolated noun this way, rephrase around `{itemName}` instead (e.g. \"No {itemName} added yet\")."
},
"@astryx.listInput.emptyDescription": {
"defaultMessage": "Add a {itemName} to get started.",
"description": "EmptyState supporting text shown inside a lab ListInput when its collection has no records. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\")."
},
"@astryx.listInput.addItem": {
"defaultMessage": "Add {itemName}",
"description": "Accessible label on the button that appends a new record to a lab ListInput. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\")."
},
"@astryx.listInput.removeItem": {
"defaultMessage": "Remove {itemName} {position, number}",
"description": "Accessible label and tooltip on the button that deletes one record from a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number (e.g. \"Remove guest 2\")."
},
"@astryx.listInput.removeUnavailable": {
"defaultMessage": "Remove is unavailable while the list is disabled",
"description": "Tooltip shown on the Remove button when the ListInput is disabled or loading, explaining why the action cannot be performed."
},
"@astryx.listInput.reorderItem": {
"defaultMessage": "Reorder {itemName} {position, number}",
"description": "Accessible label on the drag-handle button that reorders one record in a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number (e.g. \"Reorder guest 2\")."
},
"@astryx.listInput.fieldLabelWithPosition": {
"defaultMessage": "{header}, {itemName} {position, number} of {total, number}",
"description": "Accessible name for a field inside a lab ListInput row after the first row, disambiguating repeated column labels. `{header}` is the column's own label (e.g. \"Name\"); `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are the row's 1-based index and the total row count (e.g. \"Name, guest 2 of 3\")."
},
"@astryx.listInput.reorderInstructions": {
"defaultMessage": "Use Arrow Up or Arrow Down to move this item one position. Press Space or Enter to pick it up for extended keyboard reordering.",
"description": "Visually-hidden instructions describing how to use a lab ListInput row's keyboard reorder handle, referenced via aria-describedby from every reorder button."
},
"@astryx.listInput.announceAdded": {
"defaultMessage": "Added {itemName} {position, number}.",
"description": "Screen-reader-only live announcement after a new record is appended to a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is the new record's 1-based row number."
},
"@astryx.listInput.announceRemoved": {
"defaultMessage": "Removed {itemName} {position, number}.",
"description": "Screen-reader-only live announcement after a record is deleted from a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is the removed record's former 1-based row number."
},
"@astryx.listInput.announceGrabbed": {
"defaultMessage": "{itemName} {position, number} grabbed. Use arrow keys to move, Space or Enter to drop, and Escape to cancel.",
"description": "Screen-reader-only live announcement when a lab ListInput record's keyboard reorder handle enters extended \"lift\" mode. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number."
},
"@astryx.listInput.announceMovedToPosition": {
"defaultMessage": "{itemName} moved to position {position, number} of {total, number}.",
"description": "Screen-reader-only live announcement each time a lab ListInput record's reorder position changes (arrow-key step, keyboard lift-mode preview, or pointer drag). `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are the record's new 1-based position and the total row count."
},
"@astryx.listInput.announceReorderCancelled": {
"defaultMessage": "Reordering cancelled.",
"description": "Screen-reader-only live announcement when a lab ListInput reorder in progress is cancelled (Escape key, blur, or the collection becoming disabled/loading mid-drag)."
},
"@astryx.listInput.announceReturnedToPosition": {
"defaultMessage": "{itemName} returned to position {position, number}.",
"description": "Screen-reader-only live announcement when a lab ListInput reorder is committed without the record's position actually changing. `{itemName}` is the consumer's singular noun for one record; `{position}` is its unchanged 1-based row number."
},
"@astryx.listInput.announceDropped": {
"defaultMessage": "{itemName} dropped at position {position, number} of {total, number}.",
"description": "Screen-reader-only live announcement when a lab ListInput reorder is committed with the record's position actually changing. `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are its new 1-based position and the total row count."
},
"@astryx.listInput.announceAlreadyAtBoundary": {
"defaultMessage": "This {itemName} is already {boundary, select, first {first} last {last} other {}}.",
"description": "Screen-reader-only live announcement when an arrow-key reorder attempt has no effect because the record is already at that end of the list. `{itemName}` is the consumer's singular noun for one record; `{boundary}` is always exactly \"first\" or \"last\"."
},
"@astryx.markdown.taskList": {
"defaultMessage": "Task list",
"description": "Screen-reader-only accessible name for a GitHub-flavored Markdown task list (rendered from `- [ ] item` / `- [x] done` syntax)."
},
"@astryx.markdown.table": {
"defaultMessage": "Table",
"description": "Screen-reader-only accessible name for a table rendered inside a Markdown block. Noun (\"a table\"), not the verb. Separate from `@astryx.table.label` — translations may diverge."
},
"@astryx.mobileNav.closeNavigation": {
"defaultMessage": "Close navigation",
"description": "Screen-reader-only label on the X/close button that dismisses the MobileNav overlay. Pairs with `mobileNav.toggle.open`."
},
"@astryx.multiSelector.selectAll": {
"defaultMessage": "Select all",
"description": "Label on the checkbox/toggle at the top of a MultiSelector dropdown that selects every option. \"All\" is a determiner here (as in \"all the options\"), not the pronoun."
},
"@astryx.multiSelector.searchPlaceholder": {
"defaultMessage": "Search…",
"description": "Placeholder inside the search input at the top of a MultiSelector's dropdown panel. Imperative verb; trailing `…` is one character."
},
"@astryx.multiSelector.searchOptions": {
"defaultMessage": "Search options",
"description": "Screen-reader-only accessible name for that same search input inside a MultiSelector."
},
"@astryx.multiSelector.selectAllPartiallySelected": {
"defaultMessage": "{label}, partially selected",
"description": "Accessible name for the MultiSelector select-all option while only some options are selected. `{label}` is the visible select-all label (e.g. \"Select all\"). ARIA forbids aria-selected=\"mixed\" on options, so the indeterminate state is conveyed through the name instead. \"Partially\" = some but not all."
},
"@astryx.popover.close": {
"defaultMessage": "Close popover",
"description": "\"Close\" = shut/dismiss, not \"nearby\". Screen-reader-only label on the close button inside a Popover."
},
"@astryx.selector.searchPlaceholder": {
"defaultMessage": "Search…",
"description": "Placeholder inside the search input at the top of a Selector's dropdown panel (for filtering options). Imperative verb; trailing `…` is one character."
},
"@astryx.selector.searchOptions": {
"defaultMessage": "Search options",
"description": "\"Options\" = the list of choices in the dropdown. Screen-reader-only accessible name for the search input inside a Selector."
},
"@astryx.sideNav.label": {
"defaultMessage": "Side navigation",
"description": "Screen-reader-only accessible name for the primary vertical sidebar nav (usually on the left)."
},
"@astryx.sideNav.resizeSidebar": {
"defaultMessage": "Resize sidebar",
"description": "Screen-reader-only label on the vertical drag handle at the right edge of the SideNav that lets the user resize the sidebar's width."
},
"@astryx.sideNav.heading.openMenu": {
"defaultMessage": "Open menu",
"description": "Screen-reader-only label on the `⋯` overflow-menu button embedded in a SideNav section heading. Same string as `topNav.heading.openMenu` — translations may share."
},
"@astryx.tabList.label": {
"defaultMessage": "Tabs",
"description": "Screen-reader-only fallback name for a horizontal tab bar. Plural noun; \"Tabs\" here = UI tab panels, not browser tabs or the Tab key."
},
"@astryx.table.label": {
"defaultMessage": "Table",
"description": "Fallback screen-reader-only accessible name for a data-table region when the consumer provides none. Noun (\"a table\"), not the verb \"to table\"."
},
"@astryx.table.noData": {
"defaultMessage": "No data",
"description": "Fallback empty-state text in the table body when there are zero rows. Neutral tone (not error-y); consumers commonly override with something specific like \"No results\"."
},
"@astryx.table.filter.allPlaceholder": {
"defaultMessage": "All",
"description": "Placeholder on a per-column filter dropdown when nothing is selected, meaning \"no filter — all rows match\". Determiner form (as in \"all values\"), not the pronoun."
},
"@astryx.table.filter.reset": {
"defaultMessage": "Reset",
"description": "Button label inside a table's filter panel/popover; clears pending filter values back to defaults. Imperative verb."
},
"@astryx.table.filter.apply": {
"defaultMessage": "Apply",
"description": "Primary button label inside a table's filter panel/popover; commits pending filter values. Imperative verb; pairs with `Reset`."
},
"@astryx.table.selection.selectAllRows": {
"defaultMessage": "Select all rows",
"description": "Aria label for the \"select all rows\" checkbox in a Table header."
},
"@astryx.table.selection.selectRow": {
"defaultMessage": "Select row",
"description": "Aria label for the \"select row\" checkbox on a Table row."
},
"@astryx.table.selection.selectRowNamed": {
"defaultMessage": "Select {label}",
"description": "Aria label for a Table row's selection checkbox when a per-row label is available (via getRowLabel). `label` is the row's human-readable identity, e.g. \"Alice\"."
},
"@astryx.table.sort.ascending": {
"defaultMessage": "Sort ascending",
"description": "Screen-reader-only label on a column header button that will sort the column ascending. Part of a set with `sort.descending` and `sort.clear` — keep parallel."
},
"@astryx.table.sort.descending": {
"defaultMessage": "Sort descending",
"description": "Screen-reader-only label on a column header button that will sort the column descending. Part of a set with `sort.ascending` and `sort.clear`."
},
"@astryx.table.sort.clear": {
"defaultMessage": "Clear sort",
"description": "Screen-reader-only label on a column header button that will remove the current sort. \"Clear\" here means remove, not transparent. Part of the sort set."
},
"@astryx.table.sort.direction.ascending": {
"defaultMessage": "ascending",
"description": "Localized direction word interpolated as `direction` into @astryx.table.sort.sortedBy and @astryx.table.sort.sortedByWithPriority."
},
"@astryx.table.sort.direction.descending": {
"defaultMessage": "descending",
"description": "Localized direction word interpolated as `direction` into @astryx.table.sort.sortedBy and @astryx.table.sort.sortedByWithPriority."
},
"@astryx.table.sort.sortBy": {
"defaultMessage": "Sort by {label}",
"description": "Aria label for a sortable Table header button when the column is unsorted. `label` is the column header text."
},
"@astryx.table.sort.sortedBy": {
"defaultMessage": "Sort by {label}, sorted {direction}",
"description": "Aria label for a sorted Table header button. `direction` is the localized direction word from @astryx.table.sort.direction.*."
},
"@astryx.table.sort.sortedByWithPriority": {
"defaultMessage": "Sort by {label}, sorted {direction}, priority {rank, number} of {total, number}",
"description": "Aria label for a sorted Table header button in multi-sort. `rank` is the 1-based position of this column in the sort order; `total` is the number of sorted columns."
},
"@astryx.toast.dismiss": {
"defaultMessage": "Dismiss notification",
"description": "Screen-reader-only label on the X button of a Toast (transient notification popup). Distinct from `banner.dismiss` (persistent banner)."
},
"@astryx.toast.viewport": {
"defaultMessage": "Notifications",
"description": "Screen-reader-only accessible name for the invisible landmark region hosting the stack of Toast popups (usually pinned to a screen corner)."
},
"@astryx.tokenizer.clearAll": {
"defaultMessage": "Clear all",
"description": "Label on the \"×\" button that removes every token/chip from a Tokenizer input. Imperative verb + determiner \"all\"; short."
},
"@astryx.topNav.heading.openMenu": {
"defaultMessage": "Open menu",
"description": "Screen-reader-only label on the `⋯` overflow button in a TopNav section heading. Kept separate from `sideNav.heading.openMenu` so translations may diverge."
},
"@astryx.topNav.landmarkLabel": {
"defaultMessage": "Top navigation",
"description": "Default accessible name (aria-label) for the <nav> landmark rendered by TopNav when no label is provided."
},
"@astryx.treeList.toggleChildren": {
"defaultMessage": "Toggle children",
"description": "\"Children\" = child nodes in the tree, not human children. Screen-reader-only label on the chevron next to a TreeList item that has children — toggles the sub-list."
},
"@astryx.typeahead.emptySearchResults": {
"defaultMessage": "No results found",
"description": "Fallback empty-state message inside a Typeahead's suggestion popover when the current query has no matches. Neutral tone (not error-y)."
},
"@astryx.typeahead.loading": {
"defaultMessage": "Loading",
"description": "Screen-reader-only name for a spinner shown inside a Typeahead dropdown while suggestions are being fetched. Present-progressive form."
},
"@astryx.typeahead.searchResults": {
"defaultMessage": "Search results",
"description": "Screen-reader-only accessible name for the list of suggestions inside a Typeahead dropdown."
},
"@astryx.typeahead.clearSelection": {
"defaultMessage": "Clear selection",
"description": "\"Selection\" = the chosen value (not highlighted text). Screen-reader-only label on the X that clears the currently-selected value from a Typeahead."
},
"@astryx.breadcrumbs.label": {
"defaultMessage": "Breadcrumb",
"description": "Screen-reader-only fallback name for the breadcrumb trail (e.g. `Home > Section > Page`). Singular in English per ARIA convention; plural is fine if natural in your locale."
},
"@astryx.chat.composer.placeholder": {
"defaultMessage": "Type a message…",
"description": "Grey placeholder text inside the empty chat composer textarea. Imperative verb; trailing `…` is one character."
},
"@astryx.chat.composerDrawer.label": {
"defaultMessage": "Items",
"description": "Fallback aria label for the ChatComposerDrawer — a horizontal list of attachment/tool chips. Consumers usually override with \"Attachments\", \"Tools\", etc."
},
"@astryx.chat.composerInput.label": {
"defaultMessage": "Message input",
"description": "Screen-reader-only accessible name for the chat composer textarea. Reorder freely if your language uses one word for \"message field\"."
},
"@astryx.chat.speechRecognition.noSpeechDetected": {
"defaultMessage": "No speech was detected.",
"description": "Full-sentence error shown inline in the chat composer after voice input captured silence. Soft-error tone (not alarming); keep terminal period."
},
"@astryx.commandPalette.label": {
"defaultMessage": "Command palette",
"description": "Screen-reader-only fallback name for a keyboard-driven command menu (usually opened with Cmd/Ctrl-K). If unfamiliar, prefer a natural equivalent like \"quick actions\"."
},
"@astryx.commandPalette.input.placeholder": {
"defaultMessage": "Search…",
"description": "Grey placeholder inside the CommandPalette's search input. Imperative verb; trailing `…` is one character."
},
"@astryx.commandPalette.list.label": {
"defaultMessage": "Commands",
"description": "\"Command\" = an app action a user can invoke (metaphor from CLI), not a Unix command. Screen-reader-only name for the matching-commands list."
},
"@astryx.contextMenu.label": {
"defaultMessage": "Context menu",
"description": "Screen-reader-only fallback name for the right-click / long-press popup menu. \"Context\" = context-specific to the activated element, not linguistic context."
},
"@astryx.dateInput.placeholder": {
"defaultMessage": "Select a date",
"description": "Grey placeholder inside an empty DateInput field. \"Date\" = calendar date, not romantic or fruit. Imperative verb."
},
"@astryx.dateInput.dialogLabel": {
"defaultMessage": "Choose date",
"description": "Screen-reader-only accessible name for the popover dialog opened from a DateInput's calendar toggle. Imperative verb + noun."
},
"@astryx.dateInput.closeCalendar": {
"defaultMessage": "Close calendar",
"description": "Screen-reader-only label on the X inside the DateInput calendar popover (dismisses the popover). Distinct from `dateInput.toggleCalendarClose`, which labels the outer toggle."
},
"@astryx.dateInput.openCalendar": {
"defaultMessage": "Open calendar",
"description": "Aria label for the DateInput / DateRangeInput / DateTimeInput calendar toggle button when the popover is closed."
},
"@astryx.dateInput.toggleCalendarClose": {
"defaultMessage": "Close calendar",
"description": "Aria label for the DateInput / DateRangeInput / DateTimeInput calendar toggle button when the popover is open. Distinct from closeCalendar (which labels the X inside the popover) so translators can differentiate the toggle vs the close-X UI."
},
"@astryx.dateInput.clear": {
"defaultMessage": "Clear {label}",
"description": "Aria label for the clear-value button in DateInput / DateRangeInput / DateTimeInput. `{label}` is the field's own label so screen readers announce e.g. 'Clear Start date'."
},
"@astryx.dateInput.invalidDate": {
"defaultMessage": "Invalid date",
"description": "Screen-reader-only live-region alert in DateInput / DateTimeInput when the typed date cannot be parsed. The field silently reverts on blur, so this is the only rejection feedback a screen-reader user gets."
},
"@astryx.dateTimeInput.timeHint12h": {
"defaultMessage": "e.g., 2:30 PM",
"description": "Placeholder hint shown in the DateTimeInput time field when focused and empty with 12-hour format. Gives an example of expected input format."
},
"@astryx.dateTimeInput.timeHint24h": {
"defaultMessage": "e.g., 14:30",
"description": "Placeholder hint shown in the DateTimeInput time field when focused and empty with 24-hour format. Gives an example of expected input format."
},
"@astryx.dateTimeInput.timeSuffix": {
"defaultMessage": "{label} time",
"description": "Screen-reader-only accessible name for the time-of-day slot in a DateTimeInput. Example: `Start date time`; reorder freely (e.g. \"time of {label}\")."
},
"@astryx.dateRangeInput.placeholder": {
"defaultMessage": "Select date range",
"description": "Grey placeholder inside an empty DateRangeInput field. Represents picking a start–end date pair. Imperative verb."
},
"@astryx.dateRangeInput.dialogLabel": {
"defaultMessage": "Choose date range",
"description": "Screen-reader-only accessible name for the popover dialog opened from a DateRangeInput. Imperative verb + noun phrase."
},
"@astryx.dateTimeInput.placeholder": {
"defaultMessage": "Select a date",
"description": "Grey placeholder inside an empty DateTimeInput field. Note: the English says only \"date\" though the field is date+time — do not add \"and time\" unless natural."
},
"@astryx.dateTimeInput.dialogLabel": {
"defaultMessage": "Choose date",
"description": "Screen-reader-only accessible name for the DateTimeInput picker dialog. Same English-only \"date\" phrasing as the placeholder — don't add \"and time\" unless natural."
},
"@astryx.link.newTab": {
"defaultMessage": "(opens in new tab)",
"description": "Visually-hidden (screen-reader-only) suffix appended to a Link's accessible name when it opens in a new tab. Example: `Documentation (opens in new tab)`."
},
"@astryx.mobileNav.toggle.open": {
"defaultMessage": "Open navigation",
"description": "Screen-reader-only label on the hamburger button that opens the MobileNav overlay (rendered when the overlay is closed). Pairs with `mobileNav.closeNavigation`."
},
"@astryx.moreMenu.label": {
"defaultMessage": "More options",
"description": "Screen-reader-only name for the small `⋯` (three-dots) overflow button that opens a menu of additional actions. Very short — sits on a tiny icon button."
},
"@astryx.multiSelector.selectPlaceholder": {
"defaultMessage": "Select…",
"description": "Placeholder on an empty MultiSelector trigger button. Same English as `selector.placeholder` but a separate key — plural phrasing like \"Choose items…\" is fine."
},
"@astryx.outline.label": {
"defaultMessage": "Table of contents",
"description": "Screen-reader-only fallback name for a page's outline / table-of-contents sidebar (list of in-page headings). Rendered as `aria-label` on a `<nav>` landmark."
},
"@astryx.powersearch.label": {
"defaultMessage": "Search",
"description": "Screen-reader-only accessible name for the PowerSearch input (a filter-builder). The visible placeholder is separate; noun form often reads better than the verb."
},
"@astryx.powersearch.placeholder": {
"defaultMessage": "Search…",
"description": "Grey placeholder text inside the empty PowerSearch input. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.mobile.addFilter": {
"defaultMessage": "Add filter",
"description": "Label on the tap target that opens PowerSearchMobile's filter-builder sheet, and the title of that sheet. Imperative verb; \"filter\" is the noun (one search condition)."
},
"@astryx.powersearch.mobile.editFilter": {
"defaultMessage": "Edit filter",
"description": "Title of PowerSearchMobile's editor sheet when reopening a filter the user already added, as opposed to building a new one. Imperative verb."
},
"@astryx.powersearch.mobile.back": {
"defaultMessage": "Back",
"description": "Screen-reader-only label on the chevron button that returns to the previous step of PowerSearchMobile's filter-builder sheet. Navigation, not \"rear\"."
},
"@astryx.powersearch.mobile.searchFields": {
"defaultMessage": "Search filters",
"description": "Screen-reader-only label for the search box above the field list in PowerSearchMobile's sheet. It narrows the list of filters offered, not the underlying data."
},
"@astryx.powersearch.mobile.searchFieldsPlaceholder": {
"defaultMessage": "Search filters…",
"description": "Placeholder inside that same search box. Imperative verb; trailing `…` is one character."
},
"@astryx.powersearch.mobile.noFields": {
"defaultMessage": "No filters match your search",
"description": "Empty state shown in PowerSearchMobile's sheet when the typed query matches none of the available filters."
},
"@astryx.resizable.collapsed": {
"defaultMessage": "Collapsed",
"description": "aria-valuetext for the Resizable drag handle (role=separator) while its panel is collapsed to zero size. Replaces the numeric value announcement, since the numeric value is clamped to the minimum while collapsed. Adjective describing the panel state, not a verb/command."
},
"@astryx.resizable.handle.label": {
"defaultMessage": "Resize handle",
"description": "Screen-reader-only accessible name for the small draggable divider between two Resizable panels (users drag it to change the split ratio)."
},
"@astryx.selector.placeholder": {
"defaultMessage": "Select…",
"description": "Placeholder text on an empty Selector trigger button (a dropdown). Imperative verb; trailing `…` is one character. Very short — appears on the button face."
},
"@astryx.sideNav.heading.dialogLabel": {
"defaultMessage": "Navigation menu",
"description": "Screen-reader-only accessible name for the dropdown dialog opened from a SideNavHeading's overflow menu."
},
"@astryx.table.pagination.label": {
"defaultMessage": "Table pagination",
"description": "Screen-reader-only accessible name for the pagination `<nav>` appended below a data table. Kept separate from `@astryx.pagination.label` so translations may diverge."
},
"@astryx.timeInput.placeholder": {
"defaultMessage": "Select a time",
"description": "\"Time\" = clock time (HH:MM), not duration or era. Grey placeholder inside an empty TimeInput field; imperative verb."
},
"@astryx.timeInput.invalidTime": {
"defaultMessage": "Invalid time",
"description": "Screen-reader-only live-region alert in TimeInput / DateTimeInput when the typed time cannot be parsed. \"Time\" = clock time (HH:MM). The field silently reverts on blur, so this is the only rejection feedback a screen-reader user gets."
},
"@astryx.topNav.heading.dialogLabel": {
"defaultMessage": "Navigation menu",
"description": "Screen-reader-only accessible name for the dropdown dialog opened from a TopNavHeading's overflow menu. Kept separate from the SideNav sibling."
},
"@astryx.typeahead.searchPlaceholder": {
"defaultMessage": "Search…",
"description": "Placeholder inside an empty Typeahead input (a search field that suggests results as the user types). Imperative verb; trailing `…` is one character."
},
"@astryx.banner.collapse": {
"defaultMessage": "Collapse",
"description": "\"Collapse\" = fold up, not crumble. Aria label AND tooltip on the Banner expand/collapse toggle when currently expanded. Pairs with `banner.expand`."
},
"@astryx.banner.expand": {
"defaultMessage": "Expand",
"description": "\"Expand\" = reveal more, not grow physically. Aria label AND tooltip on the same toggle when currently collapsed. Pairs with `banner.collapse`."
},
"@astryx.button.loading": {
"defaultMessage": "Loading",
"description": "Screen-reader-only live-region announcement while a Button is in its loading state (spinner shown, action in flight). Progressive sense (\"work in progress\"), not a noun. Kept separate from `typeahead.loading` — translations may diverge."
},
"@astryx.chatComposerDrawer.expand": {
"defaultMessage": "Expand {label}",
"description": "Screen-reader-only label on the ChatComposerDrawer toggle when the drawer is collapsed. `{label}` is the drawer's visible name — example: `Expand Attachments`. Pairs with `collapse`."
},
"@astryx.chatComposerDrawer.collapse": {
"defaultMessage": "Collapse {label}",
"description": "Screen-reader-only label on the ChatComposerDrawer toggle when the drawer is expanded. Example: `Collapse Attachments`. Pairs with `expand`."
},
"@astryx.chatDictationButton.startDictation": {
"defaultMessage": "Start dictation",
"description": "Accessible label for the microphone button when idle (not listening)."
},
"@astryx.chatDictationButton.stopDictation": {
"defaultMessage": "Stop dictation",
"description": "Accessible label for the microphone button when actively listening."
},
"@astryx.chatLayout.newMessages": {
"defaultMessage": "New messages",
"description": "Text on a floating pill at the bottom of a chat viewport when unseen messages arrive below the fold; clicking scrolls to bottom. Keep short — narrow pill."
},
"@astryx.chatLayoutScrollButton.scrollToBottom": {
"defaultMessage": "Scroll to bottom",
"description": "Visible tooltip AND screen-reader label for a small down-arrow button that scrolls the chat viewport to its latest message."
},
"@astryx.chatMessage.messageFrom": {
"defaultMessage": "Message from {sender}",
"description": "Screen-reader-only accessible name for a chat message when the sender name isn't visible. Example: `Message from Sarah`, `Message from Bot` — reorder freely."
},
"@astryx.chatSendButton.stop": {
"defaultMessage": "Stop",
"description": "Button label that replaces `Send` on the chat send button while an AI response is streaming; clicking aborts generation. Short — appears on a small button."
},
"@astryx.chatSendButton.send": {
"defaultMessage": "Send",
"description": "Primary button label on the chat submit button (paperplane icon). Imperative verb; pairs with `Stop`. Very short."
},
"@astryx.chatToolCalls.error": {
"defaultMessage": "Error: {message}",
"description": "Screen-reader text for a tool call that failed. {message} is the error detail."
},
"@astryx.chatToolCalls.groupLabel": {
"defaultMessage": "{count} tool calls",
"description": "Summary label shown in the group header when multiple tool calls are expanded. {count} is the number of calls."
},
"@astryx.chatTriggerMenu.suggestions": {
"defaultMessage": "Suggestions",
"description": "Screen-reader-only fallback label for the popover listbox opened by a trigger character (`@`, `/`) in the chat composer when the trigger provides no specific label."
},
"@astryx.citation.label": {
"defaultMessage": "Citation {number}: {title}",
"description": "Screen-reader-only accessible name for a Citation chip (a small numbered link to a source). Example: `Citation 1: OpenAI research paper`. Reorder freely."
},
"@astryx.codeBlock.copied": {
"defaultMessage": "Copied",
"description": "Screen-reader-only label on the CodeBlock copy button for ~2s after a successful copy. Past-participle (\"has been copied\"); pairs with `codeBlock.copyCode`."
},
"@astryx.codeBlock.copyCode": {
"defaultMessage": "Copy code",
"description": "\"Code\" = source code. Aria label AND tooltip on the CodeBlock copy button in its default state. Pairs with `codeBlock.copied` (post-click state)."
},
"@astryx.codeBlock.code": {
"defaultMessage": "Code",
"description": "Screen-reader-only fallback name for a code-snippet scroll container when the code's language is unknown. \"Code\" = source code, not secret code or code of conduct."
},
"@astryx.field.optional": {
"defaultMessage": "Optional",
"description": "Visible indicator shown next to a form field's label when the field is optional (isOptional). Mutually exclusive with the required indicator. Very short — appears inline after the label text."
},
"@astryx.field.required": {
"defaultMessage": "Required",
"description": "Visible indicator shown next to a form field's label when the field must be filled in (isRequired). Mutually exclusive with the optional indicator. Very short — appears inline after the label text."
},
"@astryx.fileInput.clearLabel": {
"defaultMessage": "Clear {label}",
"description": "Screen-reader-only label on the X that removes the selected file from a FileInput. Example: `Clear Attachment`, `Clear Résumé`."
},
"@astryx.fileInput.dropHint": {
"defaultMessage": "Drop files here",
"description": "Text shown in the dropzone area when a user is dragging files over the FileInput."
},
"@astryx.fileInput.errorInvalidType": {
"defaultMessage": "\"{fileName}\" is not an accepted file type",
"description": "Validation error shown when a selected file does not match the accepted types."
},
"@astryx.fileInput.errorMaxFiles": {
"defaultMessage": "Maximum {maxFiles} files allowed",
"description": "Validation error shown when the number of selected files exceeds the maximum."
},
"@astryx.fileInput.errorMaxSize": {
"defaultMessage": "\"{fileName}\" exceeds {maxSize} limit",
"description": "Validation error shown when a selected file exceeds the maximum size. {maxSize} is a formatted size string like \"2.0 MB\"."
},
"@astryx.fileInput.fileSelected": {
"defaultMessage": "1 file selected: {fileName}",
"description": "Live-region announcement when a single file is successfully selected."
},
"@astryx.fileInput.filesSelected": {
"defaultMessage": "{count} files selected",
"description": "Live-region announcement when multiple files are successfully selected."
},
"@astryx.fileInput.placeholder": {
"defaultMessage": "Choose file",
"description": "Default placeholder text shown when no file is selected in a single-file FileInput."
},
"@astryx.fileInput.placeholderMultiple": {
"defaultMessage": "Choose files",
"description": "Default placeholder text shown when no files are selected in a multi-file FileInput."
},
"@astryx.fileInput.required": {
"defaultMessage": "Required",
"description": "Screen-reader-only description on the FileInput trigger indicating the field must be filled in. Mirrors the visible `Required` indicator next to the field label; conveyed via description because aria-required is not supported on role=\"button\"."
},
"@astryx.fileInput.triggerWithFiles": {
"defaultMessage": "{label}, {fileNames}",
"description": "Accessible name for a FileInput trigger that has files attached, composing the field label with the selected filenames. Example: `Attachments, report.pdf, notes.txt`."
},
"@astryx.keyboardHint.toNavigate": {
"defaultMessage": "to navigate",
"description": "Trailing text in the keyboard-hint badge, shown after arrow-key icons — reads as `← → to navigate`. Lowercase sentence fragment completing the visual phrase; the badge is aria-hidden, so this is for sighted users only."
},
"@astryx.lightbox.mediaViewer": {
"defaultMessage": "Media viewer",
"description": "Screen-reader-only fallback name for the Lightbox dialog when the current media item has no alt text. Should rarely render — consumers should provide alt."
},
"@astryx.lightbox.zoom": {
"defaultMessage": "Zoom",
"description": "Screen-reader-only label on the Lightbox image acting as a zoom toggle button (aria-pressed reflects zoomed state). Verb (\"to zoom\"), very short."
},
"@astryx.lightbox.zoomedIn": {
"defaultMessage": "Zoomed in, use arrow keys to pan",
"description": "Polite screen-reader announcement after zooming into a Lightbox image, including a hint that arrow keys pan while zoomed. Pairs with `lightbox.zoomedOut`."
},
"@astryx.lightbox.zoomedOut": {
"defaultMessage": "Zoomed out",
"description": "Polite screen-reader announcement after zooming back out of a Lightbox image. Pairs with `lightbox.zoomedIn`."
},
"@astryx.metadataList.showMore": {
"defaultMessage": "Show more",
"description": "Button label under a MetadataList that reveals items hidden beyond the configured maximum. Toggles with `metadataList.showLess` — keep the pair parallel in your language."
},
"@astryx.metadataList.showLess": {
"defaultMessage": "Show less",
"description": "Button label under a MetadataList that re-hides the extra items revealed by `metadataList.showMore`. Keep the pair parallel."
},
"@astryx.mobileNav.navigation": {
"defaultMessage": "Navigation",
"description": "Screen-reader-only fallback name for the MobileNav overlay dialog when no explicit label was passed."
},
"@astryx.multiSelector.clearAll": {
"defaultMessage": "Clear all {label}",
"description": "Screen-reader-only label on the X that clears every selected value from a MultiSelector. Example: `Clear all Countries`. `{label}` is typically already plural in English."
},
"@astryx.input.statusButton.error": {
"defaultMessage": "Error details",
"description": "Accessible name for the focusable status icon button inside an input when statusVariant is 'tooltip' and the status type is error. Activating or focusing the button reveals the error message in a tooltip. Keep it short — it labels an icon-only button."
},
"@astryx.input.statusButton.warning": {
"defaultMessage": "Warning details",
"description": "Accessible name for the focusable status icon button inside an input when statusVariant is 'tooltip' and the status type is warning. Activating or focusing the button reveals the warning message in a tooltip."