@mundogamernetwork/shared-ui 1.5.0 → 1.7.0
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/components/MediaKit/MgMediaKitLinks.vue +122 -0
- package/components/MediaKit/MgMediaKitStore.vue +107 -0
- package/components/form/SortInput.vue +9 -2
- package/components/indie-wall/IndieWallLeaderboard.vue +17 -4
- package/locales/de.json +115 -0
- package/locales/en.json +116 -1
- package/locales/pt-BR.json +115 -0
- package/locales/ro.json +115 -0
- package/nuxt.config.ts +10 -3
- package/package.json +1 -1
- package/pages/key-campaigns/index.vue +7 -6
- package/pages/media-kit/[slug].vue +180 -39
- package/pages/mural/[slug].vue +25 -5
- package/pages/widget/wall/[id].vue +294 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
type MediaKitLink = { label: string; url: string };
|
|
3
|
+
|
|
4
|
+
const props = withDefaults(defineProps<{ links?: MediaKitLink[] }>(), {
|
|
5
|
+
links: () => [],
|
|
6
|
+
});
|
|
7
|
+
const emit = defineEmits<{ update: [key: 'custom_links', value: MediaKitLink[]] }>();
|
|
8
|
+
|
|
9
|
+
const draft = ref<MediaKitLink[]>([]);
|
|
10
|
+
const saved = ref(false);
|
|
11
|
+
|
|
12
|
+
watch(
|
|
13
|
+
() => props.links,
|
|
14
|
+
(value) => {
|
|
15
|
+
draft.value = (value || []).map(link => ({ label: link.label || '', url: link.url || '' }));
|
|
16
|
+
},
|
|
17
|
+
{ immediate: true, deep: true },
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const addLink = () => {
|
|
21
|
+
if (draft.value.length < 12) draft.value.push({ label: '', url: '' });
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const removeLink = (index: number) => draft.value.splice(index, 1);
|
|
25
|
+
|
|
26
|
+
const move = (index: number, direction: -1 | 1) => {
|
|
27
|
+
const target = index + direction;
|
|
28
|
+
if (target < 0 || target >= draft.value.length) return;
|
|
29
|
+
const [link] = draft.value.splice(index, 1);
|
|
30
|
+
draft.value.splice(target, 0, link);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const canSave = computed(() => draft.value.every(link => {
|
|
34
|
+
if (!link.label.trim() || !link.url.trim()) return false;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = new URL(link.url);
|
|
37
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
const save = () => {
|
|
44
|
+
if (!canSave.value) return;
|
|
45
|
+
emit('update', 'custom_links', draft.value.map(link => ({
|
|
46
|
+
label: link.label.trim(),
|
|
47
|
+
url: link.url.trim(),
|
|
48
|
+
})));
|
|
49
|
+
saved.value = true;
|
|
50
|
+
setTimeout(() => { saved.value = false; }, 1800);
|
|
51
|
+
};
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<template>
|
|
55
|
+
<div class="mk-links-editor">
|
|
56
|
+
<div class="mk-links-head">
|
|
57
|
+
<div>
|
|
58
|
+
<h3>{{ $t('media_kit.links.title') }}</h3>
|
|
59
|
+
<p>{{ $t('media_kit.links.description') }}</p>
|
|
60
|
+
</div>
|
|
61
|
+
<button type="button" class="mk-link-add" :disabled="draft.length >= 12" @click="addLink">
|
|
62
|
+
+ {{ $t('media_kit.links.add') }}
|
|
63
|
+
</button>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div v-if="draft.length" class="mk-link-list">
|
|
67
|
+
<div v-for="(link, index) in draft" :key="index" class="mk-link-row">
|
|
68
|
+
<span class="mk-link-number">{{ index + 1 }}</span>
|
|
69
|
+
<label>
|
|
70
|
+
<span>{{ $t('media_kit.links.label') }}</span>
|
|
71
|
+
<input v-model="link.label" type="text" maxlength="80" :placeholder="$t('media_kit.links.label_placeholder')" />
|
|
72
|
+
</label>
|
|
73
|
+
<label class="mk-link-url">
|
|
74
|
+
<span>{{ $t('media_kit.links.url') }}</span>
|
|
75
|
+
<input v-model="link.url" type="url" maxlength="2048" placeholder="https://" />
|
|
76
|
+
</label>
|
|
77
|
+
<div class="mk-link-actions">
|
|
78
|
+
<button type="button" :disabled="index === 0" :aria-label="$t('media_kit.links.move_up')" @click="move(index, -1)">↑</button>
|
|
79
|
+
<button type="button" :disabled="index === draft.length - 1" :aria-label="$t('media_kit.links.move_down')" @click="move(index, 1)">↓</button>
|
|
80
|
+
<button type="button" class="danger" :aria-label="$t('media_kit.links.remove')" @click="removeLink(index)">×</button>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
<p v-else class="mk-links-empty">{{ $t('media_kit.links.empty') }}</p>
|
|
85
|
+
|
|
86
|
+
<div class="mk-links-footer">
|
|
87
|
+
<span v-if="draft.length && !canSave" class="mk-links-error">{{ $t('media_kit.links.invalid') }}</span>
|
|
88
|
+
<button type="button" class="mk-link-save" :disabled="!canSave" @click="save">
|
|
89
|
+
{{ saved ? $t('media_kit.links.saved') : $t('media_kit.links.save') }}
|
|
90
|
+
</button>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</template>
|
|
94
|
+
|
|
95
|
+
<style scoped lang="scss">
|
|
96
|
+
.mk-links-editor { border: 1px solid rgba(140, 140, 160, .3); padding: 20px; background: rgba(255, 255, 255, .02); color: #f2f3f5; }
|
|
97
|
+
.mk-links-head { display: flex; justify-content: space-between; gap: 20px; align-items: start; }
|
|
98
|
+
.mk-links-head h3 { margin: 0 0 5px; color: #f2f3f5; font-size: 17px; }
|
|
99
|
+
.mk-links-head p, .mk-links-empty { margin: 0; color: #9292a4; font-size: 13px; line-height: 1.5; }
|
|
100
|
+
.mk-link-add, .mk-link-save { border: 1px solid #ffb000; background: #ffb000; color: #090909; min-height: 38px; padding: 0 16px; font-weight: 750; cursor: pointer; white-space: nowrap; }
|
|
101
|
+
button:disabled { opacity: .42; cursor: not-allowed; }
|
|
102
|
+
.mk-link-list { display: grid; gap: 10px; margin-top: 18px; }
|
|
103
|
+
.mk-link-row { display: grid; grid-template-columns: 30px minmax(150px, .75fr) minmax(220px, 1.4fr) auto; gap: 10px; align-items: end; padding: 12px; border: 1px solid rgba(140, 140, 160, .25); }
|
|
104
|
+
.mk-link-number { align-self: center; color: #ffb000; font-weight: 800; text-align: center; }
|
|
105
|
+
.mk-link-row label { display: grid; gap: 6px; color: #9292a4; font-size: 11px; text-transform: uppercase; letter-spacing: .08em; }
|
|
106
|
+
.mk-link-row input { min-width: 0; height: 40px; border: 1px solid rgba(140, 140, 160, .35); background: rgba(0, 0, 0, .2); color: #f2f3f5; padding: 0 11px; outline: none; }
|
|
107
|
+
.mk-link-row input::placeholder { color: #6f7480; }
|
|
108
|
+
.mk-link-row input:focus { border-color: #ffb000; }
|
|
109
|
+
.mk-link-actions { display: flex; gap: 5px; }
|
|
110
|
+
.mk-link-actions button { width: 36px; height: 40px; border: 1px solid rgba(140, 140, 160, .35); background: transparent; color: inherit; cursor: pointer; }
|
|
111
|
+
.mk-link-actions .danger { color: #ff7b7b; }
|
|
112
|
+
.mk-links-empty { padding: 22px 0 6px; }
|
|
113
|
+
.mk-links-footer { display: flex; align-items: center; justify-content: flex-end; gap: 14px; margin-top: 16px; }
|
|
114
|
+
.mk-links-error { color: #ff9898; font-size: 12px; }
|
|
115
|
+
|
|
116
|
+
@media (max-width: 760px) {
|
|
117
|
+
.mk-links-head { flex-direction: column; }
|
|
118
|
+
.mk-link-row { grid-template-columns: 24px 1fr; }
|
|
119
|
+
.mk-link-row label, .mk-link-actions { grid-column: 2; }
|
|
120
|
+
.mk-link-actions { justify-content: flex-end; }
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{
|
|
3
|
+
store: Record<string, any>;
|
|
4
|
+
contactEmail?: string | null;
|
|
5
|
+
}>();
|
|
6
|
+
|
|
7
|
+
const emit = defineEmits<{
|
|
8
|
+
click: [type: string];
|
|
9
|
+
}>();
|
|
10
|
+
|
|
11
|
+
const products = computed(() => props.store?.products ?? []);
|
|
12
|
+
|
|
13
|
+
function formatPrice(product: Record<string, any>) {
|
|
14
|
+
try {
|
|
15
|
+
return new Intl.NumberFormat(undefined, {
|
|
16
|
+
style: 'currency',
|
|
17
|
+
currency: product.currency || props.store.currency || 'BRL',
|
|
18
|
+
}).format(Number(product.price || 0));
|
|
19
|
+
} catch {
|
|
20
|
+
return `${product.currency || props.store.currency || 'BRL'} ${Number(product.price || 0).toFixed(2)}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function interestUrl(product: Record<string, any>) {
|
|
25
|
+
if (!props.contactEmail) return null;
|
|
26
|
+
const subject = encodeURIComponent(`${props.store.name} — ${product.name}`);
|
|
27
|
+
return `mailto:${props.contactEmail}?subject=${subject}`;
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<template>
|
|
32
|
+
<div class="mks">
|
|
33
|
+
<div class="mks__head">
|
|
34
|
+
<div class="mks__identity">
|
|
35
|
+
<img v-if="store.logo_url" :src="store.logo_url" :alt="store.name" />
|
|
36
|
+
<div>
|
|
37
|
+
<p class="mks__eyebrow">{{ $t('kit.media.store_eyebrow') }}</p>
|
|
38
|
+
<h2>{{ store.name }}</h2>
|
|
39
|
+
<p v-if="store.description">{{ store.description }}</p>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<span class="mks__badge">Mundo Gamer</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div v-if="products.length" class="mks__grid">
|
|
46
|
+
<article v-for="product in products" :key="product.id" class="mks__product">
|
|
47
|
+
<div class="mks__image">
|
|
48
|
+
<img v-if="product.image" :src="product.image" :alt="product.name" />
|
|
49
|
+
<span v-else>{{ product.name?.charAt(0) }}</span>
|
|
50
|
+
<em v-if="product.is_featured">{{ $t('kit.media.store_featured') }}</em>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="mks__body">
|
|
53
|
+
<div>
|
|
54
|
+
<h3>{{ product.name }}</h3>
|
|
55
|
+
<p v-if="product.description">{{ product.description }}</p>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="mks__footer">
|
|
58
|
+
<strong>{{ formatPrice(product) }}</strong>
|
|
59
|
+
<a
|
|
60
|
+
v-if="interestUrl(product)"
|
|
61
|
+
:href="interestUrl(product) || undefined"
|
|
62
|
+
@click="emit('click', 'store_product')"
|
|
63
|
+
>{{ $t('kit.media.store_interest') }}</a>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</article>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<p v-else class="mks__empty">{{ $t('kit.media.store_empty') }}</p>
|
|
70
|
+
</div>
|
|
71
|
+
</template>
|
|
72
|
+
|
|
73
|
+
<style scoped lang="scss">
|
|
74
|
+
.mks { display: grid; gap: 22px; }
|
|
75
|
+
.mks__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; }
|
|
76
|
+
.mks__identity { display: flex; align-items: center; gap: 16px; min-width: 0; }
|
|
77
|
+
.mks__identity img { width: 64px; height: 64px; object-fit: cover; border: 1px solid var(--kit-line); }
|
|
78
|
+
.mks__identity h2 { margin: 2px 0 4px; font-size: 24px; color: var(--kit-text); }
|
|
79
|
+
.mks__identity p { margin: 0; color: var(--kit-muted); line-height: 1.5; }
|
|
80
|
+
.mks__eyebrow { color: var(--kit-accent) !important; text-transform: uppercase; letter-spacing: .12em; font-size: 10px; font-weight: 800; }
|
|
81
|
+
.mks__badge { flex: none; padding: 6px 9px; border: 1px solid var(--kit-line); color: var(--kit-muted); font-size: 10px; text-transform: uppercase; letter-spacing: .08em; }
|
|
82
|
+
.mks__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; }
|
|
83
|
+
.mks__product { display: flex; flex-direction: column; min-height: 290px; overflow: hidden; border: 1px solid var(--kit-line); background: var(--kit-surface-2); }
|
|
84
|
+
.mks__image { position: relative; display: grid; place-items: center; aspect-ratio: 4 / 3; overflow: hidden; background: color-mix(in srgb, var(--kit-accent) 10%, var(--kit-bg)); color: var(--kit-accent); font-size: 38px; font-weight: 800; }
|
|
85
|
+
.mks__image img { width: 100%; height: 100%; object-fit: cover; transition: transform .25s ease; }
|
|
86
|
+
.mks__product:hover .mks__image img { transform: scale(1.035); }
|
|
87
|
+
.mks__image em { position: absolute; top: 10px; left: 10px; padding: 5px 7px; background: var(--kit-accent); color: #0c0e12; font-size: 9px; font-style: normal; font-weight: 800; text-transform: uppercase; letter-spacing: .08em; }
|
|
88
|
+
.mks__body { display: flex; flex: 1; flex-direction: column; justify-content: space-between; gap: 18px; padding: 14px; }
|
|
89
|
+
.mks__body h3 { margin: 0 0 6px; color: var(--kit-text); font-size: 15px; }
|
|
90
|
+
.mks__body p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--kit-muted); font-size: 12px; line-height: 1.45; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
|
|
91
|
+
.mks__footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
|
|
92
|
+
.mks__footer strong { color: var(--kit-text); font-size: 15px; }
|
|
93
|
+
.mks__footer a { padding: 7px 9px; border: 1px solid var(--kit-accent); color: var(--kit-accent); font-size: 11px; font-weight: 700; text-decoration: none; }
|
|
94
|
+
.mks__empty { margin: 0; color: var(--kit-muted); }
|
|
95
|
+
|
|
96
|
+
@media (max-width: 560px) {
|
|
97
|
+
.mks__head { flex-direction: column; }
|
|
98
|
+
.mks__badge { display: none; }
|
|
99
|
+
.mks__grid { grid-template-columns: 1fr 1fr; }
|
|
100
|
+
.mks__product { min-height: 250px; }
|
|
101
|
+
.mks__footer { align-items: flex-start; flex-direction: column; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@media (max-width: 390px) {
|
|
105
|
+
.mks__grid { grid-template-columns: 1fr; }
|
|
106
|
+
}
|
|
107
|
+
</style>
|
|
@@ -13,8 +13,15 @@ const emit = defineEmits(["update:model"]);
|
|
|
13
13
|
const props = defineProps<SortInputProps>();
|
|
14
14
|
const sortModel = ref(props.model);
|
|
15
15
|
|
|
16
|
-
watch(
|
|
17
|
-
|
|
16
|
+
watch(
|
|
17
|
+
() => props.model,
|
|
18
|
+
(value) => {
|
|
19
|
+
sortModel.value = value;
|
|
20
|
+
},
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
watch(sortModel, (value) => {
|
|
24
|
+
emit("update:model", value);
|
|
18
25
|
});
|
|
19
26
|
|
|
20
27
|
const toggleSort = () => {
|
|
@@ -26,9 +26,7 @@ const ranked = computed<RankEntry[]>(() => {
|
|
|
26
26
|
const key = userId ? `u:${userId}` : email ? `e:${email}` : null
|
|
27
27
|
if (!key) continue
|
|
28
28
|
|
|
29
|
-
const name = s
|
|
30
|
-
? t('tv.dashboard.indie_wall.anonymous')
|
|
31
|
-
: (s.title || s.user?.name || s.guest_name || 'Guest')
|
|
29
|
+
const name = supporterDisplayName(s)
|
|
32
30
|
|
|
33
31
|
if (map.has(key)) {
|
|
34
32
|
const entry = map.get(key)!
|
|
@@ -38,7 +36,7 @@ const ranked = computed<RankEntry[]>(() => {
|
|
|
38
36
|
map.set(key, {
|
|
39
37
|
key,
|
|
40
38
|
name,
|
|
41
|
-
avatarUrl: s
|
|
39
|
+
avatarUrl: supporterAvatarUrl(s),
|
|
42
40
|
totalPixels: s.pixel_count || 1,
|
|
43
41
|
purchases: 1,
|
|
44
42
|
position: 0,
|
|
@@ -57,6 +55,21 @@ const visible = computed(() => showAll.value ? ranked.value : ranked.value.slice
|
|
|
57
55
|
function initials(name: string): string {
|
|
58
56
|
return name.trim().split(/\s+/).slice(0, 2).map(w => w[0]).join('').toUpperCase()
|
|
59
57
|
}
|
|
58
|
+
|
|
59
|
+
function supporterDisplayName(s: any): string {
|
|
60
|
+
if (s.is_anonymous) return t('tv.dashboard.indie_wall.anonymous')
|
|
61
|
+
return s.user?.nickname
|
|
62
|
+
|| s.user?.username
|
|
63
|
+
|| s.user?.full_name
|
|
64
|
+
|| s.user?.name
|
|
65
|
+
|| s.guest_name
|
|
66
|
+
|| 'Guest'
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function supporterAvatarUrl(s: any): string | null {
|
|
70
|
+
if (s.is_anonymous) return null
|
|
71
|
+
return s.user?.avatar_url || s.user?.profile_image || s.user?.avatar || s.user?.image || null
|
|
72
|
+
}
|
|
60
73
|
</script>
|
|
61
74
|
|
|
62
75
|
<template>
|
package/locales/de.json
CHANGED
|
@@ -240,5 +240,120 @@
|
|
|
240
240
|
"common": {
|
|
241
241
|
"video_thumbnail": "Video-Vorschaubild",
|
|
242
242
|
"expanded_image": "Vergrößertes Bild"
|
|
243
|
+
},
|
|
244
|
+
"tv": {
|
|
245
|
+
"dashboard": {
|
|
246
|
+
"indie_wall": {
|
|
247
|
+
"about_section": "Über die Wall",
|
|
248
|
+
"anonymous": "Anonym",
|
|
249
|
+
"cancel": "Abbrechen",
|
|
250
|
+
"confirm_support": "Unterstützung bestätigen",
|
|
251
|
+
"cta_create_btn": "Create my account",
|
|
252
|
+
"cta_create_desc": "Create an account to track your support, receive updates, and join other walls.",
|
|
253
|
+
"cta_create_skip": "Continue without an account",
|
|
254
|
+
"cta_create_title": "Want to save your support?",
|
|
255
|
+
"drag_to_crop": "Drag to crop",
|
|
256
|
+
"error_area_occupied": "This area is already taken. Choose another space on the wall.",
|
|
257
|
+
"error_gateway": "Could not start payment. Try again.",
|
|
258
|
+
"error_save": "Could not save your support. Try again.",
|
|
259
|
+
"filled": "Gefüllt",
|
|
260
|
+
"footer_create_cta": "Create your own wall",
|
|
261
|
+
"footer_made_with": "Made with",
|
|
262
|
+
"goal_card_cta": "Dieses Ziel unterstützen",
|
|
263
|
+
"goal_card_goal": "Goal",
|
|
264
|
+
"goal_card_missing": "es fehlen {count} Pixel bis zur nächsten Lieferung",
|
|
265
|
+
"goal_card_missing_amount": "es fehlen {amount} bis zur nächsten Lieferung",
|
|
266
|
+
"goal_card_result": "Result",
|
|
267
|
+
"goal_card_select": "Select goal",
|
|
268
|
+
"goal_card_you_help": "You help",
|
|
269
|
+
"goals": "Ziele",
|
|
270
|
+
"guest_email_label": "Your email",
|
|
271
|
+
"guest_email_placeholder": "you@email.com",
|
|
272
|
+
"guest_intro": "You can support without creating an account. Use a name and email to receive confirmation.",
|
|
273
|
+
"guest_name_label": "Public name",
|
|
274
|
+
"guest_name_placeholder": "How do you want to appear on the wall?",
|
|
275
|
+
"just_supported": "Support received",
|
|
276
|
+
"leaderboard_pixels": "pixels",
|
|
277
|
+
"leaderboard_purchases": "support",
|
|
278
|
+
"leaderboard_purchases_plural": "supports",
|
|
279
|
+
"leaderboard_show_less": "Show less",
|
|
280
|
+
"leaderboard_show_more": "Show more",
|
|
281
|
+
"leaderboard_title": "Supporter",
|
|
282
|
+
"leaderboard_title_span": "leaderboard",
|
|
283
|
+
"message": "Message",
|
|
284
|
+
"message_placeholder": "Leave a message for the creator",
|
|
285
|
+
"mural_by": "by {name}",
|
|
286
|
+
"mural_click_hint": "Click a pixel to see who supported",
|
|
287
|
+
"mural_grid": "Wall",
|
|
288
|
+
"mural_legend_free": "Free",
|
|
289
|
+
"mural_legend_taken": "Taken",
|
|
290
|
+
"mural_position": "Position",
|
|
291
|
+
"mural_support_now": "Support now",
|
|
292
|
+
"mural_title_field": "Support title",
|
|
293
|
+
"mural_title_placeholder": "Ex: First pixels of the project",
|
|
294
|
+
"not_found": "Wall not found.",
|
|
295
|
+
"pay_agree": "I agree to the support and billing terms.",
|
|
296
|
+
"pay_agree_rights": "I understand the image and message may appear publicly on the wall.",
|
|
297
|
+
"pay_paypal": "PayPal",
|
|
298
|
+
"pay_paypal_meta": "Secure payment through PayPal",
|
|
299
|
+
"pay_pix": "Pix",
|
|
300
|
+
"pay_pix_soon": "Coming soon",
|
|
301
|
+
"pay_stripe": "Card",
|
|
302
|
+
"pay_stripe_meta": "Secure payment through Stripe",
|
|
303
|
+
"pixels_available": "Available pixels",
|
|
304
|
+
"processing_close": "Close",
|
|
305
|
+
"processing_desc": "We are confirming your support. This may take a few seconds.",
|
|
306
|
+
"processing_timeout_desc": "Confirmation is taking longer than usual. You can close this and check again later.",
|
|
307
|
+
"processing_timeout_title": "Still processing",
|
|
308
|
+
"processing_title": "Processing support",
|
|
309
|
+
"raised": "Gesammelt",
|
|
310
|
+
"reached": "Erreicht",
|
|
311
|
+
"recent_supporters": "Recent supporters",
|
|
312
|
+
"share_copy_link": "Copy link",
|
|
313
|
+
"share_join_cta": "Diese Wall ebenfalls unterstützen",
|
|
314
|
+
"share_pixel_cta": "Diese Unterstützung teilen",
|
|
315
|
+
"share_pixel_default_desc": "See who is supporting the {wall} wall.",
|
|
316
|
+
"share_pixel_text": "{name} supported the {wall} wall. Join in and support too.",
|
|
317
|
+
"share_pixel_title": "{name} supported {wall}",
|
|
318
|
+
"share_via_facebook": "Share on Facebook",
|
|
319
|
+
"share_via_twitter": "Share on X",
|
|
320
|
+
"share_via_whatsapp": "Share on WhatsApp",
|
|
321
|
+
"sold": "sold",
|
|
322
|
+
"spots_unit": "Pixel",
|
|
323
|
+
"step_back": "Back",
|
|
324
|
+
"step_block_auto": "Choose automatically",
|
|
325
|
+
"step_block_confirm": "Confirm position",
|
|
326
|
+
"step_block_help": "Choose where your {count} pixels will appear on the wall.",
|
|
327
|
+
"step_block_manual": "Choose manually",
|
|
328
|
+
"step_block_quantity": "Quantity",
|
|
329
|
+
"step_block_shape": "Shape",
|
|
330
|
+
"step_block_title": "Choose your space",
|
|
331
|
+
"step_block_total": "{total} pixels",
|
|
332
|
+
"step_customize_continue": "Continue",
|
|
333
|
+
"step_customize_help": "Upload your image, title, and message to appear on the wall.",
|
|
334
|
+
"step_customize_image": "Support image",
|
|
335
|
+
"step_customize_image_hint": "Use a square image or crop it before continuing.",
|
|
336
|
+
"step_customize_link": "Optional link",
|
|
337
|
+
"step_customize_link_error": "Enter a valid link.",
|
|
338
|
+
"step_customize_remove_image": "Remove image",
|
|
339
|
+
"step_customize_replace_image": "Replace image",
|
|
340
|
+
"step_customize_title": "Customize your support",
|
|
341
|
+
"step_customize_upload_image": "Upload image",
|
|
342
|
+
"step_goal_help": "Choose a goal to direct your support.",
|
|
343
|
+
"step_goal_skip_desc": "Your support goes to the general wall without linking to a specific goal.",
|
|
344
|
+
"step_goal_skip_title": "Support without a goal",
|
|
345
|
+
"step_goal_title": "Choose a goal",
|
|
346
|
+
"step_package_custom_cta": "Set quantity",
|
|
347
|
+
"step_package_custom_desc": "Choose how many pixels you want to buy.",
|
|
348
|
+
"step_package_custom_title": "Custom",
|
|
349
|
+
"step_package_help": "Choose a pixel package for the wall.",
|
|
350
|
+
"step_package_title": "Choose your package",
|
|
351
|
+
"step_pay_method": "Payment method",
|
|
352
|
+
"step_pay_title": "Payment",
|
|
353
|
+
"step_pay_total": "Total",
|
|
354
|
+
"supporters": "Unterstützer",
|
|
355
|
+
"tiers": "Packages"
|
|
356
|
+
}
|
|
357
|
+
}
|
|
243
358
|
}
|
|
244
359
|
}
|
package/locales/en.json
CHANGED
|
@@ -240,5 +240,120 @@
|
|
|
240
240
|
"common": {
|
|
241
241
|
"video_thumbnail": "Video thumbnail",
|
|
242
242
|
"expanded_image": "Expanded image"
|
|
243
|
+
},
|
|
244
|
+
"tv": {
|
|
245
|
+
"dashboard": {
|
|
246
|
+
"indie_wall": {
|
|
247
|
+
"about_section": "About the wall",
|
|
248
|
+
"anonymous": "Anonymous",
|
|
249
|
+
"cancel": "Cancel",
|
|
250
|
+
"confirm_support": "Confirm support",
|
|
251
|
+
"cta_create_btn": "Create my account",
|
|
252
|
+
"cta_create_desc": "Create an account to track your support, receive updates, and join other walls.",
|
|
253
|
+
"cta_create_skip": "Continue without an account",
|
|
254
|
+
"cta_create_title": "Want to save your support?",
|
|
255
|
+
"drag_to_crop": "Drag to crop",
|
|
256
|
+
"error_area_occupied": "This area is already taken. Choose another space on the wall.",
|
|
257
|
+
"error_gateway": "Could not start payment. Try again.",
|
|
258
|
+
"error_save": "Could not save your support. Try again.",
|
|
259
|
+
"filled": "Filled",
|
|
260
|
+
"footer_create_cta": "Create your own wall",
|
|
261
|
+
"footer_made_with": "Made with",
|
|
262
|
+
"goal_card_cta": "Support this goal",
|
|
263
|
+
"goal_card_goal": "Goal",
|
|
264
|
+
"goal_card_missing": "missing {count} pixels for the next delivery",
|
|
265
|
+
"goal_card_missing_amount": "missing {amount} for the next delivery",
|
|
266
|
+
"goal_card_result": "Result",
|
|
267
|
+
"goal_card_select": "Select goal",
|
|
268
|
+
"goal_card_you_help": "You help",
|
|
269
|
+
"goals": "Goals",
|
|
270
|
+
"guest_email_label": "Your email",
|
|
271
|
+
"guest_email_placeholder": "you@email.com",
|
|
272
|
+
"guest_intro": "You can support without creating an account. Use a name and email to receive confirmation.",
|
|
273
|
+
"guest_name_label": "Public name",
|
|
274
|
+
"guest_name_placeholder": "How do you want to appear on the wall?",
|
|
275
|
+
"just_supported": "Support received",
|
|
276
|
+
"leaderboard_pixels": "pixels",
|
|
277
|
+
"leaderboard_purchases": "support",
|
|
278
|
+
"leaderboard_purchases_plural": "supports",
|
|
279
|
+
"leaderboard_show_less": "Show less",
|
|
280
|
+
"leaderboard_show_more": "Show more",
|
|
281
|
+
"leaderboard_title": "Supporter",
|
|
282
|
+
"leaderboard_title_span": "leaderboard",
|
|
283
|
+
"message": "Message",
|
|
284
|
+
"message_placeholder": "Leave a message for the creator",
|
|
285
|
+
"mural_by": "by {name}",
|
|
286
|
+
"mural_click_hint": "Click a pixel to see who supported",
|
|
287
|
+
"mural_grid": "Wall",
|
|
288
|
+
"mural_legend_free": "Free",
|
|
289
|
+
"mural_legend_taken": "Taken",
|
|
290
|
+
"mural_position": "Position",
|
|
291
|
+
"mural_support_now": "Support now",
|
|
292
|
+
"mural_title_field": "Support title",
|
|
293
|
+
"mural_title_placeholder": "Ex: First pixels of the project",
|
|
294
|
+
"not_found": "Wall not found.",
|
|
295
|
+
"pay_agree": "I agree to the support and billing terms.",
|
|
296
|
+
"pay_agree_rights": "I understand the image and message may appear publicly on the wall.",
|
|
297
|
+
"pay_paypal": "PayPal",
|
|
298
|
+
"pay_paypal_meta": "Secure payment through PayPal",
|
|
299
|
+
"pay_pix": "Pix",
|
|
300
|
+
"pay_pix_soon": "Coming soon",
|
|
301
|
+
"pay_stripe": "Card",
|
|
302
|
+
"pay_stripe_meta": "Secure payment through Stripe",
|
|
303
|
+
"pixels_available": "Available pixels",
|
|
304
|
+
"processing_close": "Close",
|
|
305
|
+
"processing_desc": "We are confirming your support. This may take a few seconds.",
|
|
306
|
+
"processing_timeout_desc": "Confirmation is taking longer than usual. You can close this and check again later.",
|
|
307
|
+
"processing_timeout_title": "Still processing",
|
|
308
|
+
"processing_title": "Processing support",
|
|
309
|
+
"raised": "Raised",
|
|
310
|
+
"reached": "Reached",
|
|
311
|
+
"recent_supporters": "Recent supporters",
|
|
312
|
+
"share_copy_link": "Copy link",
|
|
313
|
+
"share_join_cta": "Support this wall too",
|
|
314
|
+
"share_pixel_cta": "Share this support",
|
|
315
|
+
"share_pixel_default_desc": "See who is supporting the {wall} wall.",
|
|
316
|
+
"share_pixel_text": "{name} supported the {wall} wall. Join in and support too.",
|
|
317
|
+
"share_pixel_title": "{name} supported {wall}",
|
|
318
|
+
"share_via_facebook": "Share on Facebook",
|
|
319
|
+
"share_via_twitter": "Share on X",
|
|
320
|
+
"share_via_whatsapp": "Share on WhatsApp",
|
|
321
|
+
"sold": "sold",
|
|
322
|
+
"spots_unit": "pixels",
|
|
323
|
+
"step_back": "Back",
|
|
324
|
+
"step_block_auto": "Choose automatically",
|
|
325
|
+
"step_block_confirm": "Confirm position",
|
|
326
|
+
"step_block_help": "Choose where your {count} pixels will appear on the wall.",
|
|
327
|
+
"step_block_manual": "Choose manually",
|
|
328
|
+
"step_block_quantity": "Quantity",
|
|
329
|
+
"step_block_shape": "Shape",
|
|
330
|
+
"step_block_title": "Choose your space",
|
|
331
|
+
"step_block_total": "{total} pixels",
|
|
332
|
+
"step_customize_continue": "Continue",
|
|
333
|
+
"step_customize_help": "Upload your image, title, and message to appear on the wall.",
|
|
334
|
+
"step_customize_image": "Support image",
|
|
335
|
+
"step_customize_image_hint": "Use a square image or crop it before continuing.",
|
|
336
|
+
"step_customize_link": "Optional link",
|
|
337
|
+
"step_customize_link_error": "Enter a valid link.",
|
|
338
|
+
"step_customize_remove_image": "Remove image",
|
|
339
|
+
"step_customize_replace_image": "Replace image",
|
|
340
|
+
"step_customize_title": "Customize your support",
|
|
341
|
+
"step_customize_upload_image": "Upload image",
|
|
342
|
+
"step_goal_help": "Choose a goal to direct your support.",
|
|
343
|
+
"step_goal_skip_desc": "Your support goes to the general wall without linking to a specific goal.",
|
|
344
|
+
"step_goal_skip_title": "Support without a goal",
|
|
345
|
+
"step_goal_title": "Choose a goal",
|
|
346
|
+
"step_package_custom_cta": "Set quantity",
|
|
347
|
+
"step_package_custom_desc": "Choose how many pixels you want to buy.",
|
|
348
|
+
"step_package_custom_title": "Custom",
|
|
349
|
+
"step_package_help": "Choose a pixel package for the wall.",
|
|
350
|
+
"step_package_title": "Choose your package",
|
|
351
|
+
"step_pay_method": "Payment method",
|
|
352
|
+
"step_pay_title": "Payment",
|
|
353
|
+
"step_pay_total": "Total",
|
|
354
|
+
"supporters": "Supporters",
|
|
355
|
+
"tiers": "Packages"
|
|
356
|
+
}
|
|
357
|
+
}
|
|
243
358
|
}
|
|
244
|
-
}
|
|
359
|
+
}
|
package/locales/pt-BR.json
CHANGED
|
@@ -240,5 +240,120 @@
|
|
|
240
240
|
"common": {
|
|
241
241
|
"video_thumbnail": "Miniatura do vídeo",
|
|
242
242
|
"expanded_image": "Imagem ampliada"
|
|
243
|
+
},
|
|
244
|
+
"tv": {
|
|
245
|
+
"dashboard": {
|
|
246
|
+
"indie_wall": {
|
|
247
|
+
"about_section": "Sobre o mural",
|
|
248
|
+
"anonymous": "Anônimo",
|
|
249
|
+
"cancel": "Cancelar",
|
|
250
|
+
"confirm_support": "Confirmar apoio",
|
|
251
|
+
"cta_create_btn": "Criar minha conta",
|
|
252
|
+
"cta_create_desc": "Crie uma conta para acompanhar seu apoio, receber atualizações e participar de outros murais.",
|
|
253
|
+
"cta_create_skip": "Continuar sem criar conta",
|
|
254
|
+
"cta_create_title": "Quer salvar seu apoio?",
|
|
255
|
+
"drag_to_crop": "Arraste para recortar",
|
|
256
|
+
"error_area_occupied": "Essa área já foi ocupada. Escolha outro espaço no mural.",
|
|
257
|
+
"error_gateway": "Não foi possível iniciar o pagamento. Tente novamente.",
|
|
258
|
+
"error_save": "Não foi possível salvar seu apoio. Tente novamente.",
|
|
259
|
+
"filled": "Preenchido",
|
|
260
|
+
"footer_create_cta": "Crie seu próprio mural",
|
|
261
|
+
"footer_made_with": "Feito com",
|
|
262
|
+
"goal_card_cta": "Apoiar esta meta",
|
|
263
|
+
"goal_card_goal": "Meta",
|
|
264
|
+
"goal_card_missing": "faltam {count} pixels para a próxima entrega",
|
|
265
|
+
"goal_card_missing_amount": "faltam {amount} para a próxima entrega",
|
|
266
|
+
"goal_card_result": "Resultado",
|
|
267
|
+
"goal_card_select": "Selecionar meta",
|
|
268
|
+
"goal_card_you_help": "Você ajuda",
|
|
269
|
+
"goals": "Metas",
|
|
270
|
+
"guest_email_label": "Seu e-mail",
|
|
271
|
+
"guest_email_placeholder": "voce@email.com",
|
|
272
|
+
"guest_intro": "Você pode apoiar sem criar conta. Use um nome e e-mail para receber a confirmação.",
|
|
273
|
+
"guest_name_label": "Nome público",
|
|
274
|
+
"guest_name_placeholder": "Como você quer aparecer no mural?",
|
|
275
|
+
"just_supported": "Apoio recebido",
|
|
276
|
+
"leaderboard_pixels": "pixels",
|
|
277
|
+
"leaderboard_purchases": "apoio",
|
|
278
|
+
"leaderboard_purchases_plural": "apoios",
|
|
279
|
+
"leaderboard_show_less": "Ver menos",
|
|
280
|
+
"leaderboard_show_more": "Ver mais",
|
|
281
|
+
"leaderboard_title": "Ranking",
|
|
282
|
+
"leaderboard_title_span": "de apoiadores",
|
|
283
|
+
"message": "Mensagem",
|
|
284
|
+
"message_placeholder": "Deixe uma mensagem para o criador",
|
|
285
|
+
"mural_by": "por {name}",
|
|
286
|
+
"mural_click_hint": "Clique em um pixel para ver quem apoiou",
|
|
287
|
+
"mural_grid": "Mural",
|
|
288
|
+
"mural_legend_free": "Livre",
|
|
289
|
+
"mural_legend_taken": "Ocupado",
|
|
290
|
+
"mural_position": "Posição",
|
|
291
|
+
"mural_support_now": "Apoiar agora",
|
|
292
|
+
"mural_title_field": "Título do apoio",
|
|
293
|
+
"mural_title_placeholder": "Ex: Primeiros pixels do projeto",
|
|
294
|
+
"not_found": "Mural não encontrado.",
|
|
295
|
+
"pay_agree": "Concordo com os termos de apoio e cobrança.",
|
|
296
|
+
"pay_agree_rights": "Entendo que a imagem e mensagem podem aparecer publicamente no mural.",
|
|
297
|
+
"pay_paypal": "PayPal",
|
|
298
|
+
"pay_paypal_meta": "Pagamento seguro via PayPal",
|
|
299
|
+
"pay_pix": "Pix",
|
|
300
|
+
"pay_pix_soon": "Disponível em breve",
|
|
301
|
+
"pay_stripe": "Cartão",
|
|
302
|
+
"pay_stripe_meta": "Pagamento seguro via Stripe",
|
|
303
|
+
"pixels_available": "Pixels disponíveis",
|
|
304
|
+
"processing_close": "Fechar",
|
|
305
|
+
"processing_desc": "Estamos confirmando seu apoio. Isso pode levar alguns segundos.",
|
|
306
|
+
"processing_timeout_desc": "A confirmação está demorando mais que o normal. Você pode fechar e conferir novamente depois.",
|
|
307
|
+
"processing_timeout_title": "Ainda processando",
|
|
308
|
+
"processing_title": "Processando apoio",
|
|
309
|
+
"raised": "Arrecadado",
|
|
310
|
+
"reached": "Concluída",
|
|
311
|
+
"recent_supporters": "Apoiadores recentes",
|
|
312
|
+
"share_copy_link": "Copiar link",
|
|
313
|
+
"share_join_cta": "Apoiar este mural também",
|
|
314
|
+
"share_pixel_cta": "Compartilhe este apoio",
|
|
315
|
+
"share_pixel_default_desc": "Veja quem está apoiando o mural {wall}.",
|
|
316
|
+
"share_pixel_text": "{name} apoiou o mural {wall}. Venha apoiar também.",
|
|
317
|
+
"share_pixel_title": "{name} apoiou {wall}",
|
|
318
|
+
"share_via_facebook": "Compartilhar no Facebook",
|
|
319
|
+
"share_via_twitter": "Compartilhar no X",
|
|
320
|
+
"share_via_whatsapp": "Compartilhar no WhatsApp",
|
|
321
|
+
"sold": "vendidos",
|
|
322
|
+
"spots_unit": "pixels",
|
|
323
|
+
"step_back": "Voltar",
|
|
324
|
+
"step_block_auto": "Escolher automaticamente",
|
|
325
|
+
"step_block_confirm": "Confirmar posição",
|
|
326
|
+
"step_block_help": "Escolha onde seus {count} pixels aparecerão no mural.",
|
|
327
|
+
"step_block_manual": "Escolher manualmente",
|
|
328
|
+
"step_block_quantity": "Quantidade",
|
|
329
|
+
"step_block_shape": "Formato",
|
|
330
|
+
"step_block_title": "Escolha seu espaço",
|
|
331
|
+
"step_block_total": "{total} pixels",
|
|
332
|
+
"step_customize_continue": "Continuar",
|
|
333
|
+
"step_customize_help": "Envie sua imagem, título e mensagem para aparecer no mural.",
|
|
334
|
+
"step_customize_image": "Imagem do apoio",
|
|
335
|
+
"step_customize_image_hint": "Use uma imagem quadrada ou recorte antes de continuar.",
|
|
336
|
+
"step_customize_link": "Link opcional",
|
|
337
|
+
"step_customize_link_error": "Informe um link válido.",
|
|
338
|
+
"step_customize_remove_image": "Remover imagem",
|
|
339
|
+
"step_customize_replace_image": "Trocar imagem",
|
|
340
|
+
"step_customize_title": "Personalize seu apoio",
|
|
341
|
+
"step_customize_upload_image": "Enviar imagem",
|
|
342
|
+
"step_goal_help": "Escolha uma meta para direcionar seu apoio.",
|
|
343
|
+
"step_goal_skip_desc": "Seu apoio entra no mural geral sem vincular a uma meta específica.",
|
|
344
|
+
"step_goal_skip_title": "Apoiar sem meta",
|
|
345
|
+
"step_goal_title": "Escolha uma meta",
|
|
346
|
+
"step_package_custom_cta": "Definir quantidade",
|
|
347
|
+
"step_package_custom_desc": "Escolha quantos pixels quer comprar.",
|
|
348
|
+
"step_package_custom_title": "Personalizado",
|
|
349
|
+
"step_package_help": "Escolha um pacote de pixels para ocupar no mural.",
|
|
350
|
+
"step_package_title": "Escolha seu pacote",
|
|
351
|
+
"step_pay_method": "Forma de pagamento",
|
|
352
|
+
"step_pay_title": "Pagamento",
|
|
353
|
+
"step_pay_total": "Total",
|
|
354
|
+
"supporters": "Apoiadores",
|
|
355
|
+
"tiers": "Pacotes"
|
|
356
|
+
}
|
|
357
|
+
}
|
|
243
358
|
}
|
|
244
359
|
}
|