box-annotations 5.3.1-beta.0 → 5.3.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/annotations.js +1 -1
  2. package/i18n/bn-IN.js +24 -23
  3. package/i18n/da-DK.js +24 -23
  4. package/i18n/de-DE.js +24 -23
  5. package/i18n/en-AU.js +4 -23
  6. package/i18n/en-CA.js +2 -24
  7. package/i18n/en-GB.js +4 -23
  8. package/i18n/en-US.js +4 -24
  9. package/i18n/en-x-pseudo.js +6 -0
  10. package/i18n/es-419.js +24 -23
  11. package/i18n/es-ES.js +24 -23
  12. package/i18n/fi-FI.js +24 -23
  13. package/i18n/fr-CA.js +24 -23
  14. package/i18n/fr-FR.js +24 -23
  15. package/i18n/hi-IN.js +24 -23
  16. package/i18n/it-IT.js +24 -23
  17. package/i18n/ja-JP.js +2 -24
  18. package/i18n/ko-KR.js +24 -23
  19. package/i18n/nb-NO.js +24 -23
  20. package/i18n/nl-NL.js +24 -23
  21. package/i18n/pl-PL.js +24 -23
  22. package/i18n/pt-BR.js +24 -23
  23. package/i18n/ru-RU.js +24 -23
  24. package/i18n/sv-SE.js +24 -23
  25. package/i18n/tr-TR.js +24 -23
  26. package/i18n/zh-CN.js +24 -23
  27. package/i18n/zh-TW.js +24 -23
  28. package/package.json +7 -7
  29. package/src/common/BaseAnnotator.ts +9 -0
  30. package/src/common/EventEmitter.ts +11 -3
  31. package/src/components/Popups/PopupV2.tsx +32 -1
  32. package/src/document/DocumentAnnotator.ts +28 -11
  33. package/src/document/docUtil.ts +5 -1
  34. package/src/popup/PopupLayer.tsx +6 -1
  35. package/src/region/RegionCreation.tsx +4 -3
  36. package/src/region/RegionCreationContainer.tsx +3 -0
  37. package/src/store/annotations/actions.ts +2 -0
  38. package/src/store/annotations/reducer.ts +2 -0
  39. package/i18n/bn-IN.properties +0 -44
  40. package/i18n/da-DK.properties +0 -44
  41. package/i18n/de-DE.properties +0 -44
  42. package/i18n/en-AU.properties +0 -44
  43. package/i18n/en-CA.properties +0 -44
  44. package/i18n/en-GB.properties +0 -44
  45. package/i18n/en-US.properties +0 -44
  46. package/i18n/en-x-pseudo.properties +0 -32
  47. package/i18n/es-419.properties +0 -44
  48. package/i18n/es-ES.properties +0 -44
  49. package/i18n/fi-FI.properties +0 -44
  50. package/i18n/fr-CA.properties +0 -44
  51. package/i18n/fr-FR.properties +0 -44
  52. package/i18n/hi-IN.properties +0 -44
  53. package/i18n/it-IT.properties +0 -44
  54. package/i18n/ja-JP.properties +0 -44
  55. package/i18n/json/src/components/BoundingBoxHighlight/messages.json +0 -1
  56. package/i18n/json/src/components/Popups/messages.json +0 -1
  57. package/i18n/json/src/messages.json +0 -1
  58. package/i18n/ko-KR.properties +0 -44
  59. package/i18n/nb-NO.properties +0 -44
  60. package/i18n/nl-NL.properties +0 -44
  61. package/i18n/pl-PL.properties +0 -44
  62. package/i18n/pt-BR.properties +0 -44
  63. package/i18n/ru-RU.properties +0 -44
  64. package/i18n/sv-SE.properties +0 -44
  65. package/i18n/tr-TR.properties +0 -44
  66. package/i18n/zh-CN.properties +0 -44
  67. package/i18n/zh-TW.properties +0 -44
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "box-annotations",
3
- "version": "5.3.1-beta.0",
3
+ "version": "5.3.1-beta.1",
4
4
  "description": "Box Annotations",
5
5
  "author": "Box (https://www.box.com/)",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -40,12 +40,13 @@
40
40
  "@box/item-icon": "^3.2.0",
41
41
  "@box/languages": "^1.1.0",
42
42
  "@box/readable-time": "^2.1.32",
