@antscorp/antsomi-ui 1.3.5-beta.830 → 1.3.5-beta.831
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/TagifyInput/TagifyInput.js +153 -122
- package/es/components/molecules/TagifyInput/constants.js +1 -1
- package/es/components/molecules/TagifyInput/utils.d.ts +45 -0
- package/es/components/molecules/TagifyInput/utils.js +65 -2
- package/es/components/organism/ActivityTimeline/components/ProductCard/styled.js +9 -0
- package/es/locales/ja/google-sheet.json +57 -57
- package/es/locales/vi/google-sheet.json +2 -2
- package/package.json +2 -1
|
@@ -17,7 +17,7 @@ import '@yaireo/tagify/dist/tagify.css';
|
|
|
17
17
|
// Styled
|
|
18
18
|
import { TagTextArea, TagifyWrapper, WrapperPlaceHolder } from './styled';
|
|
19
19
|
// Utils
|
|
20
|
-
import { parseTagStringToTagify, convertInputStringToOriginal, emojiManufacturer, getEmojiTag, isPersonalizeTagType, generateTagContent, unescapeString,
|
|
20
|
+
import { parseTagStringToTagify, convertInputStringToOriginal, emojiManufacturer, getEmojiTag, isPersonalizeTagType, generateTagContent, unescapeString, hasLineBreak, selectTextRange, isTagClickable, findURLInTextNodes, } from './utils';
|
|
21
21
|
import { acceptablePatternChecking, detectURLRegex, getCachedRegex, getPersonalizeTagInfo, patternHandlers, } from './patternHandlers';
|
|
22
22
|
// Constants
|
|
23
23
|
import { DETECT_LINK, EMOJI, INVALID_TAG, PERSONALIZE_PTN, PROMOTION_CODE, READONLY_TAG, SHORT_LINK, SHORT_LINK_PTN, defaultCssVariables, tagifyDefaultProps, } from './constants';
|
|
@@ -48,6 +48,25 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
48
48
|
return content;
|
|
49
49
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
50
50
|
}, []);
|
|
51
|
+
const onSyncSelectionStateTagify = useCallback(() => {
|
|
52
|
+
try {
|
|
53
|
+
if (!tagifyRef.current) {
|
|
54
|
+
throw new Error('Tagify instance is not initialized');
|
|
55
|
+
}
|
|
56
|
+
const instancePrototype = Object.getPrototypeOf(tagifyRef.current);
|
|
57
|
+
if (!_.has(instancePrototype, 'setStateSelection')) {
|
|
58
|
+
throw new Error('Tagify instance does not support setStateSelection');
|
|
59
|
+
}
|
|
60
|
+
// Update the selection of the Tagify instance
|
|
61
|
+
tagifyRef.current.setStateSelection();
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// eslint-disable-next-line no-console
|
|
66
|
+
console.error(error);
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}, []);
|
|
51
70
|
const onSaveLastRange = useCallback((newRange) => {
|
|
52
71
|
if (newRange) {
|
|
53
72
|
lastRange.current = newRange;
|
|
@@ -60,16 +79,38 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
60
79
|
}
|
|
61
80
|
}
|
|
62
81
|
}, []);
|
|
63
|
-
const
|
|
82
|
+
const onSelectionAfterInjection = useCallback((addRangeAfterInjected) => {
|
|
83
|
+
try {
|
|
84
|
+
const selection = window.getSelection();
|
|
85
|
+
if (selection?.rangeCount) {
|
|
86
|
+
const range = selection.getRangeAt(0);
|
|
87
|
+
if (addRangeAfterInjected) {
|
|
88
|
+
// Need to re-select to keep the caret position
|
|
89
|
+
selection.removeAllRanges();
|
|
90
|
+
selection.addRange(range);
|
|
91
|
+
}
|
|
92
|
+
// Save of the last range to restore it in case lost the selection
|
|
93
|
+
// E.g user blur of the input
|
|
94
|
+
// and then click direct to the popup without focus input to add new tag
|
|
95
|
+
onSaveLastRange(range);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// eslint-disable-next-line no-console
|
|
100
|
+
console.error('Error while restoring selection after injection', error);
|
|
101
|
+
}
|
|
102
|
+
}, [onSaveLastRange]);
|
|
103
|
+
const onAdjustSelectionIfNeeded = useCallback(() => {
|
|
64
104
|
try {
|
|
65
105
|
if (!tagifyRef.current) {
|
|
66
106
|
throw new Error('Tagify instance is not initialized');
|
|
67
107
|
}
|
|
68
108
|
const { settings, DOM } = tagifyRef.current;
|
|
109
|
+
const rangeInstance = _.get(tagifyRef.current, 'state.selection.range', null);
|
|
69
110
|
const { empty } = settings.classNames;
|
|
70
111
|
const selection = window.getSelection();
|
|
71
112
|
// In case not have the selection yet or lost the selection,
|
|
72
|
-
if (!selection?.rangeCount) {
|
|
113
|
+
if (!selection?.rangeCount || !rangeInstance) {
|
|
73
114
|
// need to restore the last range before inject a new tag if the last range exists
|
|
74
115
|
if (lastRange.current) {
|
|
75
116
|
selection?.removeAllRanges();
|
|
@@ -89,47 +130,43 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
89
130
|
const textNodeLength = lastTextNode.textContent.length;
|
|
90
131
|
// Place the caret at the end of the last text
|
|
91
132
|
selectTextRange(lastTextNode, textNodeLength, textNodeLength);
|
|
92
|
-
|
|
93
|
-
// Update the selection of the Tagify instance
|
|
94
|
-
if (_.has(instancePrototype, 'setStateSelection')) {
|
|
95
|
-
tagifyRef.current.setStateSelection();
|
|
96
|
-
}
|
|
133
|
+
onSyncSelectionStateTagify();
|
|
97
134
|
}
|
|
98
135
|
}
|
|
99
136
|
else if (DOM?.scope?.classList?.contains(empty)) {
|
|
100
137
|
// In case no text nodes and the input is empty
|
|
101
138
|
selectTextRange(inputElement, 0, 0);
|
|
102
|
-
|
|
103
|
-
// Update the selection of the Tagify instance
|
|
104
|
-
if (_.has(instancePrototype, 'setStateSelection')) {
|
|
105
|
-
tagifyRef.current.setStateSelection();
|
|
106
|
-
}
|
|
139
|
+
onSyncSelectionStateTagify();
|
|
107
140
|
}
|
|
108
141
|
}
|
|
109
142
|
}
|
|
110
143
|
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// eslint-disable-next-line no-console
|
|
147
|
+
console.error('Error while adjusting selection', error);
|
|
148
|
+
}
|
|
149
|
+
}, [onSyncSelectionStateTagify]);
|
|
150
|
+
const onInjectTagAtCaret = useCallback((newTag, addRangeAfterInjected) => {
|
|
151
|
+
try {
|
|
152
|
+
if (!tagifyRef.current) {
|
|
153
|
+
throw new Error('Tagify instance is not initialized');
|
|
154
|
+
}
|
|
155
|
+
const { settings } = tagifyRef.current;
|
|
156
|
+
const { empty } = settings.classNames;
|
|
157
|
+
// Adjust the selection before injecting the new tag
|
|
158
|
+
onAdjustSelectionIfNeeded();
|
|
111
159
|
// Inject the new tag
|
|
112
160
|
tagifyRef.current.injectAtCaret(newTag);
|
|
113
161
|
// Need to remove the empty class immediately after tag added to make the valid the DOM
|
|
114
162
|
tagifyRef.current.toggleClass(empty, false);
|
|
115
|
-
|
|
116
|
-
const range = selection.getRangeAt(0);
|
|
117
|
-
if (addRangeAfterInjected) {
|
|
118
|
-
// Need to re-select to keep the caret position
|
|
119
|
-
selection.removeAllRanges();
|
|
120
|
-
selection.addRange(range);
|
|
121
|
-
}
|
|
122
|
-
// Save of the last range to restore it in case lost the selection
|
|
123
|
-
// E.g user blur of the input
|
|
124
|
-
// and then click direct to the popup without focus input to add new tag
|
|
125
|
-
onSaveLastRange(range);
|
|
126
|
-
}
|
|
163
|
+
onSelectionAfterInjection(addRangeAfterInjected);
|
|
127
164
|
}
|
|
128
165
|
catch (error) {
|
|
129
166
|
// eslint-disable-next-line no-console
|
|
130
|
-
console.warn(error);
|
|
167
|
+
console.warn('Error while injecting tag at caret', error);
|
|
131
168
|
}
|
|
132
|
-
}, [
|
|
169
|
+
}, [onAdjustSelectionIfNeeded, onSelectionAfterInjection]);
|
|
133
170
|
const placeCaretAfterNode = useCallback((node) => {
|
|
134
171
|
if (!tagifyRef.current) {
|
|
135
172
|
throw new Error('Tagify instance is not initialized');
|
|
@@ -230,12 +267,9 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
230
267
|
event.preventDefault();
|
|
231
268
|
if (event.detail && onTagClick) {
|
|
232
269
|
const { tagify, tag, data } = event.detail;
|
|
233
|
-
const
|
|
234
|
-
const isValidType = isValidTagType(type);
|
|
235
|
-
const readonlyTag = tag.getAttribute(READONLY_TAG);
|
|
236
|
-
const { readonly } = tagify.settings;
|
|
270
|
+
const clickable = isTagClickable(tagify, tag, data);
|
|
237
271
|
// Prevent to click on tag if readonly
|
|
238
|
-
if (
|
|
272
|
+
if (!clickable)
|
|
239
273
|
return;
|
|
240
274
|
onTagClick(event.detail);
|
|
241
275
|
}
|
|
@@ -435,7 +469,7 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
435
469
|
* Updates the window selection to highlight a specified range of text within a given node.
|
|
436
470
|
* */
|
|
437
471
|
const updateWindowSelection = useCallback((node, start, end) => {
|
|
438
|
-
if (!node || !start || !end)
|
|
472
|
+
if (!node || !_.isNumber(start) || !_.isNumber(end))
|
|
439
473
|
return false;
|
|
440
474
|
if (node) {
|
|
441
475
|
try {
|
|
@@ -447,11 +481,7 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
447
481
|
const selection = window.getSelection();
|
|
448
482
|
selection?.removeAllRanges();
|
|
449
483
|
selection?.addRange(range);
|
|
450
|
-
|
|
451
|
-
if (_.has(instancePrototype, 'setStateSelection')) {
|
|
452
|
-
tagifyRef.current.setStateSelection();
|
|
453
|
-
return true;
|
|
454
|
-
}
|
|
484
|
+
return onSyncSelectionStateTagify();
|
|
455
485
|
}
|
|
456
486
|
throw new Error('Invalid start/end position');
|
|
457
487
|
}
|
|
@@ -462,7 +492,76 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
462
492
|
}
|
|
463
493
|
}
|
|
464
494
|
return false;
|
|
465
|
-
}, []);
|
|
495
|
+
}, [onSyncSelectionStateTagify]);
|
|
496
|
+
const replaceURLsWithTags = useCallback((nodesURl, lastRange) => {
|
|
497
|
+
try {
|
|
498
|
+
if (!tagifyRef.current) {
|
|
499
|
+
throw new Error('Tagify instance is not initialized');
|
|
500
|
+
}
|
|
501
|
+
// Replace all URLs in the given nodes
|
|
502
|
+
nodesURl.forEach((textNode) => {
|
|
503
|
+
const newTags = [];
|
|
504
|
+
const textContent = textNode.textContent || '';
|
|
505
|
+
if (textContent) {
|
|
506
|
+
let match;
|
|
507
|
+
// Reset the regex's lastIndex before each execution
|
|
508
|
+
detectURLRegex.lastIndex = 0;
|
|
509
|
+
// eslint-disable-next-line no-cond-assign
|
|
510
|
+
while ((match = detectURLRegex.exec(textContent)) !== null) {
|
|
511
|
+
const url = match[0];
|
|
512
|
+
const start = match.index;
|
|
513
|
+
const end = start + url.length;
|
|
514
|
+
const newTag = {
|
|
515
|
+
url,
|
|
516
|
+
range: [start, end],
|
|
517
|
+
};
|
|
518
|
+
// add new valid URL to tags
|
|
519
|
+
newTags.push(newTag);
|
|
520
|
+
}
|
|
521
|
+
if (newTags.length > 0) {
|
|
522
|
+
// Sort tags by their position in reverse order
|
|
523
|
+
// starting from the back avoids messing up earlier parts of the document
|
|
524
|
+
newTags.sort((a, b) => b.range[0] - a.range[0]);
|
|
525
|
+
// Add tags one by one, adjusting the selection for each
|
|
526
|
+
newTags.forEach(tag => {
|
|
527
|
+
const [start, end] = tag.range;
|
|
528
|
+
if (tagifyRef.current) {
|
|
529
|
+
const isUpdated = updateWindowSelection(textNode, start, end);
|
|
530
|
+
if (isUpdated) {
|
|
531
|
+
const newTag = tagifyRef.current.createTagElem({
|
|
532
|
+
value: tag.url,
|
|
533
|
+
label: tag.url,
|
|
534
|
+
type: DETECT_LINK,
|
|
535
|
+
});
|
|
536
|
+
// Inject the new detect link tag
|
|
537
|
+
tagifyRef.current.injectAtCaret(newTag);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
const selection = window.getSelection();
|
|
545
|
+
if (selection) {
|
|
546
|
+
if (lastRange instanceof Range) {
|
|
547
|
+
// Need to restore the selection after execution all process to replace URL to Tag
|
|
548
|
+
// to maintain valid caret
|
|
549
|
+
selection.removeAllRanges();
|
|
550
|
+
selection.addRange(lastRange);
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
// In case lost the selection not need to restore
|
|
554
|
+
// Reset the selection to clear and prepare the valid caret to add the next tag at fn: "onAddNewTag"
|
|
555
|
+
selection?.removeAllRanges();
|
|
556
|
+
onSyncSelectionStateTagify();
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
// eslint-disable-next-line no-console
|
|
562
|
+
console.error('Error while replacing URL with tag', error);
|
|
563
|
+
}
|
|
564
|
+
}, [onSyncSelectionStateTagify, updateWindowSelection]);
|
|
466
565
|
/**
|
|
467
566
|
* Detects URLs within the text nodes of a specified input element and replaces them with tags.
|
|
468
567
|
*
|
|
@@ -480,76 +579,12 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
480
579
|
const cacheLastRange = selection?.getRangeAt && selection?.rangeCount && selection?.getRangeAt(0);
|
|
481
580
|
const minLengthValidURL = 8; // -> Because of valid URL should be "https://"
|
|
482
581
|
// Get all child nodes that are of type TEXT_NODE and contain an URL
|
|
483
|
-
const nodesURL =
|
|
484
|
-
// Exclude non-text nodes
|
|
485
|
-
if (node.nodeType !== Node.TEXT_NODE)
|
|
486
|
-
return false;
|
|
487
|
-
// Only check nodes that contain at least 8 characters
|
|
488
|
-
if (node.textContent && node.textContent.length >= minLengthValidURL) {
|
|
489
|
-
// reset the regex's lastIndex before each execution
|
|
490
|
-
detectURLRegex.lastIndex = 0;
|
|
491
|
-
return detectURLRegex.test(node.textContent);
|
|
492
|
-
}
|
|
493
|
-
return false;
|
|
494
|
-
});
|
|
582
|
+
const nodesURL = findURLInTextNodes(inputElement, minLengthValidURL);
|
|
495
583
|
// Starting from the back to avoid messing up earlier parts of the DOM
|
|
496
584
|
const reversedNodes = nodesURL?.toReversed() || [];
|
|
585
|
+
// Process URL to Tag
|
|
497
586
|
if (reversedNodes && reversedNodes.length > 0) {
|
|
498
|
-
reversedNodes
|
|
499
|
-
const newTags = [];
|
|
500
|
-
const textContent = textNode.textContent || '';
|
|
501
|
-
if (textContent) {
|
|
502
|
-
let match;
|
|
503
|
-
// Reset the regex's lastIndex before each execution
|
|
504
|
-
detectURLRegex.lastIndex = 0;
|
|
505
|
-
// eslint-disable-next-line no-cond-assign
|
|
506
|
-
while ((match = detectURLRegex.exec(textContent)) !== null) {
|
|
507
|
-
const url = match[0];
|
|
508
|
-
const start = match.index;
|
|
509
|
-
const end = start + url.length;
|
|
510
|
-
const newTag = {
|
|
511
|
-
url,
|
|
512
|
-
range: [start, end],
|
|
513
|
-
};
|
|
514
|
-
// add new valid URL to tags
|
|
515
|
-
newTags.push(newTag);
|
|
516
|
-
}
|
|
517
|
-
if (newTags.length > 0) {
|
|
518
|
-
// Sort tags by their position in reverse order
|
|
519
|
-
// starting from the back avoids messing up earlier parts of the document
|
|
520
|
-
newTags.sort((a, b) => b.range[0] - a.range[0]);
|
|
521
|
-
// Add tags one by one, adjusting the selection for each
|
|
522
|
-
newTags.forEach(tag => {
|
|
523
|
-
const [start, end] = tag.range;
|
|
524
|
-
if (tagifyRef.current) {
|
|
525
|
-
const isUpdated = updateWindowSelection(textNode, start, end);
|
|
526
|
-
if (isUpdated) {
|
|
527
|
-
const newTag = tagifyRef.current.createTagElem({
|
|
528
|
-
value: tag.url,
|
|
529
|
-
label: tag.url,
|
|
530
|
-
type: DETECT_LINK,
|
|
531
|
-
});
|
|
532
|
-
// Inject the new detect link tag
|
|
533
|
-
tagifyRef.current.injectAtCaret(newTag);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
});
|
|
540
|
-
if (selection) {
|
|
541
|
-
if (cacheLastRange instanceof Range) {
|
|
542
|
-
// Need to restore the selection after execution all process to replace URL to Tag
|
|
543
|
-
// to maintain valid caret
|
|
544
|
-
selection.removeAllRanges();
|
|
545
|
-
selection.addRange(cacheLastRange);
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
// In case lost the selection not need to restore
|
|
549
|
-
// Reset the selection to clear and prepare the valid caret to add the next tag at fn: "onAddNewTag"
|
|
550
|
-
selection?.removeAllRanges();
|
|
551
|
-
}
|
|
552
|
-
}
|
|
587
|
+
replaceURLsWithTags(reversedNodes, cacheLastRange);
|
|
553
588
|
}
|
|
554
589
|
}
|
|
555
590
|
}
|
|
@@ -557,7 +592,7 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
557
592
|
// eslint-disable-next-line no-console
|
|
558
593
|
console.log(error);
|
|
559
594
|
}
|
|
560
|
-
}, [
|
|
595
|
+
}, [replaceURLsWithTags]);
|
|
561
596
|
// Initialization tagify
|
|
562
597
|
useLayoutEffect(() => {
|
|
563
598
|
initializeTagify();
|
|
@@ -568,12 +603,20 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
568
603
|
};
|
|
569
604
|
}, [initializeTagify]);
|
|
570
605
|
// Settings some tagify attributes
|
|
571
|
-
// Set readonly
|
|
606
|
+
// Set [readonly, disabled, placeholder]
|
|
572
607
|
useEffect(() => {
|
|
573
|
-
if (tagifyRef.current
|
|
608
|
+
if (!tagifyRef.current)
|
|
609
|
+
return;
|
|
610
|
+
if (typeof readonly !== 'undefined') {
|
|
574
611
|
tagifyRef.current.setReadonly(!!readonly);
|
|
575
612
|
}
|
|
576
|
-
|
|
613
|
+
if (typeof disabled !== 'undefined') {
|
|
614
|
+
tagifyRef.current.setDisabled(!!disabled);
|
|
615
|
+
}
|
|
616
|
+
if (_.isString(placeholder)) {
|
|
617
|
+
tagifyRef.current.setPlaceholder(placeholder);
|
|
618
|
+
}
|
|
619
|
+
}, [disabled, placeholder, readonly]);
|
|
577
620
|
// Set readonly for each tag
|
|
578
621
|
useEffect(() => {
|
|
579
622
|
if (tagifyRef.current && typeof readonlyTag !== 'undefined') {
|
|
@@ -597,18 +640,6 @@ const TagifyInput = forwardRef((props, ref) => {
|
|
|
597
640
|
});
|
|
598
641
|
}
|
|
599
642
|
}, [readonlyTag]);
|
|
600
|
-
// Set disabled
|
|
601
|
-
useEffect(() => {
|
|
602
|
-
if (tagifyRef.current && typeof disabled !== 'undefined') {
|
|
603
|
-
tagifyRef.current.setDisabled(!!disabled);
|
|
604
|
-
}
|
|
605
|
-
}, [disabled]);
|
|
606
|
-
// Set placeholder
|
|
607
|
-
useLayoutEffect(() => {
|
|
608
|
-
if (tagifyRef.current && _.isString(placeholder)) {
|
|
609
|
-
tagifyRef.current.setPlaceholder(placeholder);
|
|
610
|
-
}
|
|
611
|
-
}, [placeholder]);
|
|
612
643
|
// Set max personalize tags
|
|
613
644
|
useLayoutEffect(() => {
|
|
614
645
|
if (tagifyRef.current && typeof maxPersonalizeTags !== 'undefined') {
|
|
@@ -13,7 +13,7 @@ export const { READONLY_TAG, INVALID_TAG } = TAG_CUSTOM_ATTRIBUTES;
|
|
|
13
13
|
export const defaultCssVariables = {
|
|
14
14
|
'--input-color': globalToken?.colorText,
|
|
15
15
|
'--input-font-size': `${globalToken?.fontSize}px`,
|
|
16
|
-
'--tag--max-width': '
|
|
16
|
+
'--tag--max-width': '170px',
|
|
17
17
|
'--tag-border-radius': '999px',
|
|
18
18
|
'--tag-bg': 'transparent',
|
|
19
19
|
'--tag-hover': 'transparent',
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="yaireo__tagify" />
|
|
2
|
+
import Tagify from '@yaireo/tagify';
|
|
1
3
|
import { AcceptablePattern, EmojiCollection, EmojiTag, TagDataCustomize, TagType } from './types';
|
|
2
4
|
/**
|
|
3
5
|
* Parses the input string and replaces matching patterns with processed tags.
|
|
@@ -105,3 +107,46 @@ export declare const hasLineBreak: (str: string) => boolean;
|
|
|
105
107
|
* security reasons.
|
|
106
108
|
*/
|
|
107
109
|
export declare function selectTextRange(textNode: Node, start: number, end: number): void;
|
|
110
|
+
/**
|
|
111
|
+
* Determines whether a tag is clickable based on its properties and the Tagify instance settings.
|
|
112
|
+
*
|
|
113
|
+
* @param {Tagify<TagDataCustomize>} tagify - The Tagify instance.
|
|
114
|
+
* @param {HTMLElement} tag - The HTML element representing the tag.
|
|
115
|
+
* @param {TagDataCustomize} tagData - The data associated with the tag.
|
|
116
|
+
*
|
|
117
|
+
* @returns {boolean} Returns true if the tag is clickable, false otherwise.
|
|
118
|
+
*
|
|
119
|
+
* @description
|
|
120
|
+
* A tag is considered clickable if all of the following conditions are met:
|
|
121
|
+
* 1. The Tagify instance is not in readonly mode.
|
|
122
|
+
* 2. The tag itself is not marked as readonly.
|
|
123
|
+
* 3. The tag type is valid (as determined by the isValidTagType function).
|
|
124
|
+
*/
|
|
125
|
+
export declare function isTagClickable(tagify: Tagify<TagDataCustomize>, tag: HTMLElement, tagData: TagDataCustomize): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Finds text nodes within an HTML element that contain URLs.
|
|
128
|
+
*
|
|
129
|
+
* @param {HTMLSpanElement} element - The HTML span element to search within.
|
|
130
|
+
* @param {number} [minLengthValidURL=8] - The minimum length of text content to consider for URL detection.
|
|
131
|
+
*
|
|
132
|
+
* @returns {Array<ChildNode>} An array of text nodes that contain URLs.
|
|
133
|
+
*
|
|
134
|
+
* @description
|
|
135
|
+
* This function searches through the child nodes of the provided HTML element,
|
|
136
|
+
* looking for text nodes that contain URLs. It uses the following criteria:
|
|
137
|
+
* 1. Only text nodes are considered (nodeType === Node.TEXT_NODE).
|
|
138
|
+
* 2. The text content of the node must be at least as long as minLengthValidURL.
|
|
139
|
+
* 3. The text content must contain a URL as determined by the detectURLRegex.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* const spanElement = document.querySelector('span.content');
|
|
143
|
+
* const nodesWithURLs = findURLInTextNodes(spanElement);
|
|
144
|
+
* console.log(nodesWithURLs.length + ' nodes contain URLs');
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* // With custom minimum length
|
|
148
|
+
* const nodesWithLongURLs = findURLInTextNodes(spanElement, 15);
|
|
149
|
+
*
|
|
150
|
+
* @see detectURLRegex - This regex is used to detect URLs in the text content.
|
|
151
|
+
*/
|
|
152
|
+
export declare function findURLInTextNodes(element: HTMLSpanElement, minLengthValidURL?: number): Array<ChildNode>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Libraries
|
|
2
2
|
import stringReplaceToArray from 'string-replace-to-array';
|
|
3
3
|
// Constants
|
|
4
|
-
import { CONTENT_SOURCE_GROUP, CUSTOMER, CUSTOM_FN, EMOJI_COLLECTIONS, EVENT, OBJECT_WIDGET, PREFIX_PATTERN_LINE_MESSAGE, PROMOTION_CODE, TAG_TYPE, VISITOR, } from './constants';
|
|
4
|
+
import { CONTENT_SOURCE_GROUP, CUSTOMER, CUSTOM_FN, EMOJI_COLLECTIONS, EVENT, OBJECT_WIDGET, PREFIX_PATTERN_LINE_MESSAGE, PROMOTION_CODE, READONLY_TAG, TAG_TYPE, VISITOR, } from './constants';
|
|
5
5
|
import { iconsViber } from './iconsViber';
|
|
6
6
|
// Utils
|
|
7
|
-
import { acceptablePatternChecking, getCachedRegex, patternHandlers, tagRegexStringPattern, } from './patternHandlers';
|
|
7
|
+
import { acceptablePatternChecking, detectURLRegex, getCachedRegex, patternHandlers, tagRegexStringPattern, } from './patternHandlers';
|
|
8
8
|
/*
|
|
9
9
|
* Custom error type for JSON parse errors
|
|
10
10
|
*/
|
|
@@ -498,3 +498,66 @@ export function selectTextRange(textNode, start, end) {
|
|
|
498
498
|
console.log('Error selecting text range', error, { textNode, start, end });
|
|
499
499
|
}
|
|
500
500
|
}
|
|
501
|
+
/**
|
|
502
|
+
* Determines whether a tag is clickable based on its properties and the Tagify instance settings.
|
|
503
|
+
*
|
|
504
|
+
* @param {Tagify<TagDataCustomize>} tagify - The Tagify instance.
|
|
505
|
+
* @param {HTMLElement} tag - The HTML element representing the tag.
|
|
506
|
+
* @param {TagDataCustomize} tagData - The data associated with the tag.
|
|
507
|
+
*
|
|
508
|
+
* @returns {boolean} Returns true if the tag is clickable, false otherwise.
|
|
509
|
+
*
|
|
510
|
+
* @description
|
|
511
|
+
* A tag is considered clickable if all of the following conditions are met:
|
|
512
|
+
* 1. The Tagify instance is not in readonly mode.
|
|
513
|
+
* 2. The tag itself is not marked as readonly.
|
|
514
|
+
* 3. The tag type is valid (as determined by the isValidTagType function).
|
|
515
|
+
*/
|
|
516
|
+
export function isTagClickable(tagify, tag, tagData) {
|
|
517
|
+
const { type } = tagData;
|
|
518
|
+
const isValidType = isValidTagType(type);
|
|
519
|
+
const readonlyTag = tag.getAttribute(READONLY_TAG);
|
|
520
|
+
const { readonly } = tagify.settings;
|
|
521
|
+
return !(readonly || (readonlyTag && readonlyTag === 'true') || !isValidType);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Finds text nodes within an HTML element that contain URLs.
|
|
525
|
+
*
|
|
526
|
+
* @param {HTMLSpanElement} element - The HTML span element to search within.
|
|
527
|
+
* @param {number} [minLengthValidURL=8] - The minimum length of text content to consider for URL detection.
|
|
528
|
+
*
|
|
529
|
+
* @returns {Array<ChildNode>} An array of text nodes that contain URLs.
|
|
530
|
+
*
|
|
531
|
+
* @description
|
|
532
|
+
* This function searches through the child nodes of the provided HTML element,
|
|
533
|
+
* looking for text nodes that contain URLs. It uses the following criteria:
|
|
534
|
+
* 1. Only text nodes are considered (nodeType === Node.TEXT_NODE).
|
|
535
|
+
* 2. The text content of the node must be at least as long as minLengthValidURL.
|
|
536
|
+
* 3. The text content must contain a URL as determined by the detectURLRegex.
|
|
537
|
+
*
|
|
538
|
+
* @example
|
|
539
|
+
* const spanElement = document.querySelector('span.content');
|
|
540
|
+
* const nodesWithURLs = findURLInTextNodes(spanElement);
|
|
541
|
+
* console.log(nodesWithURLs.length + ' nodes contain URLs');
|
|
542
|
+
*
|
|
543
|
+
* @example
|
|
544
|
+
* // With custom minimum length
|
|
545
|
+
* const nodesWithLongURLs = findURLInTextNodes(spanElement, 15);
|
|
546
|
+
*
|
|
547
|
+
* @see detectURLRegex - This regex is used to detect URLs in the text content.
|
|
548
|
+
*/
|
|
549
|
+
export function findURLInTextNodes(element, minLengthValidURL = 8) {
|
|
550
|
+
const nodesURL = Array.from(element.childNodes).filter((node) => {
|
|
551
|
+
// Exclude non-text nodes
|
|
552
|
+
if (node.nodeType !== Node.TEXT_NODE)
|
|
553
|
+
return false;
|
|
554
|
+
// Only check nodes that contain at least 8 characters
|
|
555
|
+
if (node.textContent && node.textContent.length >= minLengthValidURL) {
|
|
556
|
+
// reset the regex's lastIndex before each execution
|
|
557
|
+
detectURLRegex.lastIndex = 0;
|
|
558
|
+
return detectURLRegex.test(node.textContent);
|
|
559
|
+
}
|
|
560
|
+
return false;
|
|
561
|
+
});
|
|
562
|
+
return nodesURL;
|
|
563
|
+
}
|
|
@@ -57,6 +57,15 @@ export const ImgPanel = styled.div `
|
|
|
57
57
|
transition: all 0.2s ease-in-out;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
> .antsomi-image {
|
|
62
|
+
height: 100%;
|
|
63
|
+
width: 100%;
|
|
64
|
+
|
|
65
|
+
> img.antsomi-image-img {
|
|
66
|
+
object-fit: cover;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
60
69
|
`;
|
|
61
70
|
export const InfoPanel = styled.div `
|
|
62
71
|
padding-left: 12px;
|
|
@@ -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": "選択した時間範囲が Time to Live の範囲外であるため、データが不十分です",
|
|
70
70
|
"_BTN_CREATE_SEG": "セグメントの作成",
|
|
71
71
|
"_ACT_GO_BACK": "戻る",
|
|
72
72
|
"_ACT_HAVE_ATTRIBUTE": "属性を持つ",
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"_ACT_TABLE_DETAIL": "テーブルの詳細",
|
|
129
129
|
"_ACT_UNCHECK_ALL": "すべてのチェックを外します",
|
|
130
130
|
"_ACT_UPDATE": "アップデート",
|
|
131
|
-
"_ACT_UPDATE_END_DATE": "
|
|
131
|
+
"_ACT_UPDATE_END_DATE": "終了日の更新",
|
|
132
132
|
"_ACT_UPLOAD": "アップロード",
|
|
133
133
|
"_ACT_VARIANT_PRIORITY": "バリアントの優先順位",
|
|
134
134
|
"_ACT_VIEW_ALL": "すべて見る",
|
|
@@ -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": "新しいメールジャーニーを作成する",
|
|
@@ -359,13 +359,13 @@
|
|
|
359
359
|
"_DAY_SA": "サ",
|
|
360
360
|
"_DAY_SU": "スー",
|
|
361
361
|
"_DAY_TH": "Th",
|
|
362
|
-
"_DAY_TU": "
|
|
362
|
+
"_DAY_TU": "トゥ",
|
|
363
363
|
"_DAY_WE": "私たちは",
|
|
364
364
|
"_DECRYPT_DURATION_LOGIN_LOGOUT": "ログイン/ログアウト",
|
|
365
365
|
"_DECRYPT_DURATION_PAGE_REFRESH": "ページの更新",
|
|
366
366
|
"_DECRYPT_DURATION_TIME_OUT_30": "タイムアウト30分",
|
|
367
367
|
"_DELIVERY_ALGORITHM_RANDOMIZATION": "ランダム化",
|
|
368
|
-
"_DESTINATION_DESIGN_OPTION_EXIST": "
|
|
368
|
+
"_DESTINATION_DESIGN_OPTION_EXIST": "既存のデザインをロード",
|
|
369
369
|
"_DESTINATION_DESIGN_OPTION_EXIST_INTRO": "別のキャンペーンのデザインをコピーする",
|
|
370
370
|
"_DESTINATION_DESIGN_OPTION_SCRATCH": "ゼロからデザインする",
|
|
371
371
|
"_DESTINATION_DESIGN_OPTION_SCRATCH_INTRO": "キャンペーンをカスタムデザインする",
|
|
@@ -382,11 +382,11 @@
|
|
|
382
382
|
"_DURATION_CUSTOM": "カスタム",
|
|
383
383
|
"_DURATION_LAST_1_HOUR": "最後の 1 時間",
|
|
384
384
|
"_DURATION_LAST_14_DAY": "過去 14 日間",
|
|
385
|
-
"_DURATION_LAST_15_MINUTE": "最後の 15
|
|
385
|
+
"_DURATION_LAST_15_MINUTE": "最後の 15 分間",
|
|
386
386
|
"_DURATION_LAST_3_HOUR": "過去 3 時間",
|
|
387
387
|
"_DURATION_LAST_30_DAYS": "過去 30 日間",
|
|
388
388
|
"_DURATION_LAST_30_MINUTE": "最後の 30 分",
|
|
389
|
-
"_DURATION_LAST_5_MINUTE": "最後の 5
|
|
389
|
+
"_DURATION_LAST_5_MINUTE": "最後の 5 分間",
|
|
390
390
|
"_DURATION_LAST_6_HOUR": "過去6時間",
|
|
391
391
|
"_DURATION_LAST_7_DAY": "過去 7 日間",
|
|
392
392
|
"_DURATION_LAST_MONTH": "先月",
|
|
@@ -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}} を実行しました",
|
|
@@ -463,7 +463,7 @@
|
|
|
463
463
|
"_EVENT_IMPRESSION_WEB_PUSH": "ジャーニー {{journey_name}} はウェブ プッシュ通知経由で {{customer_name}} に配信されました ",
|
|
464
464
|
"_EVENT_IMPRESSION_ZALO_CHAT": "キャンペーン {{campaign_name}} からの Zalo メッセージが {{customer_name}} に送信されました",
|
|
465
465
|
"_EVENT_INFO_EARN_POINT": "ポイントを獲得する",
|
|
466
|
-
"_EVENT_INFO_LOYALTY_ID": "ロイヤルティID",
|
|
466
|
+
"_EVENT_INFO_LOYALTY_ID": "ロイヤルティ ID",
|
|
467
467
|
"_EVENT_INFO_NAME": "名前",
|
|
468
468
|
"_EVENT_INFO_POINT": "ポイント",
|
|
469
469
|
"_EVENT_INFO_REDEEM_POINT": "ポイントを引き換える",
|
|
@@ -616,7 +616,7 @@
|
|
|
616
616
|
"_INFO_STORY_SELECT_END_DATE": "締め日を選択してください",
|
|
617
617
|
"_INFO_STORY_SELECT_WEEK_DAY": "曜日にトリガー",
|
|
618
618
|
"_INFO_STORY_SETTING": "一般設定",
|
|
619
|
-
"_INFO_STORY_SETTING_FREQ": "
|
|
619
|
+
"_INFO_STORY_SETTING_FREQ": "観客はこの旅に何回参加する必要があるでしょうか?",
|
|
620
620
|
"_INFO_STORY_START_DATE": "開始日",
|
|
621
621
|
"_INFO_STORY_START_TIME": "開始時間",
|
|
622
622
|
"_INFO_STORY_STATUS_ABORTED": "中止されました",
|
|
@@ -805,7 +805,7 @@
|
|
|
805
805
|
"_NOTI_UPLOAD_ICON_SUCCESS": "成功!ファイルがアップロードされました。",
|
|
806
806
|
"_NOTI_VALIDATE_END_DATE_GREATER_CURRENT": "終了日は現在の日付より後の日付にする必要があります",
|
|
807
807
|
"_NOTI_VALIDATE_END_TIME_GREATER": "終了時間は開始時間よりも長くする必要があります",
|
|
808
|
-
"_NOTI_VALIDATE_FILE_FORMAT": "
|
|
808
|
+
"_NOTI_VALIDATE_FILE_FORMAT": "ファイルの形式が正しくありません。もう一度試してください。",
|
|
809
809
|
"_NOTI_VALIDATE_FORMAT_CSS_SELECTOR": "CSS セレクターは接頭辞 で始まる必要があります。または #",
|
|
810
810
|
"_NOTI_VALIDATE_ICON_FORMAT": "画像の形式が正しくありません。もう一度お試しください。",
|
|
811
811
|
"_NOTI_VALIDATE_ONE_DAY": "少なくとも 1 日を選択してください",
|
|
@@ -868,7 +868,7 @@
|
|
|
868
868
|
"_RECOMD_FACTORIZATION_VIEW": "因数分解ビューイベント",
|
|
869
869
|
"_RECOMD_ITEM_SIMILARITY_PURCHASE": "アイテム類似購入イベント",
|
|
870
870
|
"_RECOMD_ITEM_SIMILARITY_VIEW": "アイテム類似性表示イベント",
|
|
871
|
-
"_RECOMD_NO_PRODUCT": "
|
|
871
|
+
"_RECOMD_NO_PRODUCT": "推奨される製品はありません。",
|
|
872
872
|
"_RECOMD_RANK_FACTORIZATION_PURCHASE": "ランク因数分解購入イベント",
|
|
873
873
|
"_RECOMD_RANK_FACTORIZATION_VIEW": "ランク因数分解ビューイベント",
|
|
874
874
|
"_RENDER_FORMAT": "表示形式",
|
|
@@ -925,7 +925,7 @@
|
|
|
925
925
|
"_TAB_INFORMATION_FIELD": "情報フィールド",
|
|
926
926
|
"_TAB_JOURNEY": "旅",
|
|
927
927
|
"_TAB_METRIC": "メトリック",
|
|
928
|
-
"_TAB_MODEL_DIAGRAM": "
|
|
928
|
+
"_TAB_MODEL_DIAGRAM": "図",
|
|
929
929
|
"_TAB_MODEL_FIELD": "フィールド",
|
|
930
930
|
"_TAB_OBECT_REFERENCE": "オブジェクトリファレンス",
|
|
931
931
|
"_TAB_OBJECT_ATTRIBUTE": "属性",
|
|
@@ -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": "降順",
|
|
@@ -1088,7 +1088,7 @@
|
|
|
1088
1088
|
"_TITL_EVENT_ACTION_NAME": "イベントアクション名",
|
|
1089
1089
|
"_TITL_EVENT_ATTRIBUTE": "イベント属性",
|
|
1090
1090
|
"_TITL_EVENT_CATEGORY": "イベントカテゴリー",
|
|
1091
|
-
"_TITL_EVENT_CATEGORY_CODE": "
|
|
1091
|
+
"_TITL_EVENT_CATEGORY_CODE": "イベントカテゴリコード",
|
|
1092
1092
|
"_TITL_EVENT_CATEGORY_NAME": "イベントカテゴリ名",
|
|
1093
1093
|
"_TITL_EVENT_INFO": "イベント情報",
|
|
1094
1094
|
"_TITL_EVENT_INTERNAL_NAME": "イベントの内部名",
|
|
@@ -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": "タグを結合",
|
|
@@ -1335,7 +1335,7 @@
|
|
|
1335
1335
|
"_USER_GUIDE_AUDIDENCE_PARENT_NODE": "親ノードからの {{percent}} 視聴者",
|
|
1336
1336
|
"_USER_GUIDE_CATALOG_CLOUD": "データをクラウド アプリから当社のシステムに効果的に同期すると、すべてのフラグメント データを相互接続して、ビジネス運営の 1 つの詳細な概要を得ることができます。",
|
|
1337
1337
|
"_USER_GUIDE_CATALOG_MOBILE_APP": "ビジネス モバイル アプリをデータ ソースとして接続し、ユーザーが製品やアプリとどのようにやり取りしているかを確認します。",
|
|
1338
|
-
"_USER_GUIDE_CATALOG_SERVER": "
|
|
1338
|
+
"_USER_GUIDE_CATALOG_SERVER": "お客様のサーバーから当社のシステムにデータを直接送信することで、当社の分析ツールの多くを使用して顧客と業績をより深く理解できるようになります。",
|
|
1339
1339
|
"_USER_GUIDE_CATALOG_WEBSITE": "ビジネス Web サイトをデータ ソースとして接続し、製品に対するユーザーの意図に関する驚くべき洞察を発見します。",
|
|
1340
1340
|
"_USER_GUIDE_CHOOOSE_ATTR_DISPLAY": "顧客/訪問者の各プロファイルに表示される属性を選択します",
|
|
1341
1341
|
"_USER_GUIDE_CHOOSE_EVENT_ATTRIBUTE_OBJECT": "イベント属性とオブジェクトの選択",
|
|
@@ -1404,7 +1404,7 @@
|
|
|
1404
1404
|
"_USER_GUIDE_SEE_SAMPLE_ITEM": "このコレクションのアイテムのサンプルを見る",
|
|
1405
1405
|
"_USER_GUIDE_SEE_SAMPLE_USER": "この対象ユーザーのサンプルを見る",
|
|
1406
1406
|
"_USER_GUIDE_SEGMENT_CREATE_CRITERIA": "ファイルの情報を使用して、このセグメントに適した視聴者を見つけるための基準を作成します",
|
|
1407
|
-
"_USER_GUIDE_SEGMENT_CREATE_CRITERIA_INTRO": "
|
|
1407
|
+
"_USER_GUIDE_SEGMENT_CREATE_CRITERIA_INTRO": "システムは条件を満たす視聴者を探して、このセグメントに追加します。",
|
|
1408
1408
|
"_USER_GUIDE_SEGMENT_CREATE_CRITERIA_NOTE": "<b>注:</b> アップロードされたファイルからは、このシステムに存在する ID を持つ視聴者のみを作成するセグメントに追加できます。アップロードされたファイルは最後に使用されてから 6 か月間保存され、その後は使用できなくなります。",
|
|
1409
1409
|
"_USER_GUIDE_SELECT_A_ATTRIBUTE": "属性を選択してください",
|
|
1410
1410
|
"_USER_GUIDE_SELECT_A_CATALOG": "カタログを選択してください",
|
|
@@ -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": "プールに移動",
|
|
@@ -1717,7 +1717,7 @@
|
|
|
1717
1717
|
"_TITL_VERSION": "バージョン",
|
|
1718
1718
|
"_TAB_DELIVERY_LOG": "配信ログ",
|
|
1719
1719
|
"_TAB_DETAIL": "詳細",
|
|
1720
|
-
"_TAB_DIAGRAM": "
|
|
1720
|
+
"_TAB_DIAGRAM": "図",
|
|
1721
1721
|
"_CODE_BUILD_CONTENT_ERROR": "ビルドコンテンツエラー",
|
|
1722
1722
|
"_CODE_MISSING_RECEIVER": "受信機がありません",
|
|
1723
1723
|
"_CODE_DESTINATION_FREQUENCY_CAPPING": "宛先フリークエンシー キャップに違反する",
|
|
@@ -1728,7 +1728,7 @@
|
|
|
1728
1728
|
"_TITL_TAG_ACTION_HISTORY_DETAIL": "行動履歴詳細",
|
|
1729
1729
|
"_TITL_TAG_SCHEDULE_HISTORY_DETAIL": "スケジュール履歴の詳細",
|
|
1730
1730
|
"_INFO_AD_ZONE_CODE": "ゾーンコード",
|
|
1731
|
-
"_STATE_COMPLETED": "
|
|
1731
|
+
"_STATE_COMPLETED": "完了",
|
|
1732
1732
|
"_STATE_END": "終わり",
|
|
1733
1733
|
"_STATE_EXIT_JOURNEY": "出口行程",
|
|
1734
1734
|
"_STATE_VIOLATE_TRIGGER_FC": "トリガーのフリークエンシー キャップに違反する",
|
|
@@ -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": "コレクションはインターバルビルド可能で、他のオブジェクトでも使用可能",
|
|
@@ -1762,7 +1762,7 @@
|
|
|
1762
1762
|
"_USER_GUIDE_JOURNEY_STATUS_ACTIVE": "旅は進行中です",
|
|
1763
1763
|
"_USER_GUIDE_JOURNEY_STATUS_CLOSED": "ジャーニーの処理時間が近づいています",
|
|
1764
1764
|
"_USER_GUIDE_JOURNEY_STATUS_PAUSED": "キャンペーンは一時的に停止されていますが、新規視聴者の参加は引き続き許可されています",
|
|
1765
|
-
"_USER_GUIDE_JOURNEY_STATUS_FROZEN": "
|
|
1765
|
+
"_USER_GUIDE_JOURNEY_STATUS_FROZEN": "キャンペーンは保留されており、新しい視聴者が参加することはできません",
|
|
1766
1766
|
"_USER_GUIDE_JOURNEY_STATUS_ERROR": "旅行処理中にエラーが発生しました",
|
|
1767
1767
|
"_USER_GUIDE_JOURNEY_STATUS_ABORTED": "旅は完全停止を余儀なくされる",
|
|
1768
1768
|
"_USER_GUIDE_JOURNEY_STATUS_REMOVED": "旅が削除されました",
|
|
@@ -1774,8 +1774,8 @@
|
|
|
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": "
|
|
1778
|
-
"_PORTAL_LIMITATION_DES_BO_DELETE": "
|
|
1777
|
+
"_PORTAL_LIMITATION_DES_BO_ARCHIVED": "データオブジェクトは、使用されない場合はアーカイブされます。",
|
|
1778
|
+
"_PORTAL_LIMITATION_DES_BO_DELETE": "次の期間に回復しない場合、データ オブジェクトは完全に削除されます",
|
|
1779
1779
|
"_PORTAL_LIMITATION_DES_ATTR_DISABLED": "で使用されない場合、属性は無効になります。 ",
|
|
1780
1780
|
"_PORTAL_LIMITATION_DES_ATTR_ARCHIVED": "属性が使用されない場合はアーカイブされます。",
|
|
1781
1781
|
"_PORTAL_LIMITATION_DES_ATTR_DELETE": "属性は、次の期間に回復しない場合は完全に削除されます。",
|
|
@@ -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": "すべてのプラン",
|
|
@@ -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": "再計算された",
|
|
@@ -1874,7 +1874,7 @@
|
|
|
1874
1874
|
"_EVENT_SETTING_RECORD_IN_PROFILE": "訪問者/顧客プロファイルにイベント データを記録する",
|
|
1875
1875
|
"_WARN_SMS_DYNAMIC_CONTENT": "(文字数は、コンテンツに動的コンテンツまたはショートリンクが含まれる場合のみ参考用です)",
|
|
1876
1876
|
"_TITLE_CATALOG_DESTINATION_CHANNEL": "宛先チャンネル",
|
|
1877
|
-
"_TITLE_CATALOG_DESTINATION_CATALOGS": "
|
|
1877
|
+
"_TITLE_CATALOG_DESTINATION_CATALOGS": "宛先カタログ",
|
|
1878
1878
|
"_TITLE_CATALOG_ALL_CATALOGS": "すべてのカタログ",
|
|
1879
1879
|
"_TITLE_CATALOG_CATALOG_NAME": "カタログ名",
|
|
1880
1880
|
"_TITLE_CATALOG_DEFAULT_CATALOG": "デフォルトのカタログ",
|
|
@@ -1941,7 +1941,7 @@
|
|
|
1941
1941
|
"_WARN_ATTR_COMPUTATIONAL_LIMIT": "現在、計算制限に達しているため、システムは次の有効な時間にこの属性を計算します。",
|
|
1942
1942
|
"_WARN_TITLE_AM_WARN_TOTAL": "警告 分析モデルの合計制限数",
|
|
1943
1943
|
"_WARN_AM_WARN_TOTAL_CONTENT_CREATE": "分析モデルの数が制限に達しました。\n新しい分析モデルを作成する場合は、使用されていない分析モデルを削除してください。",
|
|
1944
|
-
"_ACT_WARN_AM_GO_TO_LIST": "
|
|
1944
|
+
"_ACT_WARN_AM_GO_TO_LIST": "分析モデルのリストに移動",
|
|
1945
1945
|
"_TITLE_SELECTED_AM": "選択した分析モデル",
|
|
1946
1946
|
"_WARN_TITLE_AM_NAME": "解析モデル名",
|
|
1947
1947
|
"_WARN_TITLE_AM_STATUS": "状態",
|
|
@@ -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}} 時",
|
|
@@ -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}} に送信されました",
|
|
@@ -2284,7 +2284,7 @@
|
|
|
2284
2284
|
"_BLCK_OTP_EVENT": "イベント",
|
|
2285
2285
|
"_BLCK_OTP_EVENT_SOURCE": "イベントソース",
|
|
2286
2286
|
"_CHANNEL_CUSTOM_API": "カスタムチャンネル",
|
|
2287
|
-
"_CHANNEL_DES_WEB": "ユーザーの行動や好みに基づいて Web
|
|
2287
|
+
"_CHANNEL_DES_WEB": "ユーザーの行動や好みに基づいて Web サイトのコンテンツを動的に調整し、エンゲージメントとコンバージョン率を最適化します。",
|
|
2288
2288
|
"_CHANNEL_DES_WEB_NOTI": "リアルタイムのメッセージを送信して Web サイト訪問者を引きつけ、タイムリーなインタラクションとコンバージョンを促進します",
|
|
2289
2289
|
"_CHANNEL_DES_APP_NOTI": "即時通知をモバイル アプリのみに送信し、即時のエンゲージメントとインタラクションを促進します",
|
|
2290
2290
|
"_CHANNEL_DES_EMAIL": "パーソナライズされたメッセージをユーザーの受信箱に直接配信し、ターゲットを絞ったコンテンツでのエンゲージメントとコンバージョンを促進します。",
|
|
@@ -2400,7 +2400,7 @@
|
|
|
2400
2400
|
"_WEBPER_TEMP_OBJ_INLINE_5": "ソーシャルプルーフディスプレイ",
|
|
2401
2401
|
"_WEBPER_TEMP_OBJ_INLINE_6": "教育コンテンツ",
|
|
2402
2402
|
"_WEBPER_TEMP_OBJ_SLIDEIN_1": "リードマグネット",
|
|
2403
|
-
"_WEBPER_TEMP_OBJ_SLIDEIN_2": "
|
|
2403
|
+
"_WEBPER_TEMP_OBJ_SLIDEIN_2": "終了意図",
|
|
2404
2404
|
"_WEBPER_TEMP_OBJ_SLIDEIN_3": "コンテンツティーザー",
|
|
2405
2405
|
"_WEBPER_TEMP_OBJ_SLIDEIN_4": "アンケートと投票",
|
|
2406
2406
|
"_WEBPER_TEMP_OBJ_SLIDEIN_5": "ソーシャルプルーフディスプレイ",
|
|
@@ -2435,7 +2435,7 @@
|
|
|
2435
2435
|
"_OBJ_DES_WEB_4": "それぞれの訪問者のインタラクションの価値を最大化するために、独自のパーソナライズされたオファーを提供します",
|
|
2436
2436
|
"_OBJ_DES_WEB_5": "ユーザーインタラクションを分析してコンテンツを洗練し、戦略をセグメント化し、Web サイトのレイアウトを最適化します。",
|
|
2437
2437
|
"_OBJ_DES_WEB_NOTI_1": "タイムリーな更新、プロモーション、アラートでユーザーに即座に連絡します",
|
|
2438
|
-
"_OBJ_DES_WEB_NOTI_2": "新しいコンテンツ、製品リリース、または期間限定オファーをユーザーに通知することで、Web
|
|
2438
|
+
"_OBJ_DES_WEB_NOTI_2": "新しいコンテンツ、製品リリース、または期間限定オファーをユーザーに通知することで、Web サイトへのトラフィックを促進します",
|
|
2439
2439
|
"_OBJ_DES_WEB_NOTI_3": "パーソナライズされたオファーやリマインダーを配信してユーザーの行動を促す",
|
|
2440
2440
|
"_OBJ_DES_WEB_NOTI_4": "ユーザーの興味や好みに合わせた関連性の高い有益な通知を送信することで、ユーザーの関心とリピートを維持します。",
|
|
2441
2441
|
"_OBJ_DES_WEB_NOTI_5": "アカウント、トランザクション更新などの関連情報をユーザーのブラウザに直接配信します。",
|
|
@@ -2457,11 +2457,11 @@
|
|
|
2457
2457
|
"_OBJ_DES_SMS_5": "注文確認、出荷通知、アカウント更新をリアルタイムで提供します",
|
|
2458
2458
|
"_OBJ_DES_SMART_INB_1": "通知を集約し、ユーザーがメッセージを 1 か所で簡単に表示および管理できるようにします。",
|
|
2459
2459
|
"_OBJ_DES_SMART_INB_2": "プラットフォーム間で通知にアクセスし、操作するためのシームレスで直感的なインターフェイスを提供します。",
|
|
2460
|
-
"_OBJ_DES_SMART_INB_3": "通知によるタイムリーな応答と対話を促進し、ユーザー
|
|
2460
|
+
"_OBJ_DES_SMART_INB_3": "通知によるタイムリーな応答と対話を促進し、ユーザー エンゲージメントと満足度を最大化します",
|
|
2461
2461
|
"_OBJ_DES_SMART_INB_4": "Web プッシュやアプリ プッシュなどのさまざまなチャネルからの通知を統合し、ユーザーとの一貫性のある一貫したコミュニケーションを確保します。",
|
|
2462
2462
|
"_OBJ_DES_FB_MESS_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2463
2463
|
"_OBJ_DES_FB_MESS_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2464
|
-
"_OBJ_DES_FB_MESS_3": "
|
|
2464
|
+
"_OBJ_DES_FB_MESS_3": "タイムリーかつ効率的な顧客サポートを提供し、メッセンジャー内で直接問い合わせに対応し、問題を解決します。",
|
|
2465
2465
|
"_OBJ_DES_FB_MESS_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2466
2466
|
"_OBJ_DES_FB_MESS_5": "アンケートやインタラクティブなテンプレートを通じて、ユーザーから貴重な洞察とフィードバックを直接収集します",
|
|
2467
2467
|
"_OBJ_DES_VIBER_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
@@ -2472,32 +2472,32 @@
|
|
|
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
2480
|
"_OBJ_DES_WHATSAPP_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2481
|
-
"_OBJ_DES_WHATSAPP_5": "
|
|
2481
|
+
"_OBJ_DES_WHATSAPP_5": "重要なお知らせ、アップデート、ニュースをユーザーと共有して常に最新情報を入手します。",
|
|
2482
2482
|
"_OBJ_DES_TELEGRAM_1": "ターゲットを絞ったプロモーションやオファーをブロードキャストして、エンゲージメントと販売を促進します",
|
|
2483
2483
|
"_OBJ_DES_TELEGRAM_2": "鮮やかなメッセージ テンプレートを使用してタイムリーで関連性のある更新を提供します",
|
|
2484
2484
|
"_OBJ_DES_TELEGRAM_3": "インタラクティブなテンプレート要素を使用して販売目標到達プロセスをガイドし、リードと見込み客を育成します。",
|
|
2485
2485
|
"_OBJ_DES_TELEGRAM_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2486
|
-
"_OBJ_DES_TELEGRAM_5": "
|
|
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
2490
|
"_OBJ_DES_LINE_4": "予定や予約のリマインダーや確認を送信してノーショーを減らします",
|
|
2491
|
-
"_OBJ_DES_LINE_5": "
|
|
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
|
-
"_OBJ_DES_ORCHES_1": "
|
|
2496
|
-
"_OBJ_DES_ORCHES_2": "
|
|
2497
|
-
"_OBJ_DES_ORCHES_3": "
|
|
2495
|
+
"_OBJ_DES_ORCHES_1": "さまざまなチャネルを通じて顧客にリーチし、ブランドの認知度と市場浸透を強化することで、ブランドの認知度を高めます。",
|
|
2496
|
+
"_OBJ_DES_ORCHES_2": "顧客を好みのプラットフォームでエンゲージし、ロイヤルティと支持を促進するシームレスで記憶に残るインタラクションを生み出します。",
|
|
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": "躊躇する訪問者をさらに滞在させ、さらに探索したくなる魅力的なオファーで出口をチャンスに変えます。",
|
|
@@ -2536,16 +2536,16 @@
|
|
|
2536
2536
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_5": "顧客のレビュー、評価、お客様の声などの社会的証明要素を紹介して、購入の意思決定に影響を与える信頼と信用を構築します。",
|
|
2537
2537
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_6": "期間限定のオファー、カウントダウンタイマー、またはフラッシュセール通知を提示することで、緊迫感を醸成し、即時行動を促します。",
|
|
2538
2538
|
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_7": "ターゲットを絞ったオファー、インセンティブ、またはリマインダーを使用して、躊躇している買い物客に購入を完了させるよう促します。",
|
|
2539
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_8": "
|
|
2540
|
-
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_9": "
|
|
2539
|
+
"_WEBPER_TEMP_OBJ_DES_SLIDEIN_8": "顧客からの問い合わせの必要性を減らし、ショッピング体験の全体的な満足度を向上させるために、顧客が遭遇する可能性のある一般的な懸念事項や問題のトラブルシューティングに対処します。",
|
|
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": "組み込みのメッセージ テンプレートを使用して回答を求め、アンケートからユーザー情報を収集します",
|
|
2548
|
-
"_LINE_RM_DEFAULT_OBJ_DES_1": "よくある質問、連絡先情報、ライブ チャット サポートなどのカスタマー サポート
|
|
2548
|
+
"_LINE_RM_DEFAULT_OBJ_DES_1": "よくある質問、連絡先情報、ライブ チャット サポートなどのカスタマー サポート オプションへの素早いアクセスを提供して、新規フォロワーを支援します。",
|
|
2549
2549
|
"_LINE_RM_DEFAULT_OBJ_DES_2": "特別オファー、割引、プロモーションを強調表示する",
|
|
2550
2550
|
"_LINE_RM_DEFAULT_OBJ_DES_3": "今後のイベント、ウェビナー、またはワークショップを宣伝する",
|
|
2551
2551
|
"_LINE_RM_DEFAULT_OBJ_DES_4": "ユーザーを注目の記事、ビデオ、またはブログ投稿に誘導するオプションを提供します",
|
|
@@ -2593,7 +2593,7 @@
|
|
|
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": "エンゲージメントを高める",
|
|
@@ -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à phân nhóm khách hàng
|
|
2058
|
+
"_PREDICT_MODEL_RFM_DESCRIPTION": "Xếp hạng định lượng và phân nhóm khách hà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",
|
|
@@ -2066,7 +2066,7 @@
|
|
|
2066
2066
|
"_PREDICT_MODEL_PREPARE_DATA": "Chuẩn bị dữ liệu",
|
|
2067
2067
|
"_PREDICT_MODEL_TRAIN_MODEL": "Mô hình tàu hỏa",
|
|
2068
2068
|
"_PREDICT_MODEL_SCHEDULE_AND_UPDATE": "Lên lịch & Cập nhật",
|
|
2069
|
-
"_PREDICT_MODEL_DATA_INPUTS": "
|
|
2069
|
+
"_PREDICT_MODEL_DATA_INPUTS": "Dữ liệu đầu vào",
|
|
2070
2070
|
"_PREDICT_MODEL_RFM_NAME": "Tên RFM",
|
|
2071
2071
|
"_PREDICT_MODEL_RFM_DATA_SOURCE": "Nguồn dữ liệu RFM",
|
|
2072
2072
|
"_PREDICT_MODEL_CUSTOMER_IDENTIFY": "Nhận dạng khách hàng",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antscorp/antsomi-ui",
|
|
3
|
-
"version": "1.3.5-beta.
|
|
3
|
+
"version": "1.3.5-beta.831",
|
|
4
4
|
"description": "An enterprise-class UI design language and React UI library.",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"dist/*",
|
|
@@ -252,3 +252,4 @@
|
|
|
252
252
|
"react-router-dom": ">= 5.1.0"
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
|
+
|