@antscorp/antsomi-ui 1.3.5-beta.840 → 1.3.5-beta.842
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.
- package/es/components/molecules/CalendarSelection/CalendarSelection.js +5 -4
- package/es/components/molecules/TagifyInput/TagifyInput.js +172 -172
- package/es/components/molecules/TagifyInput/constants.d.ts +7 -1
- package/es/components/molecules/TagifyInput/constants.js +7 -1
- package/es/components/molecules/TagifyInput/utils.js +5 -1
- package/es/locales/ja/google-sheet.json +55 -55
- package/es/locales/vi/google-sheet.json +2 -2
- package/package.json +1 -1
|
@@ -10,14 +10,15 @@ import { LOCAL_TIMEZONE, RANGE_LIMIT } from './constants';
|
|
|
10
10
|
import { initState, resetValue } from './actions';
|
|
11
11
|
import { useTriggerOut } from './hooks/useTriggerOut';
|
|
12
12
|
export const CalendarSelection = props => {
|
|
13
|
-
const
|
|
13
|
+
const initialized = useRef(false);
|
|
14
14
|
const { value, rangeLimit = RANGE_LIMIT, timezone = LOCAL_TIMEZONE, timeDisplayProps, popoverProps, rangePickerProps, onChange, } = props;
|
|
15
15
|
const [state, dispatch] = useReducer(reducer, INITIAL_STATE);
|
|
16
16
|
useLayoutEffect(() => {
|
|
17
|
-
if (!value ||
|
|
17
|
+
if (!value || initialized.current)
|
|
18
18
|
return;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const needTriggerOut = !initialized.current;
|
|
20
|
+
dispatch(initState(value, needTriggerOut));
|
|
21
|
+
initialized.current = true;
|
|
21
22
|
}, [value]);
|
|
22
23
|
useLayoutEffect(() => {
|
|
23
24
|
if (!state.open) {
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Libraries
|
|
3
|
-
import { useRef, useEffect, useCallback, useMemo, memo, forwardRef, useImperativeHandle, useLayoutEffect, } from 'react';
|
|
3
|
+
import { useRef, useEffect, useCallback, useMemo, memo, forwardRef, useImperativeHandle, useLayoutEffect, useState, } from 'react';
|
|
4
4
|
import _ from 'lodash';
|
|
5
5
|
import htmlEntities from 'he';
|
|
6
6
|
// Assets
|
|
7
7
|
import iconWarning from '@antscorp/antsomi-ui/es/assets/images/warning-icon.png';
|
|
8
8
|
// Hooks
|
|
9
9
|
import { useDeepCompareMemo } from '@antscorp/antsomi-ui/es/hooks/useDeepCompareMemo';
|
|
10
|
-
import { useDebounce } from '@antscorp/antsomi-ui/es/hooks/useDebounce';
|
|
11
|
-
import { useUpdateEffect } from '@antscorp/antsomi-ui/es/hooks/useUpdateEffect';
|
|
12
10
|
import { useDeepCompareEffect } from '@antscorp/antsomi-ui/es/hooks/useDeepCompareEffect';
|
|
13
11
|
// Components
|
|
14
12
|
import Tagify from '@yaireo/tagify';
|
|
@@ -25,8 +23,7 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
25
23
|
// Props
|
|
26
24
|
const { initialValue, escapeHTML, status, readonly, readonlyTag, disabled, maxLength, maxHeight, minWidth, placeholder, isSingleLineText, acceptableTagPattern, mapAttributes, maxPersonalizeTags, name, children, cssTagifyVariables, onTagClick, onChange, } = props;
|
|
27
25
|
// States
|
|
28
|
-
const [
|
|
29
|
-
const [isLineBreakDebounce, , setIsLineBreak] = useDebounce(hasLineBreak(initialValue), 250);
|
|
26
|
+
const [isLineBreak, setIsLineBreak] = useState(hasLineBreak(initialValue));
|
|
30
27
|
// Refs
|
|
31
28
|
const inputRef = useRef(null);
|
|
32
29
|
const tagifyRef = useRef(null);
|
|
@@ -179,6 +176,135 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
179
176
|
console.warn('Error while injecting tag at caret', error);
|
|
180
177
|
}
|
|
181
178
|
}, [onAdjustSelectionIfNeeded, onSelectionAfterInjection]);
|
|
179
|
+
/**
|
|
180
|
+
* Updates the window selection to highlight a specified range of text within a given node.
|
|
181
|
+
* */
|
|
182
|
+
const updateWindowSelection = useCallback((node, start, end) => {
|
|
183
|
+
if (!node || !_.isNumber(start) || !_.isNumber(end))
|
|
184
|
+
return false;
|
|
185
|
+
if (node) {
|
|
186
|
+
try {
|
|
187
|
+
const range = document.createRange();
|
|
188
|
+
const textNodeLength = node.textContent?.length;
|
|
189
|
+
if (textNodeLength && start <= textNodeLength && end <= textNodeLength) {
|
|
190
|
+
range?.setStart(node, start);
|
|
191
|
+
range?.setEnd(node, end);
|
|
192
|
+
const selection = window.getSelection();
|
|
193
|
+
selection?.removeAllRanges();
|
|
194
|
+
selection?.addRange(range);
|
|
195
|
+
return onSyncSelectionStateTagify();
|
|
196
|
+
}
|
|
197
|
+
throw new Error('Invalid start/end position');
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// eslint-disable-next-line no-console
|
|
201
|
+
console.error(error);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}, [onSyncSelectionStateTagify]);
|
|
207
|
+
const replaceURLsWithTags = useCallback((nodesURl, lastRange) => {
|
|
208
|
+
try {
|
|
209
|
+
if (!tagifyRef.current) {
|
|
210
|
+
throw new Error('Tagify instance is not initialized');
|
|
211
|
+
}
|
|
212
|
+
// Replace all URLs in the given nodes
|
|
213
|
+
nodesURl.forEach((textNode) => {
|
|
214
|
+
const newTags = [];
|
|
215
|
+
const textContent = textNode.textContent || '';
|
|
216
|
+
if (textContent) {
|
|
217
|
+
let match;
|
|
218
|
+
// Reset the regex's lastIndex before each execution
|
|
219
|
+
detectURLRegex.lastIndex = 0;
|
|
220
|
+
// eslint-disable-next-line no-cond-assign
|
|
221
|
+
while ((match = detectURLRegex.exec(textContent)) !== null) {
|
|
222
|
+
const url = match[0];
|
|
223
|
+
const start = match.index;
|
|
224
|
+
const end = start + url.length;
|
|
225
|
+
const newTag = {
|
|
226
|
+
url,
|
|
227
|
+
range: [start, end],
|
|
228
|
+
};
|
|
229
|
+
// add new valid URL to tags
|
|
230
|
+
newTags.push(newTag);
|
|
231
|
+
}
|
|
232
|
+
if (newTags.length > 0) {
|
|
233
|
+
// Sort tags by their position in reverse order
|
|
234
|
+
// starting from the back avoids messing up earlier parts of the document
|
|
235
|
+
newTags.sort((a, b) => b.range[0] - a.range[0]);
|
|
236
|
+
// Add tags one by one, adjusting the selection for each
|
|
237
|
+
newTags.forEach(tag => {
|
|
238
|
+
const [start, end] = tag.range;
|
|
239
|
+
if (tagifyRef.current) {
|
|
240
|
+
const isUpdated = updateWindowSelection(textNode, start, end);
|
|
241
|
+
if (isUpdated) {
|
|
242
|
+
const newTag = tagifyRef.current.createTagElem({
|
|
243
|
+
value: tag.url,
|
|
244
|
+
label: tag.url,
|
|
245
|
+
type: DETECT_LINK,
|
|
246
|
+
});
|
|
247
|
+
// Inject the new detect link tag
|
|
248
|
+
tagifyRef.current.injectAtCaret(newTag);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
const selection = window.getSelection();
|
|
256
|
+
if (selection) {
|
|
257
|
+
if (lastRange instanceof Range) {
|
|
258
|
+
// Need to restore the selection after execution all process to replace URL to Tag
|
|
259
|
+
// to maintain valid caret
|
|
260
|
+
selection.removeAllRanges();
|
|
261
|
+
selection.addRange(lastRange);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// In case lost the selection not need to restore
|
|
265
|
+
// Reset the selection to clear and prepare the valid caret to add the next tag at fn: "onAddNewTag"
|
|
266
|
+
selection?.removeAllRanges();
|
|
267
|
+
onSyncSelectionStateTagify();
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
// eslint-disable-next-line no-console
|
|
273
|
+
console.error('Error while replacing URL with tag', error);
|
|
274
|
+
}
|
|
275
|
+
}, [onSyncSelectionStateTagify, updateWindowSelection]);
|
|
276
|
+
/**
|
|
277
|
+
* Detects URLs within the text nodes of a specified input element and replaces them with tags.
|
|
278
|
+
*
|
|
279
|
+
* This function scans through all child nodes of the input element, looking for text nodes that contain URLs.
|
|
280
|
+
* When URLs are found, it creates tags for each URL and injects them into the input element, updating the selection
|
|
281
|
+
* as necessary to ensure the DOM structure remains intact.
|
|
282
|
+
* */
|
|
283
|
+
const detectReplaceURLToTag = useCallback(() => {
|
|
284
|
+
const isSupportShortlink = acceptablePatternChecking(SHORT_LINK_PTN, acceptableTagPattern);
|
|
285
|
+
if (!tagifyRef.current || !isSupportShortlink)
|
|
286
|
+
return;
|
|
287
|
+
try {
|
|
288
|
+
const { input: inputElement } = tagifyRef.current.DOM;
|
|
289
|
+
if (inputElement) {
|
|
290
|
+
const selection = window.getSelection();
|
|
291
|
+
const cacheLastRange = selection?.getRangeAt && selection?.rangeCount && selection?.getRangeAt(0);
|
|
292
|
+
const minLengthValidURL = 8; // -> Because of valid URL should be "https://"
|
|
293
|
+
// Get all child nodes that are of type TEXT_NODE and contain an URL
|
|
294
|
+
const nodesURL = findURLInTextNodes(inputElement, minLengthValidURL);
|
|
295
|
+
// Starting from the back to avoid messing up earlier parts of the DOM
|
|
296
|
+
const reversedNodes = nodesURL?.toReversed() || [];
|
|
297
|
+
// Process URL to Tag
|
|
298
|
+
if (reversedNodes && reversedNodes.length > 0) {
|
|
299
|
+
replaceURLsWithTags(reversedNodes, cacheLastRange);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
// eslint-disable-next-line no-console
|
|
305
|
+
console.log(error);
|
|
306
|
+
}
|
|
307
|
+
}, [acceptableTagPattern, replaceURLsWithTags]);
|
|
182
308
|
const placeCaretAfterNode = useCallback((node) => {
|
|
183
309
|
if (!tagifyRef.current) {
|
|
184
310
|
throw new Error('Tagify instance is not initialized');
|
|
@@ -286,35 +412,43 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
286
412
|
onTagClick(event.detail);
|
|
287
413
|
}
|
|
288
414
|
}, [onTagClick]);
|
|
415
|
+
// Used to trigger change data real time
|
|
289
416
|
const onTagifyTyping = useCallback((event) => {
|
|
290
|
-
if (event.detail) {
|
|
291
|
-
const { tagify } = event.detail;
|
|
292
|
-
const inputValue = tagify.getInputValue();
|
|
293
|
-
setInputTyping(inputValue);
|
|
294
|
-
}
|
|
295
|
-
}, [setInputTyping]);
|
|
296
|
-
const onTagifyRemoved = useCallback((event) => {
|
|
297
417
|
if (event.detail) {
|
|
298
418
|
const { tagify } = event.detail;
|
|
299
419
|
const inputValue = tagify.getInputValue();
|
|
300
420
|
const convertedValue = convertInputStringToOriginal(inputValue);
|
|
421
|
+
// Tracking if the tagify input is line break
|
|
422
|
+
setIsLineBreak(hasLineBreak(convertedValue));
|
|
423
|
+
// Update URL to tag to show hint in the tooltip with tag
|
|
424
|
+
if (convertedValue) {
|
|
425
|
+
detectReplaceURLToTag();
|
|
426
|
+
}
|
|
301
427
|
onOutputData(convertedValue);
|
|
302
428
|
}
|
|
303
|
-
}, [onOutputData]);
|
|
429
|
+
}, [onOutputData, detectReplaceURLToTag]);
|
|
304
430
|
/**
|
|
305
431
|
* Used to cover more case
|
|
306
|
-
* e.g: User select all data -> backspace -> remove all data in UI but
|
|
432
|
+
* e.g: User select all data -> backspace -> remove all data in UI but the on input event [onTagifyTyping] not trigger
|
|
307
433
|
*/
|
|
308
|
-
const
|
|
434
|
+
const onTagifyChanged = useCallback((event) => {
|
|
435
|
+
if (event.detail) {
|
|
436
|
+
const { DOM, settings } = event.detail.tagify;
|
|
437
|
+
const { hasNoTags, empty } = settings.classNames;
|
|
438
|
+
const { classList } = DOM.scope;
|
|
439
|
+
if (classList.contains(empty) && classList.contains(hasNoTags)) {
|
|
440
|
+
onOutputData('');
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}, [onOutputData]);
|
|
444
|
+
const onTagifyRemoved = useCallback((event) => {
|
|
309
445
|
if (event.detail) {
|
|
310
446
|
const { tagify } = event.detail;
|
|
311
447
|
const inputValue = tagify.getInputValue();
|
|
312
448
|
const convertedValue = convertInputStringToOriginal(inputValue);
|
|
313
|
-
|
|
314
|
-
onOutputData(convertedValue);
|
|
315
|
-
}
|
|
449
|
+
onOutputData(convertedValue);
|
|
316
450
|
}
|
|
317
|
-
}, [
|
|
451
|
+
}, [onOutputData]);
|
|
318
452
|
const customizeTag = useCallback((tagData, tagify) => {
|
|
319
453
|
const { value, collection, label, type } = tagData;
|
|
320
454
|
const { settings } = tagify;
|
|
@@ -477,134 +611,6 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
477
611
|
}
|
|
478
612
|
}
|
|
479
613
|
}, []);
|
|
480
|
-
/**
|
|
481
|
-
* Updates the window selection to highlight a specified range of text within a given node.
|
|
482
|
-
* */
|
|
483
|
-
const updateWindowSelection = useCallback((node, start, end) => {
|
|
484
|
-
if (!node || !_.isNumber(start) || !_.isNumber(end))
|
|
485
|
-
return false;
|
|
486
|
-
if (node) {
|
|
487
|
-
try {
|
|
488
|
-
const range = document.createRange();
|
|
489
|
-
const textNodeLength = node.textContent?.length;
|
|
490
|
-
if (textNodeLength && start <= textNodeLength && end <= textNodeLength) {
|
|
491
|
-
range?.setStart(node, start);
|
|
492
|
-
range?.setEnd(node, end);
|
|
493
|
-
const selection = window.getSelection();
|
|
494
|
-
selection?.removeAllRanges();
|
|
495
|
-
selection?.addRange(range);
|
|
496
|
-
return onSyncSelectionStateTagify();
|
|
497
|
-
}
|
|
498
|
-
throw new Error('Invalid start/end position');
|
|
499
|
-
}
|
|
500
|
-
catch (error) {
|
|
501
|
-
// eslint-disable-next-line no-console
|
|
502
|
-
console.error(error);
|
|
503
|
-
return false;
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return false;
|
|
507
|
-
}, [onSyncSelectionStateTagify]);
|
|
508
|
-
const replaceURLsWithTags = useCallback((nodesURl, lastRange) => {
|
|
509
|
-
try {
|
|
510
|
-
if (!tagifyRef.current) {
|
|
511
|
-
throw new Error('Tagify instance is not initialized');
|
|
512
|
-
}
|
|
513
|
-
// Replace all URLs in the given nodes
|
|
514
|
-
nodesURl.forEach((textNode) => {
|
|
515
|
-
const newTags = [];
|
|
516
|
-
const textContent = textNode.textContent || '';
|
|
517
|
-
if (textContent) {
|
|
518
|
-
let match;
|
|
519
|
-
// Reset the regex's lastIndex before each execution
|
|
520
|
-
detectURLRegex.lastIndex = 0;
|
|
521
|
-
// eslint-disable-next-line no-cond-assign
|
|
522
|
-
while ((match = detectURLRegex.exec(textContent)) !== null) {
|
|
523
|
-
const url = match[0];
|
|
524
|
-
const start = match.index;
|
|
525
|
-
const end = start + url.length;
|
|
526
|
-
const newTag = {
|
|
527
|
-
url,
|
|
528
|
-
range: [start, end],
|
|
529
|
-
};
|
|
530
|
-
// add new valid URL to tags
|
|
531
|
-
newTags.push(newTag);
|
|
532
|
-
}
|
|
533
|
-
if (newTags.length > 0) {
|
|
534
|
-
// Sort tags by their position in reverse order
|
|
535
|
-
// starting from the back avoids messing up earlier parts of the document
|
|
536
|
-
newTags.sort((a, b) => b.range[0] - a.range[0]);
|
|
537
|
-
// Add tags one by one, adjusting the selection for each
|
|
538
|
-
newTags.forEach(tag => {
|
|
539
|
-
const [start, end] = tag.range;
|
|
540
|
-
if (tagifyRef.current) {
|
|
541
|
-
const isUpdated = updateWindowSelection(textNode, start, end);
|
|
542
|
-
if (isUpdated) {
|
|
543
|
-
const newTag = tagifyRef.current.createTagElem({
|
|
544
|
-
value: tag.url,
|
|
545
|
-
label: tag.url,
|
|
546
|
-
type: DETECT_LINK,
|
|
547
|
-
});
|
|
548
|
-
// Inject the new detect link tag
|
|
549
|
-
tagifyRef.current.injectAtCaret(newTag);
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
});
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
});
|
|
556
|
-
const selection = window.getSelection();
|
|
557
|
-
if (selection) {
|
|
558
|
-
if (lastRange instanceof Range) {
|
|
559
|
-
// Need to restore the selection after execution all process to replace URL to Tag
|
|
560
|
-
// to maintain valid caret
|
|
561
|
-
selection.removeAllRanges();
|
|
562
|
-
selection.addRange(lastRange);
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
// In case lost the selection not need to restore
|
|
566
|
-
// Reset the selection to clear and prepare the valid caret to add the next tag at fn: "onAddNewTag"
|
|
567
|
-
selection?.removeAllRanges();
|
|
568
|
-
onSyncSelectionStateTagify();
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
catch (error) {
|
|
573
|
-
// eslint-disable-next-line no-console
|
|
574
|
-
console.error('Error while replacing URL with tag', error);
|
|
575
|
-
}
|
|
576
|
-
}, [onSyncSelectionStateTagify, updateWindowSelection]);
|
|
577
|
-
/**
|
|
578
|
-
* Detects URLs within the text nodes of a specified input element and replaces them with tags.
|
|
579
|
-
*
|
|
580
|
-
* This function scans through all child nodes of the input element, looking for text nodes that contain URLs.
|
|
581
|
-
* When URLs are found, it creates tags for each URL and injects them into the input element, updating the selection
|
|
582
|
-
* as necessary to ensure the DOM structure remains intact.
|
|
583
|
-
* */
|
|
584
|
-
const detectReplaceURLToTag = useCallback(() => {
|
|
585
|
-
if (!tagifyRef.current)
|
|
586
|
-
return;
|
|
587
|
-
try {
|
|
588
|
-
const { input: inputElement } = tagifyRef.current.DOM;
|
|
589
|
-
if (inputElement) {
|
|
590
|
-
const selection = window.getSelection();
|
|
591
|
-
const cacheLastRange = selection?.getRangeAt && selection?.rangeCount && selection?.getRangeAt(0);
|
|
592
|
-
const minLengthValidURL = 8; // -> Because of valid URL should be "https://"
|
|
593
|
-
// Get all child nodes that are of type TEXT_NODE and contain an URL
|
|
594
|
-
const nodesURL = findURLInTextNodes(inputElement, minLengthValidURL);
|
|
595
|
-
// Starting from the back to avoid messing up earlier parts of the DOM
|
|
596
|
-
const reversedNodes = nodesURL?.toReversed() || [];
|
|
597
|
-
// Process URL to Tag
|
|
598
|
-
if (reversedNodes && reversedNodes.length > 0) {
|
|
599
|
-
replaceURLsWithTags(reversedNodes, cacheLastRange);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
catch (error) {
|
|
604
|
-
// eslint-disable-next-line no-console
|
|
605
|
-
console.log(error);
|
|
606
|
-
}
|
|
607
|
-
}, [replaceURLsWithTags]);
|
|
608
614
|
// Initialization tagify
|
|
609
615
|
useLayoutEffect(() => {
|
|
610
616
|
initializeTagify();
|
|
@@ -669,41 +675,31 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
669
675
|
// Listen to Tagify events
|
|
670
676
|
useEffect(() => {
|
|
671
677
|
const { current: tagifyInstance } = tagifyRef || {};
|
|
678
|
+
let onInputTagifyDebounce;
|
|
672
679
|
if (tagifyInstance) {
|
|
680
|
+
onInputTagifyDebounce = _.debounce(onTagifyTyping, 350);
|
|
673
681
|
tagifyInstance.on('click', onTagItemClick);
|
|
674
|
-
tagifyInstance.on('input',
|
|
682
|
+
tagifyInstance.on('input', onInputTagifyDebounce);
|
|
675
683
|
tagifyInstance.on('remove', onTagifyRemoved);
|
|
676
|
-
tagifyInstance.on('
|
|
684
|
+
tagifyInstance.on('change', onTagifyChanged);
|
|
677
685
|
}
|
|
678
686
|
// Off listen to Tagify events
|
|
679
687
|
return () => {
|
|
680
688
|
if (tagifyInstance) {
|
|
681
689
|
tagifyInstance.off('click', onTagItemClick);
|
|
682
|
-
tagifyInstance.off('input', onTagifyTyping);
|
|
683
690
|
tagifyInstance.off('remove', onTagifyRemoved);
|
|
684
|
-
tagifyInstance.off('
|
|
691
|
+
tagifyInstance.off('change', onTagifyChanged);
|
|
692
|
+
if (onInputTagifyDebounce) {
|
|
693
|
+
tagifyInstance.off('input', onInputTagifyDebounce);
|
|
694
|
+
}
|
|
685
695
|
}
|
|
686
696
|
};
|
|
687
|
-
}, [onTagItemClick, onTagifyTyping, onTagifyRemoved,
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
}, [inputTypeDebounce]);
|
|
694
|
-
// Update URL to tag to show hint in the tooltip with tag
|
|
695
|
-
useDeepCompareEffect(() => {
|
|
696
|
-
const isSupportShortlink = acceptablePatternChecking(SHORT_LINK_PTN, acceptableTagPattern);
|
|
697
|
-
if (inputTypeDebounce && isSupportShortlink) {
|
|
698
|
-
detectReplaceURLToTag();
|
|
699
|
-
}
|
|
700
|
-
}, [inputTypeDebounce, acceptableTagPattern, detectReplaceURLToTag]);
|
|
701
|
-
// Removes all tags and resets the original input tag's value property if the initial value back to is empty string
|
|
702
|
-
useUpdateEffect(() => {
|
|
703
|
-
if (initialValue === '' && tagifyRef.current) {
|
|
704
|
-
tagifyRef.current.removeAllTags();
|
|
705
|
-
}
|
|
706
|
-
}, [initialValue]);
|
|
697
|
+
}, [onTagItemClick, onTagifyTyping, onTagifyRemoved, onTagifyChanged]);
|
|
698
|
+
// At the first render, need to update URL to tag to show hint in the tooltip with tag
|
|
699
|
+
useEffect(() => {
|
|
700
|
+
detectReplaceURLToTag();
|
|
701
|
+
}, [detectReplaceURLToTag]);
|
|
702
|
+
// CAVEAT: Some case need to "FORCE" sync the original values to Tagify instance
|
|
707
703
|
useEffect(() => {
|
|
708
704
|
if (tagifyRef.current) {
|
|
709
705
|
const { DOM, settings } = tagifyRef.current;
|
|
@@ -725,9 +721,13 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
725
721
|
makeValidLabelTags(mapAttributes);
|
|
726
722
|
}
|
|
727
723
|
}
|
|
724
|
+
else if (!classList.contains(empty) && initialValue === '') {
|
|
725
|
+
// Removes all tags and resets the original input tag's value property if the initial value back to is empty string
|
|
726
|
+
tagifyRef.current.removeAllTags();
|
|
727
|
+
}
|
|
728
728
|
}
|
|
729
729
|
}, [initialValue, mapAttributes, escapeHTML, acceptableTagPattern, makeValidLabelTags]);
|
|
730
|
-
return (_jsxs(TagifyWrapper, { ref: tagifyWrapperRef, "$cssTagifyVariables": cssVariablesMemoized, className: "tagify-container", id: "tagify-container", "data-test": "tagify-wrapper", "$status": status, "$maxHeight": maxHeight, "$minWidth": minWidth, "$tagifyFullWidth":
|
|
730
|
+
return (_jsxs(TagifyWrapper, { ref: tagifyWrapperRef, "$cssTagifyVariables": cssVariablesMemoized, className: "tagify-container", id: "tagify-container", "data-test": "tagify-wrapper", "$status": status, "$maxHeight": maxHeight, "$minWidth": minWidth, "$tagifyFullWidth": isLineBreak, "$placeholder": placeholder, "$isSingleLineText": isSingleLineText, "$tagInvalidIcon": iconWarning, onClick: onTagifyWrapperClick, children: [_jsx(TagTextArea, { id: "tagify-textarea", ref: inputRef, name: name, defaultValue: parsedDefaultValue, "data-test": "tagify-input" }), _jsx(WrapperPlaceHolder, { "data-test": "wrapper-placeholder", ref: placeholderRef, "$isShow": !!children, children: children })] }));
|
|
731
731
|
});
|
|
732
732
|
TagifyInput.defaultProps = tagifyDefaultProps;
|
|
733
733
|
export default memo(TagifyInput);
|
|
@@ -40,6 +40,9 @@ export declare const TAG_TYPE: {
|
|
|
40
40
|
readonly CUSTOMER: "customer";
|
|
41
41
|
readonly VISITOR: "visitor";
|
|
42
42
|
readonly EVENT: "event";
|
|
43
|
+
readonly JOURNEY: "journey_attr";
|
|
44
|
+
readonly CAMPAIGN: "campaign_attr";
|
|
45
|
+
readonly VARIANT: "variant_attr";
|
|
43
46
|
readonly OBJECT_WIDGET: "objectWidget";
|
|
44
47
|
readonly PROMOTION_CODE: "promotion_code";
|
|
45
48
|
readonly CUSTOM_FN: "custom";
|
|
@@ -48,7 +51,7 @@ export declare const TAG_TYPE: {
|
|
|
48
51
|
readonly DETECT_LINK: "detect_link";
|
|
49
52
|
readonly CONTENT_SOURCE_GROUP: "groups";
|
|
50
53
|
};
|
|
51
|
-
export declare const CUSTOMER: "customer", VISITOR: "visitor", EVENT: "event", PROMOTION_CODE: "promotion_code", CUSTOM_FN: "custom", EMOJI: "emoji", DETECT_LINK: "detect_link", SHORT_LINK: "shortlink", OBJECT_WIDGET: "objectWidget", CONTENT_SOURCE_GROUP: "groups";
|
|
54
|
+
export declare const CUSTOMER: "customer", VISITOR: "visitor", EVENT: "event", JOURNEY: "journey_attr", CAMPAIGN: "campaign_attr", VARIANT: "variant_attr", PROMOTION_CODE: "promotion_code", CUSTOM_FN: "custom", EMOJI: "emoji", DETECT_LINK: "detect_link", SHORT_LINK: "shortlink", OBJECT_WIDGET: "objectWidget", CONTENT_SOURCE_GROUP: "groups";
|
|
52
55
|
export declare const SHORT_LINK_TYPE: {
|
|
53
56
|
readonly INDIVIDUAL: "shortlink";
|
|
54
57
|
readonly GENERAL: "shortlink_static";
|
|
@@ -62,6 +65,9 @@ export declare const TAG_COLOR: {
|
|
|
62
65
|
};
|
|
63
66
|
readonly visitor: "#e8feca";
|
|
64
67
|
readonly event: "#fecaca";
|
|
68
|
+
readonly journey_attr: "#FAFAAF";
|
|
69
|
+
readonly campaign_attr: "#FBCBE8";
|
|
70
|
+
readonly variant_attr: "#FFD8DB";
|
|
65
71
|
readonly promotion_code: "#d8cafe";
|
|
66
72
|
readonly objectWidget: "#cafedd";
|
|
67
73
|
readonly custom: "#bbefbe";
|
|
@@ -53,6 +53,9 @@ export const TAG_TYPE = {
|
|
|
53
53
|
CUSTOMER: 'customer',
|
|
54
54
|
VISITOR: 'visitor',
|
|
55
55
|
EVENT: 'event',
|
|
56
|
+
JOURNEY: 'journey_attr',
|
|
57
|
+
CAMPAIGN: 'campaign_attr',
|
|
58
|
+
VARIANT: 'variant_attr',
|
|
56
59
|
OBJECT_WIDGET: 'objectWidget',
|
|
57
60
|
PROMOTION_CODE: 'promotion_code',
|
|
58
61
|
CUSTOM_FN: 'custom',
|
|
@@ -61,7 +64,7 @@ export const TAG_TYPE = {
|
|
|
61
64
|
DETECT_LINK: 'detect_link',
|
|
62
65
|
CONTENT_SOURCE_GROUP: 'groups',
|
|
63
66
|
};
|
|
64
|
-
export const { CUSTOMER, VISITOR, EVENT, PROMOTION_CODE, CUSTOM_FN, EMOJI, DETECT_LINK, SHORT_LINK, OBJECT_WIDGET, CONTENT_SOURCE_GROUP, } = TAG_TYPE;
|
|
67
|
+
export const { CUSTOMER, VISITOR, EVENT, JOURNEY, CAMPAIGN, VARIANT, PROMOTION_CODE, CUSTOM_FN, EMOJI, DETECT_LINK, SHORT_LINK, OBJECT_WIDGET, CONTENT_SOURCE_GROUP, } = TAG_TYPE;
|
|
65
68
|
export const SHORT_LINK_TYPE = {
|
|
66
69
|
INDIVIDUAL: 'shortlink', // Individual link
|
|
67
70
|
GENERAL: 'shortlink_static', // General link
|
|
@@ -75,6 +78,9 @@ export const TAG_COLOR = {
|
|
|
75
78
|
},
|
|
76
79
|
[VISITOR]: '#e8feca',
|
|
77
80
|
[EVENT]: '#fecaca',
|
|
81
|
+
[JOURNEY]: '#FAFAAF',
|
|
82
|
+
[CAMPAIGN]: '#FBCBE8',
|
|
83
|
+
[VARIANT]: '#FFD8DB',
|
|
78
84
|
[PROMOTION_CODE]: '#d8cafe',
|
|
79
85
|
[OBJECT_WIDGET]: '#cafedd',
|
|
80
86
|
[CUSTOM_FN]: '#bbefbe',
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// Libraries
|
|
2
2
|
import stringReplaceToArray from 'string-replace-to-array';
|
|
3
3
|
// Constants
|
|
4
|
-
import {
|
|
4
|
+
import { EMOJI_COLLECTIONS, PREFIX_PATTERN_LINE_MESSAGE, READONLY_TAG, TAG_TYPE, } from './constants';
|
|
5
5
|
import { iconsViber } from './iconsViber';
|
|
6
6
|
// Utils
|
|
7
7
|
import { acceptablePatternChecking, detectURLRegex, getCachedRegex, patternHandlers, tagRegexStringPattern, } from './patternHandlers';
|
|
8
|
+
const { CUSTOMER, VISITOR, EVENT, JOURNEY, CAMPAIGN, VARIANT, PROMOTION_CODE, CUSTOM_FN, OBJECT_WIDGET, CONTENT_SOURCE_GROUP, } = TAG_TYPE;
|
|
8
9
|
/*
|
|
9
10
|
* Custom error type for JSON parse errors
|
|
10
11
|
*/
|
|
@@ -392,6 +393,9 @@ export const isPersonalizeTagType = (type) => [
|
|
|
392
393
|
CUSTOMER,
|
|
393
394
|
VISITOR,
|
|
394
395
|
EVENT,
|
|
396
|
+
JOURNEY,
|
|
397
|
+
CAMPAIGN,
|
|
398
|
+
VARIANT,
|
|
395
399
|
PROMOTION_CODE,
|
|
396
400
|
OBJECT_WIDGET,
|
|
397
401
|
CUSTOM_FN,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"_ACT_ACTION": "アクション",
|
|
3
3
|
"_ACT_ADD_AN_OPTION": "オプションを追加する",
|
|
4
4
|
"_ACT_ADD_BRANCH": "ブランチを追加する",
|
|
5
|
-
"_ACT_ADD_CONDITION": "
|
|
5
|
+
"_ACT_ADD_CONDITION": "条件を追加",
|
|
6
6
|
"_ACT_ADD_CRITERIA": "基準を追加する",
|
|
7
7
|
"_ACT_ADD_DELAY_TIME": "その日の時刻まで遅延する",
|
|
8
8
|
"_ACT_ADD_EVENT": "イベント",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"_ACT_CHANGE": "変化",
|
|
34
34
|
"_ACT_CHANGE_ASSIGN_GROUP": "割り当てグループの変更",
|
|
35
35
|
"_ACT_CHANGE_FORMAT": "フォーマットを変更する",
|
|
36
|
-
"_ACT_CHANGE_PORTAL": "
|
|
36
|
+
"_ACT_CHANGE_PORTAL": "ポータルの変更",
|
|
37
37
|
"_ACT_CHANGE_TEMPLATE": "テンプレートの変更",
|
|
38
38
|
"_ACT_CHART_TYPE": "グラフの種類",
|
|
39
39
|
"_ACT_CHOOSE_FILE_UPLOAD": "アップロードする画像を選択してください",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"_ACT_EXPORT": "輸出",
|
|
67
67
|
"_ACT_FORECAST": "予報",
|
|
68
68
|
"_TILT_FORECAST": "の予測結果",
|
|
69
|
-
"_SEG_RESULT_MESS_1": "
|
|
69
|
+
"_SEG_RESULT_MESS_1": "選択した時間範囲が有効期間外であるため、データが不十分です",
|
|
70
70
|
"_BTN_CREATE_SEG": "セグメントの作成",
|
|
71
71
|
"_ACT_GO_BACK": "戻る",
|
|
72
72
|
"_ACT_HAVE_ATTRIBUTE": "属性を持つ",
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
"_BOX_TITL_REMOVE_EVENT_ATTRIBUTE": "イベント属性の削除",
|
|
234
234
|
"_BOX_TITL_REMOVE_FIELD": "フィールドの削除",
|
|
235
235
|
"_BOX_TITL_REMOVE_GROUP": "グループの削除",
|
|
236
|
-
"_BOX_TITL_REMOVE_IMAGE": "
|
|
236
|
+
"_BOX_TITL_REMOVE_IMAGE": "画像を削除",
|
|
237
237
|
"_BOX_TITL_REMOVE_MODEL": "モデルの削除",
|
|
238
238
|
"_BOX_TITL_REPLACE_FILTER": "フィルターセットを交換する",
|
|
239
239
|
"_BOX_TITL_SAVE_FILTER": "フィルターセットに名前を付けます",
|
|
@@ -274,7 +274,7 @@
|
|
|
274
274
|
"_BREADCRUMB_CREATE_NEW_MODEL": "新しいモデルを作成する",
|
|
275
275
|
"_BREADCRUMB_CREATE_NEW_SEGMENT": "新しいセグメントを作成する",
|
|
276
276
|
"_BREADCRUMB_CREATE_NEW_SOURCE": "新しいソースを作成する",
|
|
277
|
-
"_BREADCRUMB_CREATE_NEW_STORY_WEB": "新しい Web
|
|
277
|
+
"_BREADCRUMB_CREATE_NEW_STORY_WEB": "新しい Web パーソナライゼーションの取り組みを作成する",
|
|
278
278
|
"_BREADCRUMB_CREATE_NEW_STORY_WEB_NOTI": "新しい Web 通知ジャーニーを作成する",
|
|
279
279
|
"_BREADCRUMB_CREATE_NEW_STORY_APP_NOTI": "新しいアプリ通知ジャーニーを作成する",
|
|
280
280
|
"_BREADCRUMB_CREATE_NEW_STORY_EMAIL": "新しいメールジャーニーを作成する",
|
|
@@ -415,17 +415,17 @@
|
|
|
415
415
|
"_EVENT_CLICK_WEB_PUSH": "{{customer_name}} さんが Journey {{journey_name}} からのウェブ プッシュ通知をクリックしました",
|
|
416
416
|
"_EVENT_CLICK_ZALO_CHAT": "{{customer_name}} さんが Journey {{journey_name}} からの Zalo メッセージをクリックしました",
|
|
417
417
|
"_EVENT_DES_ADD_TO_CART_PRODUCT": "{{customer_name}} さんが商品 {{product_name}} をショッピング カートに追加しました",
|
|
418
|
-
"_EVENT_DES_BROWSING_PRODUCT_LIST_FILTER": "
|
|
418
|
+
"_EVENT_DES_BROWSING_PRODUCT_LIST_FILTER": "商品をフィルタリングした後に返された結果を {{customer_name}} が閲覧しました",
|
|
419
419
|
"_EVENT_DES_BROWSING_PRODUCT_SEARCH": "{{customer_name}} さんがキーワード {{keyword}} の検索から返された商品リストを閲覧しました",
|
|
420
420
|
"_EVENT_DES_CAILL_IN_CALL": "{{customer_name}} がカスタマー サービスに電話しました",
|
|
421
421
|
"_EVENT_DES_CALL_OUT_CALL": "{{customer_name}} がカスタマー サービスから電話を受けました",
|
|
422
422
|
"_EVENT_DES_CANCEL_ORDER": "{{customer_name}} が注文 {{order_id}} をキャンセルしました",
|
|
423
|
-
"_EVENT_DES_CHAT_CONVERSATION": "{{customer_name}}
|
|
423
|
+
"_EVENT_DES_CHAT_CONVERSATION": "{{customer_name}} が {{channel_name}} 経由でカスタマー サービスとチャットしました",
|
|
424
424
|
"_EVENT_DES_CHECKOUT_CART_PRODUCT": "{{customer_name}} が注文プロセスを開始しました (トランザクションが作成されました)",
|
|
425
425
|
"_EVENT_DES_CLICK_ADVERTISING": "{{customer_name}} さんがキャンペーン {{campaign_name}} をクリックしました",
|
|
426
426
|
"_EVENT_DES_CLICK_EMAIL_ADVERTISING": "{{customer_name}} が広告 {{advertising_name}} のメールをクリックしました",
|
|
427
427
|
"_EVENT_DES_CLICK_PRODUCT": "{{customer_name}} さんが商品 {{product_name}} をクリックしました",
|
|
428
|
-
"_EVENT_DES_CLICK_TRACKING_ADVERTISING": "{{customer_name}}
|
|
428
|
+
"_EVENT_DES_CLICK_TRACKING_ADVERTISING": "{{customer_name}} がトラッキング広告 {{advertising_name}} をクリックしました",
|
|
429
429
|
"_EVENT_DES_IDENTIFY_USER": "匿名訪問者プロファイル {{user_id}} は、この顧客プロファイルに関連付けられていました。",
|
|
430
430
|
"_EVENT_DES_IMPRESSION_ADVERTISING": "キャンペーン {{campaign_name}} は {{customer_name}} に送信されました",
|
|
431
431
|
"_EVENT_DES_PURCHASE_TRANSACTION": "{{customer_name}} が、{{num_of_products}} 個の製品 {{store_link}} のトランザクション購入 ID {{order_id}} を実行しました",
|
|
@@ -725,7 +725,7 @@
|
|
|
725
725
|
"_NOTI_ADD_CRITERIA": "少なくとも 1 つの条件を追加してください",
|
|
726
726
|
"_NOTI_ADD_EVENT_BEFORE_ASSIGN_ATTRIBUTE": "イベント属性と参照オブジェクトを割り当てる前に、ソースにイベントを追加する必要があります",
|
|
727
727
|
"_NOTI_ALERT_EDIT_DESTINATION": "この宛先を編集すると、他の機能の入力に影響します",
|
|
728
|
-
"_NOTI_AM_BEING_COMPUTED": "
|
|
728
|
+
"_NOTI_AM_BEING_COMPUTED": "このモデルは計算中です。構築プロセスが完了するまで一部のフィールドは変更できません",
|
|
729
729
|
"_NOTI_ASSIGN_ATTRIBUTE_ERROR": "属性の割り当てエラー",
|
|
730
730
|
"_NOTI_ATTR_HAS_BEEN_REMOVE": "属性が削除されました",
|
|
731
731
|
"_NOTI_ATTRIBUTE_BEING_COMPUTED": "この属性は計算中です。構築プロセスが完了するまで一部のフィールドは変更できません",
|
|
@@ -1018,7 +1018,7 @@
|
|
|
1018
1018
|
"_TITL_COMPRESS_FILE": "ファイルを圧縮する",
|
|
1019
1019
|
"_TITL_COMPUTE_SCHEDULE": "コンピューティングスケジュール",
|
|
1020
1020
|
"_TITL_COMPUTE_TIME_RANGE": "計算時間範囲",
|
|
1021
|
-
"_TITL_COMPUTE_WITH_CONDITION": "
|
|
1021
|
+
"_TITL_COMPUTE_WITH_CONDITION": "以下の条件で計算します",
|
|
1022
1022
|
"_TITL_COMPUTED_ATTR_TYPE": "計算された属性のタイプ",
|
|
1023
1023
|
"_TITL_CONFIGURE_FIELD": "フィールドの構成",
|
|
1024
1024
|
"_TITL_CONFIGURE_LAYOUT_VARIABLE": "レイアウト変数を設定する",
|
|
@@ -1054,7 +1054,7 @@
|
|
|
1054
1054
|
"_TITL_DELIVERY_ALGORITHM": "配信アルゴリズム",
|
|
1055
1055
|
"_TITL_DELIVERY_DETAIL": "納品詳細",
|
|
1056
1056
|
"_TITL_DELIVERY_PERFORMANCE": "配信パフォーマンス",
|
|
1057
|
-
"_TITL_DELIVERY_RATE": "
|
|
1057
|
+
"_TITL_DELIVERY_RATE": "配送料",
|
|
1058
1058
|
"_TITL_DELIVERY_RESULT": "納品実績",
|
|
1059
1059
|
"_TITL_DELIVERY_STATUS": "配送状況",
|
|
1060
1060
|
"_TITL_DESCENDING": "降順",
|
|
@@ -1119,7 +1119,7 @@
|
|
|
1119
1119
|
"_TITL_GENERAL_SETTING": "一般設定",
|
|
1120
1120
|
"_TITL_GET_ALL_VALUE": "全要素取得(最大100要素)",
|
|
1121
1121
|
"_TITL_GET_THE_TOP_VALUE": "トップを獲得する",
|
|
1122
|
-
"_TITL_GET_TRACKING_CODE": "{{zone_name}} の広告ゾーン
|
|
1122
|
+
"_TITL_GET_TRACKING_CODE": "{{zone_name}} の広告ゾーン スクリプトを取得",
|
|
1123
1123
|
"_TITL_GROUP_ATTRIBUTE": "グループ属性",
|
|
1124
1124
|
"_TITL_GROUP_NAME": "グループ名",
|
|
1125
1125
|
"_TITL_HARD_BOUNCE": "ハードバウンス",
|
|
@@ -1217,7 +1217,7 @@
|
|
|
1217
1217
|
"_TITL_ORIGINAL_NAME": "オリジナル",
|
|
1218
1218
|
"_TITL_PAGE_DOWNLOAD": "ページのダウンロード",
|
|
1219
1219
|
"_TITL_PERCENTAGE": "パーセンテージ",
|
|
1220
|
-
"_TITL_PERCENTAGE_SETTING": "
|
|
1220
|
+
"_TITL_PERCENTAGE_SETTING": "パーセンテージ設定",
|
|
1221
1221
|
"_TITL_PERFORM_EVENT": "イベントを行う",
|
|
1222
1222
|
"_TITL_PERSONALIZATION_CODE": "コードをマージ",
|
|
1223
1223
|
"_TITL_PERSONALIZATION_TAG": "タグを結合",
|
|
@@ -1344,7 +1344,7 @@
|
|
|
1344
1344
|
"_USER_GUIDE_CLONE": "元のアイテムの設定を継承した新しいアイテムが作成されます。これは元のものには何も影響しません。 <br />\n新しいアイテムに名前を付けて、「保存」をクリックしてください。",
|
|
1345
1345
|
"_USER_GUIDE_COLLECTION_CREATE_CRITERIA": "ファイルの を使用して、このコレクションに適したアイテムを見つけるための条件を作成します",
|
|
1346
1346
|
"_USER_GUIDE_COLLECTION_CREATE_CRITERIA_INTRO": "このシステムは、条件を満たすアイテムを検索し、このコレクションに追加します。",
|
|
1347
|
-
"_USER_GUIDE_COLLECTION_CREATE_CRITERIA_NOTE": "<b>注:</b>\n</br> -
|
|
1347
|
+
"_USER_GUIDE_COLLECTION_CREATE_CRITERIA_NOTE": "<b>注:</b>\n</br> - アップロードされたファイルから、本システム内に存在するIDのアイテムのみ作成するコレクションに追加できます\n</br> - アップロードされたファイルは最後に使用されてから 6 か月間保存され、その後は使用できなくなります。",
|
|
1348
1348
|
"_USER_GUIDE_FILE_STORAGE_LIMIT": "<b>注:</b> アップロードされたファイルは最後に使用されてから 6 か月間保存され、その後は使用できなくなります。",
|
|
1349
1349
|
"_UPLOAD_FILE_DELETED_ERROR_MESSAGE": "アップロードされたファイルが削除されました",
|
|
1350
1350
|
"_USER_GUIDE_CONFIRM_NEW_PASSWORD": "新しいパスワードを確認します",
|
|
@@ -1424,7 +1424,7 @@
|
|
|
1424
1424
|
"_USER_GUIDE_TOTAL_ATTR_MEASURE": "合計 {{num_attr}} 個の属性と {{num_measure}} 個のメジャーが選択されました",
|
|
1425
1425
|
"_USER_GUIDE_TOTAL_BRANCH": "注: 合計 100%",
|
|
1426
1426
|
"_USER_GUIDE_TOTAL_FIELD": "{{x}} 個の選択されたフィールド",
|
|
1427
|
-
"_USER_GUIDE_UPLOAD_FILE": "- サポートされているファイル形式は次のとおりです: .csv、.xls、.xlsx <br />\n- .xlsx ファイルの最初の行はヘッダー行とみなされます<br />\n- デフォルトのデータエンコーディングはUTF-8
|
|
1427
|
+
"_USER_GUIDE_UPLOAD_FILE": "- サポートされているファイル形式は次のとおりです: .csv、.xls、.xlsx <br />\n- .xlsx ファイルの最初の行はヘッダー行とみなされます<br />\n- デフォルトのデータエンコーディングはUTF-8です",
|
|
1428
1428
|
"_USER_GUIDE_UPLOAD_FILE_BEFORE_MAPPING": "属性をマッピングする前にファイルをアップロードする必要があります",
|
|
1429
1429
|
"_USER_GUIDE_UPLOAD_WAITING": "システムの処理が完了するまで 10 分間お待ちください。<br />\nページを更新してデータを確認します",
|
|
1430
1430
|
"_USER_GUIDE_USER_NOT_FOUND": "ユーザーが見つかりません",
|
|
@@ -1454,7 +1454,7 @@
|
|
|
1454
1454
|
"_WARN_NOT_DELETE_ITEMS": "これらの {{module}} は、他の機能の入力として使用されているため、削除できません。",
|
|
1455
1455
|
"_WARN_NOTE_APPLY_CHANGE_FIELD": "現在のフィールドに変更をまだ適用していません。これらの変更を保存しますか?",
|
|
1456
1456
|
"_WARN_ONLY_ACTION_STORY_PAUSED": "「{{list_paused_story_name}}」は正常に一時停止されました。<br /> 一時停止できるのはアクションベースのトリガー ジャーニーのみであり、スケジュール トリガー ジャーニーには適用されないことに注意してください。",
|
|
1457
|
-
"_WARN_ONLY_VALID_ALL_STORY_ACTIVATED": "「{{list_story_name}}
|
|
1457
|
+
"_WARN_ONLY_VALID_ALL_STORY_ACTIVATED": "「{{list_story_name}}」を有効にしました",
|
|
1458
1458
|
"_WARN_ONLY_VALID_STORY_ACTIVATED": "「{{list_story_name}}」を有効にしました<br />\n選択した他の旅程は有効化のための検証ステップを通過していません。各旅程のデザインで詳細を確認してください。",
|
|
1459
1459
|
"_WARN_REMOVE_ASSOCIATED_CONDITION": "ソース「{{source_name}}」を削除すると、このソースにのみ存在する関連する属性条件も削除されます。",
|
|
1460
1460
|
"_WARN_REMOVE_BRANCH": "既存の一連のアクションの途中にあるブランチを削除しています。続行するには、次のことができます",
|
|
@@ -1472,7 +1472,7 @@
|
|
|
1472
1472
|
"_WARN_SEGMENT_IN_QUEUE": "これは、キュー内で計算を待っているセグメントです。条件を編集したい場合は、計算を開始する前に無効にする必要があります。",
|
|
1473
1473
|
"_WARN_SETTING_FIELD_INVALID": "設定フィールドが無効です。保存する前に設定フィールドを完了してください。",
|
|
1474
1474
|
"_WARN_VALIDATE_END_DATE_PAST": "ジャーニーの終了日を過去 (end_date} {{end_time}}) に設定しているため、ジャーニーをアクティブ化できません。終了日を更新して、ジャーニーを再度アクティブ化してください。",
|
|
1475
|
-
"_WARN_VALIDATE_LACK_DESTINATION": "
|
|
1475
|
+
"_WARN_VALIDATE_LACK_DESTINATION": "有効な移動には少なくとも 1 つの目的地ノードが必要です",
|
|
1476
1476
|
"_WARN_VALIDATE_START_DATE_PAST": "旅の開始日を {{start_date}} の {{start_time}} に設定しましたが、すでに過ぎています。\nアクティブ化をキャンセルして開始時刻を更新することも、旅行を破棄してすぐにアクティブ化することもできます。",
|
|
1477
1477
|
"_WARNING": "警告!",
|
|
1478
1478
|
"_ZONE_TYPE_CSS_SELECTOR": "CSSセレクターを使用する",
|
|
@@ -1513,14 +1513,14 @@
|
|
|
1513
1513
|
"_TITL_EXPIRATION_TIME": "有効期限",
|
|
1514
1514
|
"_USER_GUIDE_UPLOAD_PROMOTION_CODE": "<b>注:</b>\n </br> - CDP 365 に存在しない新しいコードのみをインポートできます\n </br> - アップロードされたファイルは最後に使用されてから 6 か月間保存され、その後は使用できなくなります。",
|
|
1515
1515
|
"_TAB_PROMOTION_CODE": "プロモーションコード",
|
|
1516
|
-
"_TAB_POOL_SETTING": "
|
|
1516
|
+
"_TAB_POOL_SETTING": "プールの設定",
|
|
1517
1517
|
"_TITL_PROMOTION_CODE_INFO": "プロモーションコード情報",
|
|
1518
1518
|
"_TITL_CODE_GENERAL_INFO": "コードの一般情報",
|
|
1519
1519
|
"_TITL_CODE_DELIVERY_INFO": "コード配信情報",
|
|
1520
1520
|
"_TITL_USED_INFO": "使用されているコード情報 ",
|
|
1521
1521
|
"_TITL_PROMOTION_CODE": "プロモーションコード:",
|
|
1522
1522
|
"_TITL_ALLOCATED_TO_JOURNEY": "ジャーニーに割り当てられている:",
|
|
1523
|
-
"_TITL_ALLOCATED_TO_AUDIENCE": "
|
|
1523
|
+
"_TITL_ALLOCATED_TO_AUDIENCE": "聴衆に割り当てられる:",
|
|
1524
1524
|
"_ACT_MOVE_TO": "に移動します",
|
|
1525
1525
|
"_BOX_TITL_MOVE_CODE": "{{x}} 個のコードを別のプールに移動します ",
|
|
1526
1526
|
"_TITL_MOVE_TO_POOL": "プールに移動",
|
|
@@ -1744,7 +1744,7 @@
|
|
|
1744
1744
|
"_OPT_TRIGGER_FC_LIFETIME": "一生",
|
|
1745
1745
|
"_OPT_TRIGGER_FC_IMPRESSION": "印象",
|
|
1746
1746
|
"_MENU_SUB_UPLOAD_HISTORY": "アップロード履歴",
|
|
1747
|
-
"_USER_GUIDE_SEG_STATUS_ENABLE": "
|
|
1747
|
+
"_USER_GUIDE_SEG_STATUS_ENABLE": "セグメントは間隔で構築でき、他のオブジェクトで使用できます",
|
|
1748
1748
|
"_USER_GUIDE_SEG_STATUS_DISABLE": "セグメントは間隔の構築を停止しました。 セグメントは他のオブジェクトで使用できますが、新しいデータは使用できません",
|
|
1749
1749
|
"_USER_GUIDE_SEG_STATUS_ARCHIVE": "セグメントは間隔の構築を停止したため、他のオブジェクトでは使用できません",
|
|
1750
1750
|
"_USER_GUIDE_COL_STATUS_ENABLE": "コレクションはインターバルビルド可能で、他のオブジェクトでも使用可能",
|
|
@@ -1774,7 +1774,7 @@
|
|
|
1774
1774
|
"_PORTAL_LIMITATION_DES_COL_ARCHIVED": "コレクションは、使用されない場合はアーカイブされます。",
|
|
1775
1775
|
"_PORTAL_LIMITATION_DES_COL_DELETE": "までに回復しない場合、コレクションは完全に削除されます",
|
|
1776
1776
|
"_PORTAL_LIMITATION_DES_BO_DISABLED": "データ オブジェクトは、次の場所で使用されない場合は無効になります。",
|
|
1777
|
-
"_PORTAL_LIMITATION_DES_BO_ARCHIVED": "
|
|
1777
|
+
"_PORTAL_LIMITATION_DES_BO_ARCHIVED": "データ オブジェクトは、使用されない場合はアーカイブされます。",
|
|
1778
1778
|
"_PORTAL_LIMITATION_DES_BO_DELETE": "次の期間に回復しない場合、データ オブジェクトは完全に削除されます",
|
|
1779
1779
|
"_PORTAL_LIMITATION_DES_ATTR_DISABLED": "で使用されない場合、属性は無効になります。 ",
|
|
1780
1780
|
"_PORTAL_LIMITATION_DES_ATTR_ARCHIVED": "属性が使用されない場合はアーカイブされます。",
|
|
@@ -1786,7 +1786,7 @@
|
|
|
1786
1786
|
"_COMPUTATION_SEGMENT_PROPERTY_DELETED": "セグメントのプロパティで使用されているオブジェクトが存在しません",
|
|
1787
1787
|
"_COMPUTATION_ATTRIBUTE_PROPERTY_ARCHIVED": "属性のプロパティで使用されるオブジェクトはアーカイブされています",
|
|
1788
1788
|
"_COMPUTATION_ATTRIBUTE_PROPERTY_DELETED": "属性のプロパティで使用されているオブジェクトが存在しません",
|
|
1789
|
-
"_MEASURE_TYPE_UC_APPROXIMATE_DATASKETCHES": "
|
|
1789
|
+
"_MEASURE_TYPE_UC_APPROXIMATE_DATASKETCHES": "一意のおおよその数 (データスケッチ)",
|
|
1790
1790
|
"_TITL_ASSOCIATE_UTM": "UTMと連携する",
|
|
1791
1791
|
"_TITL_PLANNING": "企画",
|
|
1792
1792
|
"_TITLE_PLAN_ALL_PLANS": "すべてのプラン",
|
|
@@ -1805,7 +1805,7 @@
|
|
|
1805
1805
|
"_USER_GUIDE_PLAN_REMOVE_GROUP_CONTENT": "このグループを削除してもよろしいですか?",
|
|
1806
1806
|
"_ACT_PLAN_SAVE_AS_NEW_SEG": "新しいセグメントとして保存",
|
|
1807
1807
|
"_ACT_PLAN_SAVE_AS_EXIST_SEG": "または、既存のセグメントにロードします",
|
|
1808
|
-
"_TITLE_SELECT_SEGMENT": "
|
|
1808
|
+
"_TITLE_SELECT_SEGMENT": "セグメントを選択",
|
|
1809
1809
|
"_DES_LAST_BUILD_TIME": "前回のビルド時間",
|
|
1810
1810
|
"_ACT_PLAN_SAVE_AS": "名前を付けて保存",
|
|
1811
1811
|
"_ACT_PLAN_PRIVATE_TEMPLATE": "プライベートテンプレート",
|
|
@@ -1816,7 +1816,7 @@
|
|
|
1816
1816
|
"_USER_GUIDE_PLAN_PROCESSING": "処理...",
|
|
1817
1817
|
"_USER_GUIDE_MOVE_GROUP_INCLUDE": "人を含めるためにグループをここに移動します",
|
|
1818
1818
|
"_USER_GUIDE_MOVE_GROUP_EXCLUDE": "ユーザーを除外するにはグループをここに移動します",
|
|
1819
|
-
"_USER_GUIDE_NOTIFY_PROCESSING_SUCCESS": "{{セグメント名}}セグメントのデータ処理が完了しました",
|
|
1819
|
+
"_USER_GUIDE_NOTIFY_PROCESSING_SUCCESS": "{{セグメント名}} セグメントのデータ処理が完了しました",
|
|
1820
1820
|
"_USER_GUIDE_NOTIFY_PROCESSING_FAILT": "{{セグメント名}} セグメントのデータ処理に失敗しました",
|
|
1821
1821
|
"_TITLE_NOTIFY_HIDE": "隠れる",
|
|
1822
1822
|
"_TITLE_BTN_RECOMPUTED": "再計算された",
|
|
@@ -1948,7 +1948,7 @@
|
|
|
1948
1948
|
"_WARN_TITLE_AM_CREATED_BY": "作成者",
|
|
1949
1949
|
"_ERROR_MESS_AM_COMPUTED_LIMIT": "この時間内に構築される分析モデルの数の制限に達しました。",
|
|
1950
1950
|
"_WARN_TITLE_AM_COMPUTATIONAL_LIMIT": "警告 分析モデルの計算制限",
|
|
1951
|
-
"_WARN_AM_COMPUTATIONAL_LIMIT": "
|
|
1951
|
+
"_WARN_AM_COMPUTATIONAL_LIMIT": "現在、計算制限に達しているため、システムは次の有効な時間にこの分析モデルを計算します。",
|
|
1952
1952
|
"_WARN_TITLE_BO_WARN_TOTAL": "警告 ビジネス オブジェクトの合計制限",
|
|
1953
1953
|
"_WARN_BO_WARN_TOTAL_CONTENT_CREATE": "ビジネス オブジェクトの数が制限に達しました。\n新しいビジネス オブジェクトを作成する場合は、未使用のビジネス オブジェクトをアーカイブしてください。",
|
|
1954
1954
|
"_ACT_WARN_BO_GO_TO_LIST": "ビジネスオブジェクトリストに移動",
|
|
@@ -1983,7 +1983,7 @@
|
|
|
1983
1983
|
"_WARN_COLL_WARN_TOTAL_CONTENT_RECOVER": "{{dynamic_collections}} {{static_collections}} の数が制限に達しました。\nコレクションを回復したい場合は、未使用のコレクションをアーカイブしてください。",
|
|
1984
1984
|
"_ERROR_MESS_COLL_COMPUTED_LIMIT": "この時間内に構築されるコレクションの数の制限に達しました。",
|
|
1985
1985
|
"_WARN_TITLE_COLL_COMPUTATIONAL_LIMIT": "警告収集の計算制限",
|
|
1986
|
-
"_WARN_COLL_COMPUTATIONAL_LIMIT": "
|
|
1986
|
+
"_WARN_COLL_COMPUTATIONAL_LIMIT": "現在、計算制限に達しているため、システムは次の有効な時間にこのコレクションを計算します。",
|
|
1987
1987
|
"_OPTION_SEGMENT_SCHEDULE_DETAILS_HOUR_AM": "{{x}} 時間ごとに {{HH:MM}} 時",
|
|
1988
1988
|
"_OPTION_SEGMENT_SCHEDULE_DETAILS_HOUR_PM": "{{x}} 時間ごとに 午後{{HH:MM}} 時",
|
|
1989
1989
|
"_OPTION_SEGMENT_SCHEDULE_DETAILS_DAY_AM": "{{x}}日ごとの {{HH:MM}} 時",
|
|
@@ -2101,7 +2101,7 @@
|
|
|
2101
2101
|
"_PREDICT_MODEL_UPDATE_INTO_EXISTING_SEGMENT": "既存のセグメントへの更新",
|
|
2102
2102
|
"_PREDICT_MODEL_CREATE_NEW_ATTRIBUTE": "新しい属性を作成する",
|
|
2103
2103
|
"_PREDICT_MODEL_UPDATE_INTO_EXISTING_ATTRIBUTE": "既存の属性に更新する",
|
|
2104
|
-
"_PREDICT_MODEL_SELECT_SEGMENT": "
|
|
2104
|
+
"_PREDICT_MODEL_SELECT_SEGMENT": "セグメントを選択",
|
|
2105
2105
|
"_PREDICT_MODEL_SELECT_ATTRIBUTE": "属性の選択",
|
|
2106
2106
|
"_PREDICT_MODEL_CANNOT_LOSE_THEM": "それらを失うことはできません",
|
|
2107
2107
|
"_PREDICT_MODEL_AT_RISK": "危険にさらされています",
|
|
@@ -2171,7 +2171,7 @@
|
|
|
2171
2171
|
"_EVENT_CLICK_VIBER": "{{customer_name}} さんが Journey {{journey_name}} からの Viber メッセージをクリックしました",
|
|
2172
2172
|
"_EVENT_CLICK_SMS": "{{customer_name}} さんが Journey {{journey_name}} からの SMS メッセージをクリックしました",
|
|
2173
2173
|
"_EVENT_SENT_WEB_PERSONALIZA": "ジャーニー {{journey_name}} が {{customer_name}} に送信されました",
|
|
2174
|
-
"_EVENT_SENT_WEB_PUSH": "ジャーニー {{journey_name}}
|
|
2174
|
+
"_EVENT_SENT_WEB_PUSH": "ジャーニー {{journey_name}} がウェブ プッシュ通知経由で {{customer_name}} に送信されました",
|
|
2175
2175
|
"_EVENT_SENT_APP PUSH": "ジャーニー {{journey_name}} がアプリのプッシュ通知経由で {{customer_name}} に送信されました",
|
|
2176
2176
|
"_EVENT_SENT_EMAIL": "Journey {{journey_name}} からのメールが {{customer_name}} に送信されました",
|
|
2177
2177
|
"_EVENT_SENT_FB": "Journey {{journey_name}} からの Facebook メッセージが {{customer_name}} に送信されました",
|
|
@@ -2278,7 +2278,7 @@
|
|
|
2278
2278
|
"_BLCK_OTP_BUTTN_ACTION": "ボタンアクション",
|
|
2279
2279
|
"_MED_TEMP_SETTING_MESS": "メッセージ",
|
|
2280
2280
|
"_BLCK_OTP_MESS_FAILED_VERI": "検証に失敗しました",
|
|
2281
|
-
"_BLCK_OTP_MESS_RESENT": "再送信された
|
|
2281
|
+
"_BLCK_OTP_MESS_RESENT": "再送信されたOTP",
|
|
2282
2282
|
"_MED_TEMP_SETTING_POSITION": "位置",
|
|
2283
2283
|
"_BLCK_OTP_EVENT_TRIGGER": "イベントトリガー",
|
|
2284
2284
|
"_BLCK_OTP_EVENT": "イベント",
|
|
@@ -2445,7 +2445,7 @@
|
|
|
2445
2445
|
"_OBJ_DES_APP_NOTI_4": "ユーザーの興味や好みに合わせた関連性の高い有益な通知を送信することで、ユーザーの関心を維持し、さらに戻ってくるようにします。",
|
|
2446
2446
|
"_OBJ_DES_APP_NOTI_5": "アカウント、トランザクション更新などの関連情報をユーザーのブラウザに直接配信します。",
|
|
2447
2447
|
"_OBJ_DES_EMAIL_1": "魅力的なコンテンツと電子メールの行動喚起 (CTA) でユーザーを Web サイトに誘導します",
|
|
2448
|
-
"_OBJ_DES_EMAIL_2": "
|
|
2448
|
+
"_OBJ_DES_EMAIL_2": "貴重なコンテンツやインセンティブを提供してサインアップや問い合わせを促進することで見込み顧客を獲得します。",
|
|
2449
2449
|
"_OBJ_DES_EMAIL_3": "ターゲットを絞ったコンテンツと自動化された電子メール シーケンスを使用して、セールス ファネルを通じてリードを誘導します。",
|
|
2450
2450
|
"_OBJ_DES_EMAIL_4": "関連するアップデート、オファー、限定コンテンツで顧客の関心とロイヤルティを維持します",
|
|
2451
2451
|
"_OBJ_DES_EMAIL_5": "製品やサービスを紹介して売上とコンバージョンを促進する",
|
|
@@ -2453,7 +2453,7 @@
|
|
|
2453
2453
|
"_OBJ_DES_SMS_1": "時間制限のある更新、プロモーション、アラートでユーザーに即座に連絡します",
|
|
2454
2454
|
"_OBJ_DES_SMS_2": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2455
2455
|
"_OBJ_DES_SMS_3": "情報の再発行や登録確認など、迅速かつ便利なサポートを提供します",
|
|
2456
|
-
"_OBJ_DES_SMS_4": "
|
|
2456
|
+
"_OBJ_DES_SMS_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2457
2457
|
"_OBJ_DES_SMS_5": "注文確認、出荷通知、アカウント更新をリアルタイムで提供します",
|
|
2458
2458
|
"_OBJ_DES_SMART_INB_1": "通知を集約し、ユーザーがメッセージを 1 か所で簡単に表示および管理できるようにします。",
|
|
2459
2459
|
"_OBJ_DES_SMART_INB_2": "プラットフォーム間で通知にアクセスし、通知を操作するためのシームレスで直感的なインターフェイスを提供します。",
|
|
@@ -2462,55 +2462,55 @@
|
|
|
2462
2462
|
"_OBJ_DES_FB_MESS_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2463
2463
|
"_OBJ_DES_FB_MESS_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2464
2464
|
"_OBJ_DES_FB_MESS_3": "タイムリーで効率的な顧客サポートを提供し、メッセンジャー内で直接問い合わせに対応し、問題を解決します。",
|
|
2465
|
-
"_OBJ_DES_FB_MESS_4": "
|
|
2465
|
+
"_OBJ_DES_FB_MESS_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2466
2466
|
"_OBJ_DES_FB_MESS_5": "アンケートやインタラクティブなテンプレートを通じて、ユーザーから貴重な洞察とフィードバックを直接収集します",
|
|
2467
2467
|
"_OBJ_DES_VIBER_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2468
2468
|
"_OBJ_DES_VIBER_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2469
|
-
"_OBJ_DES_VIBER_3": "
|
|
2469
|
+
"_OBJ_DES_VIBER_3": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2470
2470
|
"_OBJ_DES_VIBER_4": "注文確認、配送の最新情報、または予約のリマインダーを送信する",
|
|
2471
2471
|
"_OBJ_DES_VIBER_5": "アンケートやインタラクティブなテンプレートを通じて、ユーザーから貴重な洞察とフィードバックを直接収集します",
|
|
2472
2472
|
"_OBJ_DES_ZALO_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2473
2473
|
"_OBJ_DES_ZALO_2": "インタラクティブな要素を使用して販売目標到達プロセスをガイドし、リードと見込み顧客を育成します。",
|
|
2474
2474
|
"_OBJ_DES_ZALO_3": "タイムリーなコミュニケーションを確保するために、注文確認、配送の最新情報、または予約のリマインダーを送信します。",
|
|
2475
|
-
"_OBJ_DES_ZALO_4": "
|
|
2475
|
+
"_OBJ_DES_ZALO_4": "重要なお知らせ、アップデート、ニュースをユーザーと共有して常に最新情報を入手します。",
|
|
2476
2476
|
"_OBJ_DES_ZALO_5": "一貫性があり、有益で魅力的なコンテンツを通じてブランド アイデンティティと価値を強化する",
|
|
2477
2477
|
"_OBJ_DES_WHATSAPP_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2478
2478
|
"_OBJ_DES_WHATSAPP_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2479
2479
|
"_OBJ_DES_WHATSAPP_3": "インタラクティブな要素を使用して販売目標到達プロセスをガイドし、リードと見込み顧客を育成します。",
|
|
2480
|
-
"_OBJ_DES_WHATSAPP_4": "
|
|
2481
|
-
"_OBJ_DES_WHATSAPP_5": "
|
|
2480
|
+
"_OBJ_DES_WHATSAPP_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2481
|
+
"_OBJ_DES_WHATSAPP_5": "重要なお知らせ、アップデート、ニュースをユーザーと共有して常に最新情報を入手します。",
|
|
2482
2482
|
"_OBJ_DES_TELEGRAM_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2483
2483
|
"_OBJ_DES_TELEGRAM_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2484
2484
|
"_OBJ_DES_TELEGRAM_3": "インタラクティブなテンプレート要素を使用してセールスファネルを誘導し、リードと見込み顧客を育成します。",
|
|
2485
|
-
"_OBJ_DES_TELEGRAM_4": "
|
|
2486
|
-
"_OBJ_DES_TELEGRAM_5": "
|
|
2485
|
+
"_OBJ_DES_TELEGRAM_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2486
|
+
"_OBJ_DES_TELEGRAM_5": "重要なお知らせ、アップデート、ニュースをユーザーと共有して常に最新情報を入手します。",
|
|
2487
2487
|
"_OBJ_DES_LINE_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2488
2488
|
"_OBJ_DES_LINE_2": "Line のリッチ メニューを利用して、メッセージ内のインタラクティブなオプションとナビゲーションをユーザーに提供します",
|
|
2489
2489
|
"_OBJ_DES_LINE_3": "インタラクティブなテンプレート要素を使用してセールスファネルを誘導し、リードと見込み顧客を育成します。",
|
|
2490
|
-
"_OBJ_DES_LINE_4": "
|
|
2491
|
-
"_OBJ_DES_LINE_5": "
|
|
2490
|
+
"_OBJ_DES_LINE_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2491
|
+
"_OBJ_DES_LINE_5": "重要なお知らせ、アップデート、ニュースをユーザーと共有して常に最新情報を入手します。",
|
|
2492
2492
|
"_OBJ_DES_FILE_TRANSFER_1": "さまざまなシステム間での大規模なデータセットの共有を自動化し、より迅速かつ正確なデータ処理を実現します。",
|
|
2493
2493
|
"_OBJ_DES_FILE_TRANSFER_2": "マーケティング資料やキャンペーン資産をチームメンバーや外部関係者に簡単に配布し、より良いコラボレーションとコミュニケーションを促進します。",
|
|
2494
2494
|
"_OBJ_DES_FILE_TRANSFER_3": "ファイル転送をマーケティングオートメーションに統合して時間と人的リソースを節約する",
|
|
2495
2495
|
"_OBJ_DES_ORCHES_1": "さまざまなチャネルを通じて顧客にリーチし、ブランドの認知度を高め、市場への浸透を高めることで、ブランドの認知度を高めます。",
|
|
2496
2496
|
"_OBJ_DES_ORCHES_2": "好みのプラットフォームで顧客を引き込み、ロイヤルティと支持を促進するシームレスで記憶に残るインタラクションを生み出します。",
|
|
2497
|
-
"_OBJ_DES_ORCHES_3": "
|
|
2497
|
+
"_OBJ_DES_ORCHES_3": "チャネル全体でターゲットを絞ったメッセージを送信して購入者の購買行動をガイドし、コンバージョンを促進し、販売機会を最大化します。",
|
|
2498
2498
|
"_OBJ_DES_ORCHES_4": "チャネルの好みや行動に基づいて特定の視聴者セグメントに合わせてキャンペーンを調整し、共感を呼び、コンバージョンにつながるパーソナライズされたエクスペリエンスを提供します。",
|
|
2499
2499
|
"_OBJ_DES_ORCHES_5": "すべてのチャネルにわたって包括的な分析を取得し、データ主導の意思決定と継続的なキャンペーンの改善を強化して、最適な結果と ROI を実現します。",
|
|
2500
|
-
"_WEBPER_TEMP_OBJ_DES_POP_1": "
|
|
2500
|
+
"_WEBPER_TEMP_OBJ_DES_POP_1": "潜在的な顧客からの情報、または既存の顧客からのレビューやフィードバックを収集してデータを充実させます",
|
|
2501
2501
|
"_WEBPER_TEMP_OBJ_DES_POP_2": "限定セール、期間限定プロモーション、見逃せないおすすめ商品を紹介することで、収益を飛躍的に高めます。",
|
|
2502
2502
|
"_WEBPER_TEMP_OBJ_DES_POP_3": "追加購入を促すために補完的な製品やアップグレードを提案する",
|
|
2503
2503
|
"_WEBPER_TEMP_OBJ_DES_POP_4": "ためらう訪問者をさらに滞在させ、さらに探索したくなる魅力的なオファーで出口をチャンスに変えます。",
|
|
2504
2504
|
"_WEBPER_TEMP_OBJ_DES_POP_5": "重要なニュースやイベントを視聴者に直接ブロードキャストして最新情報を提供します",
|
|
2505
2505
|
"_WEBPER_TEMP_OBJ_DES_POP_6": "Cookie の使用についてユーザーの同意を得ることで、視聴者の安心とプライバシー規制の遵守を確保します。",
|
|
2506
|
-
"_WEBPER_TEMP_OBJ_DES_POP_7": "CDP 365
|
|
2507
|
-
"_WEBPER_TEMP_OBJ_DES_POP_8": "
|
|
2506
|
+
"_WEBPER_TEMP_OBJ_DES_POP_7": "CDP 365 からのデータを利用して、パーソナライズされた製品の推奨事項を表示し、各訪問者の興味や過去のやり取りに合わせて調整できます。",
|
|
2507
|
+
"_WEBPER_TEMP_OBJ_DES_POP_8": "ターゲットを絞ったオファー、インセンティブ、またはリマインダーを使用して、躊躇している買い物客に購入を完了させるよう促します。",
|
|
2508
2508
|
"_WEBPER_TEMP_OBJ_DES_POP_9": "ソーシャル メディア プラットフォームでコミュニティを拡大し、ブランドの存在感を高めます",
|
|
2509
2509
|
"_WEBPER_TEMP_OBJ_DES_POP_10": "参加者と興奮を促進する注目を集めるイベント プロモーションで成功への舞台を整えます。",
|
|
2510
2510
|
"_WEBPER_TEMP_OBJ_DES_POP_11": "魅力的な運ゲーやインタラクティブなコンテンツで興奮を呼び起こし、エンゲージメントを高め、ユーザーを何度もリピートさせ続ける",
|
|
2511
|
-
"_WEBPER_TEMP_OBJ_DES_POP_12": "
|
|
2511
|
+
"_WEBPER_TEMP_OBJ_DES_POP_12": "新規ユーザーを支援し、提供された回答に基づいてパーソナライズされた推奨事項を提供します",
|
|
2512
2512
|
"_WEBPER_TEMP_OBJ_DES_POP_13": "直接リンクまたは QR コードを介してモバイル アプリをダウンロードしてスキャンするようユーザーに奨励します。",
|
|
2513
|
-
"_WEBPER_TEMP_OBJ_DES_FLOAT_1": "
|
|
2513
|
+
"_WEBPER_TEMP_OBJ_DES_FLOAT_1": "リード獲得フォームを含めて、訪問者にニュースレター、プロモーション、またはその他のマーケティング資料への登録を促します。",
|
|
2514
2514
|
"_WEBPER_TEMP_OBJ_DES_FLOAT_2": "カウントダウンタイマー付きの特別セールや限定プロモーションで視聴者の目を引き、さらに探索するよう促します。",
|
|
2515
2515
|
"_WEBPER_TEMP_OBJ_DES_FLOAT_3": "訪問者がスクロールしても表示され続けるバナーを使用して、重要なニュースが確実に注目されるようにし、最新情報を前面と中央に保ちます。",
|
|
2516
2516
|
"_WEBPER_TEMP_OBJ_DES_FLOAT_4": "あなたのブランドに対するフレンドリーな意見を確立するために、初めて Web サイトを閲覧する訪問者を歓迎します。",
|
|
@@ -2524,7 +2524,7 @@
|
|
|
2524
2524
|
"_WEBPER_TEMP_OBJ_DES_FULLSCR_6": "直接リンクまたは QR コードを介してモバイル アプリをダウンロードしてスキャンするようユーザーに奨励します。",
|
|
2525
2525
|
"_WEBPER_TEMP_OBJ_DES_FULLSCR_7": "顧客の生活に価値を付加し、単なる購入を超えてブランドと関わるよう促すために、詳細な情報と関連チュートリアルを提供します。",
|
|
2526
2526
|
"_WEBPER_TEMP_OBJ_DES_INLINE_1": "購読フォームや登録プロンプトを通じてユーザー情報を取得する",
|
|
2527
|
-
"_WEBPER_TEMP_OBJ_DES_INLINE_2": "CDP 365
|
|
2527
|
+
"_WEBPER_TEMP_OBJ_DES_INLINE_2": "CDP 365 からのデータを利用して、パーソナライズされた製品の推奨事項を表示し、各訪問者の興味や過去のやり取りに合わせて調整できます。",
|
|
2528
2528
|
"_WEBPER_TEMP_OBJ_DES_INLINE_3": "魅力的な運ゲーやインタラクティブなコンテンツで興奮を呼び起こし、エンゲージメントを高め、ユーザーを何度もリピートさせます。",
|
|
2529
2529
|
"_WEBPER_TEMP_OBJ_DES_INLINE_4": "アンケート、投票、フィードバック フォームを組み込んで、貴重な洞察を収集し、交流を促進します。",
|
|
2530
2530
|
"_WEBPER_TEMP_OBJ_DES_INLINE_5": "顧客のレビュー、評価、お客様の声などの社会的証明要素を紹介して、購入の意思決定に影響を与える信頼と信用を構築します。",
|
|
@@ -2532,16 +2532,16 @@
|
|
|
2532
2532
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_1": "購読フォーム、登録プロンプト、またはゲート付きコンテンツのオファーを通じて、電子メール アドレスや連絡先の詳細などのユーザー情報を取得します。",
|
|
2533
2533
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_2": "直前の取引やコンテンツの推奨を提供して、ユーザーに滞在してさらに探索するよう促します。",
|
|
2534
2534
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_3": "今後のコンテンツ、製品の発売、イベントを予告して、視聴者の期待と興奮を高め、Web サイトへのトラフィックを促進します。",
|
|
2535
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_4": "
|
|
2535
|
+
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_4": "アンケート、投票、フィードバック フォームを組み込んで貴重な洞察を収集し、交流を促進します。",
|
|
2536
2536
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_5": "顧客のレビュー、評価、お客様の声などの社会的証明要素を紹介して、購入の意思決定に影響を与える信頼と信用を構築します。",
|
|
2537
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_6": "
|
|
2538
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_7": "
|
|
2537
|
+
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_6": "期間限定のオファー、カウントダウンタイマー、またはフラッシュセール通知を提示することで、緊迫感を醸成し、即時行動を促します。",
|
|
2538
|
+
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_7": "ターゲットを絞ったオファー、インセンティブ、またはリマインダーを使用して、躊躇している買い物客に購入を完了させるよう促します。",
|
|
2539
2539
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_8": "顧客からの問い合わせの必要性を減らし、ショッピング体験の全体的な満足度を向上させるために、顧客が遭遇する可能性のある一般的な懸念事項や問題のトラブルシューティングに対処する",
|
|
2540
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_9": "
|
|
2540
|
+
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_9": "登録や出欠確認のオプションを提供して、ウェビナー、ワークショップ、イベントにユーザーを招待し、参加とエンゲージメントを促進します。",
|
|
2541
2541
|
"_LINE_MESS_OBJ_DES_1": "各ユーザーの好み、行動、過去のやり取りに基づいてメッセージをカスタマイズする",
|
|
2542
2542
|
"_LINE_MESS_OBJ_DES_2": "画像、ビデオ、ステッカーなどのマルチメディア コンテンツでメッセージを充実させます",
|
|
2543
2543
|
"_LINE_MESS_OBJ_DES_3": "ユーザーの参加を促すために、クリック可能なボタンなどのインタラクティブな要素を組み込む",
|
|
2544
|
-
"_LINE_MESS_OBJ_DES_4": "インタラクティブなメッセージ
|
|
2544
|
+
"_LINE_MESS_OBJ_DES_4": "インタラクティブなメッセージ テンプレート内で応答、質問、フィードバックを奨励することで、フォロワーとの双方向の対話を促進します",
|
|
2545
2545
|
"_LINE_MESS_OBJ_DES_5": "プロモーション キャンペーンの開始、新製品の発表、限定割引の提供、売上の促進",
|
|
2546
2546
|
"_LINE_MESS_OBJ_DES_6": "メッセージ テンプレートのインタラクティブな要素を通じて、応答性の高いカスタマー サポートを提供します",
|
|
2547
2547
|
"_LINE_MESS_OBJ_DES_7": "組み込みのメッセージ テンプレートを使用して回答を求め、アンケートからユーザー情報を収集します",
|
|
@@ -2593,14 +2593,14 @@
|
|
|
2593
2593
|
"_REALTIME_FACEBOOK_MESSENGER_OBJ_1": "カスタマーサポートの強化",
|
|
2594
2594
|
"_REALTIME_FACEBOOK_MESSENGER_DES_1": "インタラクション データを活用してタイムリーかつパーソナライズされたサポートを提供し、顧客満足度とロイヤルティを向上させます。",
|
|
2595
2595
|
"_REALTIME_FACEBOOK_MESSENGER_OBJ_2": "マーケティング戦略を洗練する",
|
|
2596
|
-
"_REALTIME_FACEBOOK_MESSENGER_DES_2": "インタラクション
|
|
2596
|
+
"_REALTIME_FACEBOOK_MESSENGER_DES_2": "インタラクション パターンを分析して顧客の興味や行動をより深く理解し、マーケティング活動を調整できるようにします。",
|
|
2597
2597
|
"_REALTIME_FACEBOOK_MESSENGER_OBJ_3": "対応管理を自動化する",
|
|
2598
2598
|
"_REALTIME_FACEBOOK_MESSENGER_DES_3": "マーケティング ハブ機能と統合すると、応答とフォローアップが自動化され、顧客の質問に答えられないことがなくなります。",
|
|
2599
2599
|
"_REALTIME_FACEBOOK_MESSENGER_OBJ_4": "エンゲージメントを高める",
|
|
2600
2600
|
"_REALTIME_FACEBOOK_MESSENGER_DES_4": "インタラクションから得た洞察を利用して、視聴者の共感を呼ぶ、より魅力的なコンテンツやキャンペーンを作成します。",
|
|
2601
2601
|
"_REALTIME_FACEBOOK_MESSENGER_OBJ_5": "キャンペーンの効果を測定する",
|
|
2602
2602
|
"_REALTIME_FACEBOOK_MESSENGER_DES_5": "インタラクション データを分析して、顧客がさまざまなメッセージにどのように反応するかを確認することで、マーケティング キャンペーンの影響を追跡します。",
|
|
2603
|
-
"_REALTIME_TIKTOK_LEAD": "「Tiktok Lead」テンプレートを使用すると、TikTok
|
|
2603
|
+
"_REALTIME_TIKTOK_LEAD": "「Tiktok Lead」テンプレートを使用すると、TikTok 広告を通じてフォームに記入するユーザーからのデータの収集と管理がシームレスかつ効率的に行えるようになりました。このリアルタイム機能により、視聴者に関する洞察が即座に得られるため、マーケティング活動を微調整し、より高いエンゲージメントとコンバージョンを促進することができます。",
|
|
2604
2604
|
"_REALTIME_TIKTOK_LEAD_OBJ_1": "リードを顧客に変える",
|
|
2605
2605
|
"_REALTIME_TIKTOK_LEAD_DES_1": "収集した情報を利用して潜在的な見込み客と直接連絡を取ったり相談したりして、彼らを有料顧客に変えます。",
|
|
2606
2606
|
"_REALTIME_TIKTOK_LEAD_OBJ_2": "マーケティング活動をパーソナライズする",
|
|
@@ -2668,7 +2668,7 @@
|
|
|
2668
2668
|
"_COOKIE_DM_INSTRUCTION_1_DES_2": "これは、追跡するすべてのサブドメインのベース ドメインです。例: {{x}}",
|
|
2669
2669
|
"_COOKIE_DM_INSTRUCTION_2_SUM": "Cookie ドメインを構成します。",
|
|
2670
2670
|
"_COOKIE_DM_INSTRUCTION_2_DES_1": "すべてのサブドメインにわたってデータを追跡するには、「{{x}}」と入力します (例: {{y}} または {{z}})",
|
|
2671
|
-
"_ZALO_TEMP_SELECT_1": "Zalo
|
|
2671
|
+
"_ZALO_TEMP_SELECT_1": "Zalo公式アカウントによる様々なスタイル",
|
|
2672
2672
|
"_ZALO_TEMP_SELECT_2": "これらのテンプレートは、Zalo 公式アカウント専用です。クリック ",
|
|
2673
2673
|
"_ZALO_TEMP_SELECT_3": "ここ",
|
|
2674
2674
|
"_ZALO_TEMP_SELECT_4": "目的地を作成します。"
|
|
@@ -2055,7 +2055,7 @@
|
|
|
2055
2055
|
"_PREDICT_MODEL_ALL_PREDICTIVE_MODELS": "Tất cả các mô hình dự đoán",
|
|
2056
2056
|
"_PREDICT_MODEL_CREATE_NEW_MODEL": "Tạo mới",
|
|
2057
2057
|
"_PREDICT_MODEL_RFM_MODEL": "Mô hình RFM",
|
|
2058
|
-
"_PREDICT_MODEL_RFM_DESCRIPTION": "Xếp hạng và nhóm khách hàng một cách định lượng dựa trên mức độ gần đây, tần suất và tổng số tiền trong hành vi chi tiêu của họ",
|
|
2058
|
+
"_PREDICT_MODEL_RFM_DESCRIPTION": "Xếp hạng và phân nhóm khách hàng một cách định lượng dựa trên mức độ gần đây, tần suất và tổng số tiền trong hành vi chi tiêu của họ",
|
|
2059
2059
|
"_PREDICT_MODEL_ERFM_MODEL": "Mô hình eRFM",
|
|
2060
2060
|
"_PREDICT_MODEL_ERFM_DESCRIPTION": "Mô hình eRFM là mô hình RFM rộng hơn, phân tích khách hàng dựa trên hành vi chi tiêu và mức độ tương tác qua email của họ",
|
|
2061
2061
|
"_PREDICT_MODEL_PROPENSITY_TO_BUY_MODEL": "Xu hướng mua mô hình",
|
|
@@ -2107,7 +2107,7 @@
|
|
|
2107
2107
|
"_PREDICT_MODEL_UPDATE_INTO_EXISTING_ATTRIBUTE": "Cập nhật vào các thuộc tính hiện có",
|
|
2108
2108
|
"_PREDICT_MODEL_SELECT_SEGMENT": "Chọn đoạn",
|
|
2109
2109
|
"_PREDICT_MODEL_SELECT_ATTRIBUTE": "Chọn thuộc tính",
|
|
2110
|
-
"_PREDICT_MODEL_CANNOT_LOSE_THEM": "Không thể mất chúng",
|
|
2110
|
+
"_PREDICT_MODEL_CANNOT_LOSE_THEM": "Không thể đánh mất chúng",
|
|
2111
2111
|
"_PREDICT_MODEL_AT_RISK": "Có nguy cơ",
|
|
2112
2112
|
"_PREDICT_MODEL_LOST_CUSTOMER": "Khách hàng bị mất",
|
|
2113
2113
|
"_PREDICT_MODEL_LOYAL": "Trung thành",
|