43
- "@box/threaded-annotations": "^4.11.0",
43
+ "@box/threaded-annotations": "^4.11.14",
44
44
  "@box/types": "^2.1.8",
45
45
  "@box/user-selector": "^2.1.35",
46
46
  "@cfaester/enzyme-adapter-react-18": "^0.8.0",
47
47
  "@commitlint/cli": "^19.8.0",
48
48
  "@commitlint/config-conventional": "^19.8.0",
49
+ "@formatjs/cli": "^6.16.26",
49
50
  "@formatjs/intl-pluralrules": "^1.5.5",
50
51
  "@formatjs/intl-relativetimeformat": "^4.5.12",
51
52
  "@popperjs/core": "^2.4.0",
@@ -69,7 +70,6 @@
69
70
  "babel-jest": "^29.7.0",
70
71
  "babel-loader": "^9.2.1",
71
72
  "babel-plugin-istanbul": "^6.0.0",
72
- "babel-plugin-react-intl": "^7.5.1",
73
73
  "babel-plugin-transform-require-ignore": "^0.1.1",
74
74
  "box-ui-elements": "^20.0.0",
75
75
  "circular-dependency-plugin": "^5.2.0",
@@ -142,17 +142,17 @@
142
142
  "@box/combobox-with-api": "^1.42.22",
143
143
  "@box/item-icon": "^3.2.0",
144
144
  "@box/readable-time": "^2.1.32",
145
- "@box/threaded-annotations": "^4.11.0",
145
+ "@box/threaded-annotations": "^4.11.14",
146
146
  "@box/types": "^2.1.8",
147
147
  "@box/user-selector": "^2.1.35",
148
148
  "axios": "^0.33.0"
149
149
  },
150
150
  "scripts": {
151
151
  "build": "yarn setup && yarn build:prod:dist",
152
- "build:i18n": "props2es",
153
152
  "build:dev:dist": "LANGUAGE=en-US BABEL_ENV=dev NODE_ENV=dev webpack --config scripts/webpack.config.js --mode development --progress",
154
153
  "build:prod:dist": "LANGUAGE=en-US BABEL_ENV=production NODE_ENV=production webpack --config scripts/webpack.config.js --mode production",
155
- "clean": "rm -rf dist reports/* i18n/json i18n/*.js",
154
+ "clean": "rm -rf dist reports/* i18n/json",
155
+ "extract:i18n": "mkdir -p i18n/json && formatjs extract 'src/**/*.{js,ts,tsx}' --ignore='src/**/__tests__/**' --ignore='src/**/__mocks__/**' --out-file i18n/json/en-US.json",
156
156
  "cy:open": "yarn cy:wait; yarn cypress open",
157
157
  "cy:run": "yarn cy:wait; yarn cypress run --spec test/integration/**/*.test.js",
158
158
  "cy:wait": "wait-on http-get://127.0.0.1:8001",
@@ -166,7 +166,7 @@
166
166
  "release:minor": "scripts/release.sh -n",
167
167
  "release:patch": "scripts/release.sh -p",
168
168
  "release:pre": "scripts/release.sh -x",
169
- "setup": "yarn install && yarn clean && yarn build:i18n",
169
+ "setup": "yarn install && yarn clean",
170
170
  "start": "yarn setup && yarn build:dev:dist --watch",
171
171
  "start:dev": "yarn setup && LANGUAGE=en-US BABEL_ENV=dev NODE_ENV=dev yarn webpack-dev-server --config scripts/webpack.config.js --mode development",
172
172
  "start:linked": "IS_LINKED=1 yarn start",
@@ -45,6 +45,8 @@ export type Options = {
45
45
  intl: IntlOptions;
46
46
  locale?: string;
47
47
  onCopyLink?: (params: { annotationId: string; fileVersionId: string }) => void;
48
+ // When false, skip annotation create. Existing annotations still render.
49
+ showAnnotationsControls?: boolean;
48
50
  token: Token;
49
51
  };
50
52
 
@@ -339,6 +341,13 @@ export default class BaseAnnotator extends EventEmitter {
339
341
  };
340
342
 
341
343
  protected handleSetActive = (annotationId: string | null): void => {
344
+ const state = this.store.getState();
345
+
346
+ // Ignore ids this pane does not own. Clear locally so the host is not told to deselect.
347
+ if (annotationId && state?.annotations?.isInitialized && !store.getAnnotation(state, annotationId)) {
348
+ this.store.dispatch(store.clearActiveAnnotationIdAction());
349
+ return;
350
+ }
342
351
  this.setActiveId(annotationId);
343
352
  };
344
353
 
@@ -1,7 +1,12 @@
1
1
  import eventManager from './EventManager';
2
2
 
3
+ type Listener = (...args: any[]) => void;
4
+
3
5
  export default class EventEmitter {
4
- addListener(event: string | symbol, listener: (...args: any[]) => void): void {
6
+ private ownListeners: Array<{ event: string | symbol; listener: Listener }> = [];
7
+
8
+ addListener(event: string | symbol, listener: Listener): void {
9
+ this.ownListeners.push({ event, listener });
5
10
  eventManager.addListener(event, listener);
6
11
  }
7
12
 
@@ -10,10 +15,13 @@ export default class EventEmitter {
10
15
  }
11
16
 
12
17
  removeAllListeners(): void {
13
- eventManager.removeAllListeners();
18
+ // Shared eventManager: remove only this instance's listeners.
19
+ this.ownListeners.forEach(({ event, listener }) => eventManager.removeListener(event, listener));
20
+ this.ownListeners = [];
14
21
  }
15
22
 
16
- removeListener(event: string | symbol, listener: (...args: any[]) => void): void {
23
+ removeListener(event: string | symbol, listener: Listener): void {
24
+ this.ownListeners = this.ownListeners.filter(own => !(own.event === event && own.listener === listener));
17
25
  eventManager.removeListener(event, listener);
18
26
  }
19
27
  }
@@ -19,6 +19,7 @@ import FocusTrap from 'box-ui-elements/es/components/focus-trap/FocusTrap';
19
19
 
20
20
  import { annotationToMessages, collaboratorToUserContact } from '../../adapters/threadedAnnotationsAdapters';
21
21
  import AnnotationCallbacksContext from '../../common/AnnotationCallbacksContext';
22
+ import useOutsideEvent from '../../common/useOutsideEvent';
22
23
  import {
23
24
  createReplyAction,
24
25
  deleteAnnotationAction,
@@ -41,6 +42,7 @@ import './PopupV2.scss';
41
42
 
42
43
  export type Props = {
43
44
  annotationId?: string;
45
+ onCancel?: () => void;
44
46
  onSubmit: (text: string) => void;
45
47
  popupPortalEl?: HTMLElement | null;
46
48
  reference: PopupReference;
@@ -70,6 +72,15 @@ const createDocumentNode = (content: JSONContent | null): DocumentNodeV2 => {
70
72
  const serializePopupMessage = (doc: DocumentNodeV2, isRichTextEnabled: boolean): string =>
71
73
  isRichTextEnabled ? serializeMessageToMarkdown(doc) : serializeMentionMarkup(doc).text;
72
74
 
75
+ const isEmptyEditorContent = (content: JSONContent | null, isRichTextEnabled: boolean): boolean => {
76
+ if (!content) {
77
+ return true;
78
+ }
79
+
80
+ const text = serializePopupMessage(createDocumentNode(content), isRichTextEnabled);
81
+ return text.trim().length === 0;
82
+ };
83
+
73
84
  const literalToString = (literal: TokenLiteral): string | null => {
74
85
  if (!literal) return null;
75
86
  if (typeof literal === 'string') return literal;
@@ -105,13 +116,14 @@ const fetchAvatarBlob = async (
105
116
  }
106
117
  };
107
118
 
108
- const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): JSX.Element | null => {
119
+ const PopupV2 = ({ annotationId, onCancel, onSubmit, popupPortalEl, reference }: Props): JSX.Element | null => {
109
120
  const intl = useIntl();
110
121
  const dispatch = useDispatch<AppThunkDispatch>();
111
122
  const { onCopyLink: consumerOnCopyLink } = React.useContext(AnnotationCallbacksContext);
112
123
  const popupRef = React.useRef<HTMLDivElement>(null);
113
124
  const popperRef = React.useRef<Instance>();
114
125
  const optionsRef = React.useRef<Partial<Options>>(getPopupOptions());
126
+ const hasTextRef = React.useRef(false);
115
127
 
116
128
  const apiHost = useSelector(getApiHost);
117
129
  const fileId = useSelector(getFileId);
@@ -185,6 +197,21 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
185
197
  event.stopPropagation();
186
198
  }, []);
187
199
 
200
+ const handleEditorChange = React.useCallback(
201
+ (content: JSONContent | null): void => {
202
+ hasTextRef.current = !isEmptyEditorContent(content, isRichTextEnabled);
203
+ },
204
+ [isRichTextEnabled],
205
+ );
206
+
207
+ const handleClickAway = React.useCallback((): void => {
208
+ if (!hasTextRef.current) {
209
+ onCancel?.();
210
+ }
211
+ }, [onCancel]);
212
+
213
+ useOutsideEvent('mousedown', popupRef, onCancel ? handleClickAway : undefined);
214
+
188
215
  React.useEffect(() => {
189
216
  if (!annotation) return undefined;
190
217
 
@@ -310,6 +337,9 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
310
337
  await dispatch(updateAnnotationAction({ annotationId, payload: { status: 'open' } }));
311
338
  }, [annotationId, dispatch]);
312
339
 
340
+ // No messages means this pane does not own the thread; do not render an empty composer.
341
+ if (annotationId && !threadMessages.length) return null;
342
+
313
343
  if (!popupPortalEl) return null;
314
344
 
315
345
  return ReactDOM.createPortal(
@@ -359,6 +389,7 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
359
389
  <MessageEditorV2
360
390
  isFirstAnnotation
361
391
  isRichTextEnabled={isRichTextEnabled}
392
+ onChange={handleEditorChange}
362
393
  onPost={handlePost}
363
394
  userSelectorProps={userSelectorProps}
364
395
  />
@@ -32,6 +32,8 @@ export default class DocumentAnnotator extends BaseAnnotator {
32
32
 
33
33
  highlightListener?: HighlightListener;
34
34
 
35
+ private readonly canCreate: boolean;
36
+
35
37
  managers: Map<number, Set<Manager>> = new Map();
36
38
 
37
39
  /** Tracks which view mode the current managers were created for. Used to destroy/recreate when switching. */
@@ -40,11 +42,24 @@ export default class DocumentAnnotator extends BaseAnnotator {
40
42
  constructor(options: Options) {
41
43
  super(options);
42
44
 
43
- this.highlightListener = new HighlightListener({ getSelection, store: this.store });
45
+ // Controls off: skip create; existing annotations still render.
46
+ this.canCreate = options.showAnnotationsControls !== false;
47
+ if (this.canCreate) {
48
+ this.highlightListener = new HighlightListener({
49
+ getSelection: this.getDocumentSelection,
50
+ store: this.store,
51
+ });
52
+ }
44
53
 
45
54
  this.addListener(Event.ANNOTATIONS_MODE_CHANGE, this.handleChangeMode);
46
55
  }
47
56
 
57
+ // Resolve .bp-doc at event time; it may not exist in the constructor.
58
+ getDocumentSelection = (): ReturnType<typeof getSelection> => {
59
+ const rootEl = this.annotatedEl ?? this.getAnnotatedElement();
60
+ return rootEl ? getSelection(rootEl) : null;
61
+ };
62
+
48
63
  destroy(): void {
49
64
  this.removeListener(Event.ANNOTATIONS_MODE_CHANGE, this.handleChangeMode);
50
65
 
@@ -123,10 +138,10 @@ export default class DocumentAnnotator extends BaseAnnotator {
123
138
 
124
139
  const textLayer = pageEl.querySelector('.textLayer') as HTMLElement;
125
140
 
126
- if (textLayer) {
141
+ if (this.canCreate && textLayer) {
127
142
  managers.add(
128
143
  new HighlightCreatorManager({
129
- getSelection,
144
+ getSelection: this.getDocumentSelection,
130
145
  referenceEl: textLayer,
131
146
  selectionChangeDelay: TEXT_LAYER_ENHANCEMENT,
132
147
  store: this.store,
@@ -144,15 +159,17 @@ export default class DocumentAnnotator extends BaseAnnotator {
144
159
  );
145
160
  managers.add(new RegionManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
146
161
 
147
- const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
162
+ if (this.canCreate) {
163
+ const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
148
164
 
149
- managers.add(
150
- new RegionCreationManager({
151
- location: pageNumber,
152
- referenceEl: canvasLayerEl || pageReferenceEl,
153
- resinTags,
154
- }),
155
- );
165
+ managers.add(
166
+ new RegionCreationManager({
167
+ location: pageNumber,
168
+ referenceEl: canvasLayerEl || pageReferenceEl,
169
+ resinTags,
170
+ }),
171
+ );
172
+ }
156
173
  }
157
174
 
158
175
  return managers;
@@ -29,13 +29,17 @@ export function getPageNumber(element: Element | null): number | undefined {
29
29
  return pageNumber ? parseInt(pageNumber, 10) : undefined;
30
30
  }
31
31
 
32
- export function getSelection(): Selection | null {
32
+ export function getSelection(rootEl?: HTMLElement | null): Selection | null {
33
33
  const selection = window.getSelection();
34
34
 
35
35
  if (!selection || selection.isCollapsed || !selection.rangeCount || !selection.focusNode) {
36
36
  return null;
37
37
  }
38
38
 
39
+ if (rootEl && !rootEl.contains(selection.focusNode)) {
40
+ return null;
41
+ }
42
+
39
43
  // Firefox allows to select multiple ranges in the document by using Ctrl/Cmd+click
40
44
  // We only care about the last range
41
45
  let range = selection.getRangeAt(selection.rangeCount - 1);
@@ -140,7 +140,12 @@ const PopupLayer = (props: Props): JSX.Element | null => {
140
140
  if (showCreator && isThreadedAnnotation) {
141
141
  return (
142
142
  <div className="ba-PopupLayer-popup">
143
- <PopupV2 onSubmit={handleSubmit} popupPortalEl={popupPortalEl} reference={reference} />
143
+ <PopupV2
144
+ onCancel={handleCancel}
145
+ onSubmit={handleSubmit}
146
+ popupPortalEl={popupPortalEl}
147
+ reference={reference}
148
+ />
144
149
  </div>
145
150
  );
146
151
  }
@@ -8,6 +8,7 @@ import { TARGET_TYPE } from '../constants';
8
8
  import { getVideoCurrentTimeInMilliseconds } from '../utils/useVideoTiming';
9
9
 
10
10
  type Props = {
11
+ hasStagedItem?: boolean;
11
12
  isCreating: boolean;
12
13
  location: number;
13
14
  resetCreator: () => void;
@@ -33,10 +34,10 @@ export default class RegionCreation extends React.PureComponent<Props, State> {
33
34
  state: State = {};
34
35
 
35
36
  handleAbort = (): void => {
36
- const { resetCreator, staged } = this.props;
37
+ const { hasStagedItem, resetCreator, staged } = this.props;
37
38
 
38
- // Click-away (a click too small to start a new region) must not discard an in-progress comment/annotation
39
- if (staged) {
39
+ // Click-away must not discard any in-progress comment/annotation
40
+ if (staged || hasStagedItem) {
40
41
  return;
41
42
  }
42
43
 
@@ -4,6 +4,7 @@ import {
4
4
  CreatorItemRegion,
5
5
  CreatorStatus,
6
6
  getAnnotationMode,
7
+ getCreatorStaged,
7
8
  getCreatorStagedForLocation,
8
9
  getCreatorStatus,
9
10
  getRotation,
@@ -18,6 +19,7 @@ import RegionCreation from './RegionCreation';
18
19
  import withProviders from '../common/withProviders';
19
20
 
20
21
  export type Props = {
22
+ hasStagedItem: boolean;
21
23
  isCreating: boolean;
22
24
  rotation: number;
23
25
  staged: CreatorItemRegion | null;
@@ -27,6 +29,7 @@ export const mapStateToProps = (state: AppState, { location }: { location: numbe
27
29
  const staged = getCreatorStagedForLocation(state, location);
28
30
 
29
31
  return {
32
+ hasStagedItem: Boolean(getCreatorStaged(state)),
30
33
  isCreating: getAnnotationMode(state) === Mode.REGION && getCreatorStatus(state) !== CreatorStatus.pending,
31
34
  rotation: getRotation(state),
32
35
  staged: isCreatorStagedRegion(staged) ? staged : null,
@@ -194,4 +194,6 @@ export const applySidebarReplyUpdateAction = createAction<SidebarReplyMutationPa
194
194
 
195
195
  export const removeAnnotationAction = createAction<string>('REMOVE_ANNOTATION');
196
196
  export const setActiveAnnotationIdAction = createAction<string | null>('SET_ACTIVE_ANNOTATION_ID');
197
+ // Clears activeId without emitting ACTIVE_CHANGE.
198
+ export const clearActiveAnnotationIdAction = createAction('CLEAR_ACTIVE_ANNOTATION_ID');
197
199
  export const setIsInitialized = createAction('SET_IS_INITIALIZED');
@@ -6,6 +6,7 @@ import {
6
6
  applySidebarReplyCreateAction,
7
7
  applySidebarReplyDeleteAction,
8
8
  applySidebarReplyUpdateAction,
9
+ clearActiveAnnotationIdAction,
9
10
  createAnnotationAction,
10
11
  createReplyAction,
11
12
  deleteAnnotationAction,
@@ -22,6 +23,7 @@ import { setViewModeAction } from '../options/actions';
22
23
  const activeAnnotationId = createReducer<AnnotationsState['activeId']>(null, builder =>
23
24
  builder
24
25
  /* Preview will set the active ID with a an event which will trigger the url change */
26
+ .addCase(clearActiveAnnotationIdAction, () => null)
25
27
  .addCase(createAnnotationAction.fulfilled, () => null)
26
28
  .addCase(deleteAnnotationAction.fulfilled, (state, { payload: id }) => (state === id ? null : state))
27
29
  .addCase(removeAnnotationAction, (state, { payload: id }) => (state === id ? null : state))
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = বন্ধ করুন
3
- # Error message when creating
4
- ba.annotationsCreateError = আমরা দুঃখিত, অ্যানোটেশন তৈরী করা যায়নি।
5
- # Error message when loading
6
- ba.annotationsLoadError = আমরা দুঃখিত, এই ফাইলের জন্য অ্যানোটেশন লোড করা যায়নি।
7
- # Label for the post button
8
- ba.annotationsPost = পোস্ট করুন
9
- # Label for the save button
10
- ba.annotationsSave = সংরক্ষণ করুন
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = পরবর্তী রেফারেন্স দেখুন
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = পূর্ববর্তী রেফারেন্স দেখুন
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = মন্তব্য
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = মন্তব্য টাইপ করুন
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = ব্যবহারকারীদের লোড করা হচ্ছে…
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = একজন কোলাবোরেটরকে উল্লেখ করুন
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = বাতিল করুন
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = মন্তব্য যোগ করুন
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = মুছুন
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = রিডু
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = বাতিল করুন
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = মন্তব্য করতে একটি বক্স আঁকুন
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = হাইলাইট এবং মন্তব্য করুন
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = মন্তব্যগুলি কেবলমাত্র একটি পৃষ্ঠায় সীমাবদ্ধ রয়েছে
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = কাউকে জানাতে তাকে উল্লেখ করুন
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = পোস্ট করুন
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = একটি মন্তব্য টাইপ করুন...
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = Luk
3
- # Error message when creating
4
- ba.annotationsCreateError = Vi beklager, anmærkningen kunne ikke oprettes.
5
- # Error message when loading
6
- ba.annotationsLoadError = Vi beklager, anmærkningerne for denne fil kunne ikke indlæses.
7
- # Label for the post button
8
- ba.annotationsPost = Opslå
9
- # Label for the save button
10
- ba.annotationsSave = Gem
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = Vis næste reference
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = Vis tidligere reference
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = Kommentar
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = Skriv en kommentar
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = Henter brugere …
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = Omtal en samarbejdspartner
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = Annuller
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = Tilføj kommentar
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = Slet
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = Annuller fortryd
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = Fortryd
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = Tegn et felt for at kommentere
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = Fremhæv og kommenter
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = Kommentarer er begrænset til enkelt side
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = Nævn en person for at give vedkommende besked
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = Slå op
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = Skriv en kommentar ...
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = Schließen
3
- # Error message when creating
4
- ba.annotationsCreateError = Die Anmerkung konnte leider nicht erstellt werden.
5
- # Error message when loading
6
- ba.annotationsLoadError = Die Anmerkungen für diese Datei konnten leider nicht geladen werden.
7
- # Label for the post button
8
- ba.annotationsPost = Posten
9
- # Label for the save button
10
- ba.annotationsSave = Speichern
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = Nächste Referenz anzeigen
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = Vorherige Referenz anzeigen
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = Kommentar
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = Einen Kommentar eingeben
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = Benutzer werden geladen …
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = Mitarbeiter erwähnen
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = Abbrechen
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = Kommentar hinzufügen
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = Löschen
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = Wiederholen
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = Rückgängig machen
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = Zeichnen Sie ein Feld zum Kommentieren
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = Markieren und kommentieren
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = Kommentare sind auf eine Seite beschränkt
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = Jemanden erwähnen, der benachrichtigt werden soll
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = Posten
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = Kommentar eingeben ...
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = Close
3
- # Error message when creating
4
- ba.annotationsCreateError = We're sorry, but the annotation could not be created.
5
- # Error message when loading
6
- ba.annotationsLoadError = We're sorry, the annotations failed to load for this file.
7
- # Label for the post button
8
- ba.annotationsPost = Post
9
- # Label for the save button
10
- ba.annotationsSave = Save
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = View next reference
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = View previous reference
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = Comment
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = Type a comment
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = Loading users…
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = Mention a collaborator
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = Cancel
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = Add a comment
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = Delete
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = Redo
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = Undo
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = Draw a box to comment
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = Highlight and comment
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = Mention someone to notify them
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = Post
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = Type a comment…
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = Close
3
- # Error message when creating
4
- ba.annotationsCreateError = We’re sorry, the annotation could not be created.
5
- # Error message when loading
6
- ba.annotationsLoadError = We’re sorry, the annotations failed to load for this file.
7
- # Label for the post button
8
- ba.annotationsPost = Post
9
- # Label for the save button
10
- ba.annotationsSave = Save
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = View next reference
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = View previous reference
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = Comment
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = Type a comment
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = Loading users...
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = Mention a collaborator
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = Cancel
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = Add Comment
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = Delete
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = Redo
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = Undo
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = Draw a box to comment
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = Highlight and Comment
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = Mention someone to notify them
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = Post
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = Type a comment...
@@ -1,44 +0,0 @@
1
- # Label for the close button
2
- ba.annotationsClose = Close
3
- # Error message when creating
4
- ba.annotationsCreateError = We're sorry, but the annotation could not be created.
5
- # Error message when loading
6
- ba.annotationsLoadError = We're sorry, the annotations failed to load for this file.
7
- # Label for the post button
8
- ba.annotationsPost = Post
9
- # Label for the save button
10
- ba.annotationsSave = Save
11
- # Aria label for the button to view the next reference
12
- ba.boundingBoxHighlight.viewNextReference = View next reference
13
- # Aria label for the button to view the previous reference
14
- ba.boundingBoxHighlight.viewPrevReference = View previous reference
15
- # Aria label description for reply popup
16
- ba.popup.reply.comment = Comment
17
- # Aria label description for annotation comment field
18
- ba.popup.reply.field = Type a comment
19
- # Aria label for mention selector loading state
20
- ba.popup.reply.mentionLoading = Loading users…
21
- # Aria role description for mention user selector
22
- ba.popup.reply.mentionSelector = Mention a collaborator
23
- # Button label for cancelling the creation of a description, comment, or reply
24
- ba.popups.cancel = Cancel
25
- # Button label for adding a comment in the drawing toolbar
26
- ba.popups.drawing.addComment = Add a comment
27
- # Button title for deleting a staged drawing
28
- ba.popups.drawing.delete = Delete
29
- # Button title for redoing a staged drawing
30
- ba.popups.drawing.redo = Redo
31
- # Button title for undoing a staged drawing
32
- ba.popups.drawing.undo = Undo
33
- # Prompt message following cursor in region annotations mode
34
- ba.popups.popupCursor.regionPrompt = Draw a box to comment
35
- # Popup message for highlight promoter
36
- ba.popups.popupHighlight.promoter = Highlight and comment
37
- # Prompt message when selection crosses multiple pages
38
- ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
39
- # Prompt message for empty popup list
40
- ba.popups.popupList.prompt = Mention someone to notify them
41
- # Button label for creating a description, comment, or reply
42
- ba.popups.post = Post
43
- # Placeholder for reply field editor
44
- ba.popups.replyField.placeholder = Type a comment…