testimonials 0.7.4 → 0.7.6
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/README.md +26 -6
- data/app/controllers/testimonials/collection_controller.rb +20 -6
- data/app/views/layouts/testimonials/application.html.erb +2 -7
- data/app/views/layouts/testimonials/collection.html.erb +2 -1
- data/app/views/testimonials/collection/nps.html.erb +14 -0
- data/app/views/testimonials/nps_responses/index.html.erb +12 -1
- data/app/views/testimonials/testimonials/_testimonial_panel.html.erb +15 -15
- data/app/views/testimonials/testimonials/index.html.erb +11 -1
- data/config/locales/testimonials.ar.yml +5 -2
- data/config/locales/testimonials.bg.yml +5 -2
- data/config/locales/testimonials.bn.yml +5 -2
- data/config/locales/testimonials.de.yml +5 -2
- data/config/locales/testimonials.el.yml +5 -2
- data/config/locales/testimonials.en.yml +5 -2
- data/config/locales/testimonials.es.yml +5 -2
- data/config/locales/testimonials.fr.yml +5 -2
- data/config/locales/testimonials.hi.yml +5 -2
- data/config/locales/testimonials.hr.yml +5 -2
- data/config/locales/testimonials.id.yml +5 -2
- data/config/locales/testimonials.it.yml +5 -2
- data/config/locales/testimonials.ja.yml +5 -2
- data/config/locales/testimonials.ko.yml +5 -2
- data/config/locales/testimonials.lb.yml +5 -2
- data/config/locales/testimonials.nl.yml +5 -2
- data/config/locales/testimonials.pl.yml +5 -2
- data/config/locales/testimonials.pt.yml +5 -2
- data/config/locales/testimonials.ro.yml +5 -2
- data/config/locales/testimonials.ru.yml +5 -2
- data/config/locales/testimonials.th.yml +5 -2
- data/config/locales/testimonials.tr.yml +5 -2
- data/config/locales/testimonials.uk.yml +5 -2
- data/config/locales/testimonials.ur.yml +5 -2
- data/config/locales/testimonials.vi.yml +5 -2
- data/config/locales/testimonials.zh-CN.yml +5 -2
- data/config/routes.rb +1 -0
- data/lib/generators/testimonials/install/install_generator.rb +1 -0
- data/lib/tasks/testimonials_tasks.rake +11 -0
- data/lib/testimonials/dashboard.css +6 -2
- data/lib/testimonials/demo/README.md +7 -0
- data/lib/testimonials/demo/flower.mp4 +0 -0
- data/lib/testimonials/engine.rb +4 -0
- data/lib/testimonials/seeds.rb +164 -0
- data/lib/testimonials/version.rb +1 -1
- data/lib/testimonials/widget.js +28 -9
- data/lib/testimonials.rb +1 -0
- metadata +6 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8928b25b69df76c0475bb2509b8a42f270bf235e619dc779610e20ac8db4982c
|
|
4
|
+
data.tar.gz: e2801ac0a208d1f9323ab18ba0708e62db749c69223fd3b3d34815ffbc897425
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5aa795b056831e15678e4ed5d7e7d0d91161be9c7c60ae45768c4d9f0a269cc29ec8119f9798c2263531bbd10c0cf98a2858fed72fd7e300626bf0bded782686
|
|
7
|
+
data.tar.gz: b93d683153b5ad28d240f5072e52c0a6bfdddc16117771776e5dd734b4dd843d4e0d2a52836ae9c7a3eaabd5c7dbf5a1b3f4bda42921a13911ac023c7c2c2397
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.7.6
|
|
4
|
+
|
|
5
|
+
- Added a standalone public NPS page at `/testimonials/nps/new`, the shareable
|
|
6
|
+
counterpart to `/testimonials/new` — the link for an email campaign, where
|
|
7
|
+
there is no app session to prompt inside of. A promoter who scores 9–10 gets
|
|
8
|
+
the testimonial form inline on the same page. Needs `config.public_collection`
|
|
9
|
+
and `config.nps`.
|
|
10
|
+
- Moved the shareable-link buttons out of the dashboard nav and onto the
|
|
11
|
+
testimonial and NPS index pages, so each index links to its own public page
|
|
12
|
+
and the links survive a host `config.admin_layout`.
|
|
13
|
+
- Dropped the dismiss controls that could not work on the public pages (the
|
|
14
|
+
dialog ×, "Not now", and a Cancel button that did nothing); on the NPS page
|
|
15
|
+
Cancel now returns to the 0–10 scale instead.
|
|
16
|
+
- Fixed `dashboard.collection_page` and `dashboard.download_video`, which were
|
|
17
|
+
nested under `sources:` in every locale file while the views looked them up
|
|
18
|
+
under `dashboard:` — all 26 languages silently fell back to English.
|
|
19
|
+
- Added `bin/rails testimonials:seed_demo` and `Testimonials::Seeds`, idempotent
|
|
20
|
+
demo data with a real attached video, NPS responses, and prompt history.
|
|
21
|
+
|
|
22
|
+
## 0.7.5
|
|
23
|
+
|
|
24
|
+
- Moved the selected testimonial status and rating into the main metadata card,
|
|
25
|
+
removing the extra detail-pane header from the admin review view.
|
|
26
|
+
- Fixed the trusted publishing workflow by building and pushing the gem
|
|
27
|
+
directly with RubyGems OIDC credentials after the test suite passes.
|
|
28
|
+
|
|
3
29
|
## 0.7.4
|
|
4
30
|
|
|
5
31
|
- Added `config.admin_layout`, letting host apps render the testimonial and NPS
|
data/README.md
CHANGED
|
@@ -33,6 +33,16 @@ bin/rails db:migrate
|
|
|
33
33
|
The generator writes the initializer, the migration, and mounts the engine at
|
|
34
34
|
`/testimonials`. Nothing renders until the widget is opened.
|
|
35
35
|
|
|
36
|
+
Optional demo data:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bin/rails testimonials:seed_demo
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
It creates idempotent text testimonials, one approved video testimonial with a
|
|
43
|
+
bundled real MP4 attachment, three NPS responses, and prompt-history examples.
|
|
44
|
+
Running the task again refreshes those records instead of duplicating them.
|
|
45
|
+
|
|
36
46
|
> [!IMPORTANT]
|
|
37
47
|
> The dashboard defaults to **development only**. Set `authorize_admin` before
|
|
38
48
|
> you deploy — see [Configure](#configure).
|
|
@@ -46,7 +56,7 @@ Ruby >= 3.2 · Rails >= 7.1 · Active Storage only if you want video/avatar uplo
|
|
|
46
56
|
| **Widget** | iOS-style star prompt → rating, guiding questions, text, video, consent |
|
|
47
57
|
| **Video** | Recorded in-browser (MediaRecorder) with a review step, or uploaded |
|
|
48
58
|
| **NPS** | 0–10 + comment. Promoters routed into the testimonial ask |
|
|
49
|
-
| **Public
|
|
59
|
+
| **Public pages** | `/testimonials/new` and `/testimonials/nps/new` — shareable links |
|
|
50
60
|
| **Dashboard** | Pending → approved → archived, search, feature toggle, best-line picker |
|
|
51
61
|
| **Display** | Headless. Your markup, via the models or a JSON API |
|
|
52
62
|
| **Deps** | None. Plain JS — no Tailwind, no Stimulus, no importmap, no build step |
|
|
@@ -135,7 +145,7 @@ Everything is optional — a fresh install works with zero config. In
|
|
|
135
145
|
| `storage_service` | app default | Active Storage service for uploads (a `storage.yml` key) |
|
|
136
146
|
| `reprompt_after` | `90.days` | Cooldown after a dismissal |
|
|
137
147
|
| `max_prompts` | `3` | Lifetime auto-prompt cap per user |
|
|
138
|
-
| `public_collection` | `true` | The shareable `/testimonials/new`
|
|
148
|
+
| `public_collection` | `true` | The shareable `/testimonials/new` and `/testimonials/nps/new` pages |
|
|
139
149
|
| `public_api` | `false` | Serve the read API without auth (CORS `*`) |
|
|
140
150
|
| `nps` | `true` | The 0–10 NPS flow |
|
|
141
151
|
| `nps_reprompt_after` | `90.days` | Cooldown between NPS asks |
|
|
@@ -231,11 +241,21 @@ throttle would allow it. Detractors (0–6) trigger `on_detractor`, which pairs
|
|
|
231
241
|
well with [ideasbugs](https://github.com/yshmarov/ideasbugs). Your score and
|
|
232
242
|
every response live at `/testimonials/nps_responses`.
|
|
233
243
|
|
|
234
|
-
|
|
244
|
+
`/testimonials/nps/new` is the same question on its own page — the link for an
|
|
245
|
+
email campaign, where there is no app session to prompt inside of. A promoter
|
|
246
|
+
who scores 9–10 gets the testimonial form right there on the page.
|
|
247
|
+
|
|
248
|
+
## The public pages
|
|
249
|
+
|
|
250
|
+
Two standalone, self-styled pages for people outside the app — drop either link
|
|
251
|
+
into an email or DM:
|
|
252
|
+
|
|
253
|
+
| | |
|
|
254
|
+
| --- | --- |
|
|
255
|
+
| `/testimonials/new` | Leave a testimonial: name, email, optional title/company and photo |
|
|
256
|
+
| `/testimonials/nps/new` | Score 0–10 with an optional comment (needs `config.nps`) |
|
|
235
257
|
|
|
236
|
-
|
|
237
|
-
app — drop the link into an email or DM. Guests leave name, email, optional
|
|
238
|
-
title/company and photo. Disable with `config.public_collection = false`.
|
|
258
|
+
Disable both with `config.public_collection = false`.
|
|
239
259
|
|
|
240
260
|
## Multi-tenancy
|
|
241
261
|
|
|
@@ -1,21 +1,35 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Testimonials
|
|
4
|
-
# The standalone public
|
|
5
|
-
#
|
|
6
|
-
#
|
|
4
|
+
# The standalone public pages — the links you drop into an email or DM so
|
|
5
|
+
# people outside the app can answer: "#{mount_path}/new" for a testimonial,
|
|
6
|
+
# "#{mount_path}/nps/new" for the 0–10 score. Both are toggled by
|
|
7
|
+
# config.public_collection (ON by default); the NPS one also needs
|
|
8
|
+
# config.nps.
|
|
7
9
|
class CollectionController < ApplicationController
|
|
8
10
|
layout 'testimonials/collection'
|
|
11
|
+
before_action :require_public_collection
|
|
9
12
|
|
|
10
13
|
def show
|
|
11
|
-
head :not_found and return unless Testimonials.config.public_collection
|
|
12
|
-
head :forbidden and return unless Testimonials.enabled?(request)
|
|
13
|
-
|
|
14
14
|
# A signed-in visitor edits their existing review (in this tenant)
|
|
15
15
|
# instead of adding one.
|
|
16
16
|
@existing = current_author_id &&
|
|
17
17
|
Testimonial.for_tenant(current_tenant)
|
|
18
18
|
.where(author_id: current_author_id.to_s).newest_first.first
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
# The same widget code, opened straight onto the NPS card. A promoter is
|
|
22
|
+
# offered the testimonial form right after scoring, inline on this page.
|
|
23
|
+
def nps
|
|
24
|
+
head :not_found unless Testimonials.config.nps
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def require_public_collection
|
|
30
|
+
head :not_found and return unless Testimonials.config.public_collection
|
|
31
|
+
|
|
32
|
+
head :forbidden unless Testimonials.enabled?(request)
|
|
33
|
+
end
|
|
20
34
|
end
|
|
21
35
|
end
|
|
@@ -21,13 +21,8 @@
|
|
|
21
21
|
<%= link_to t('testimonials.dashboard.nps', default: 'NPS'), nps_responses_path,
|
|
22
22
|
class: ('active' if controller_name == 'nps_responses') %>
|
|
23
23
|
<% end %>
|
|
24
|
-
<%# The shareable
|
|
25
|
-
|
|
26
|
-
<a class="button share-link" href="<%= collection_url %>" target="_blank" rel="noopener"
|
|
27
|
-
title="<%= collection_url %>">
|
|
28
|
-
🔗 <%= t('testimonials.dashboard.collection_page', default: 'Ask for testimonials') %>
|
|
29
|
-
</a>
|
|
30
|
-
<% end %>
|
|
24
|
+
<%# The shareable links live on the index pages themselves, next to the
|
|
25
|
+
heading — a host admin_layout replaces this nav, not those. %>
|
|
31
26
|
</div>
|
|
32
27
|
<%= yield %>
|
|
33
28
|
</div>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
|
-
|
|
4
|
+
<%# Each page sets its own <title> via content_for; the testimonial page keeps the default. %>
|
|
5
|
+
<title><%= content_for?(:title) ? yield(:title) : t('testimonials.page.title', app: Testimonials.app_name, default: "Share your experience with #{Testimonials.app_name}") %></title>
|
|
5
6
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
7
|
<%= csrf_meta_tags %>
|
|
7
8
|
<%= csp_meta_tag %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<% content_for :title, t('testimonials.page.nps_title', app: Testimonials.app_name,
|
|
2
|
+
default: "Help us improve #{Testimonials.app_name}") %>
|
|
3
|
+
|
|
4
|
+
<h1><%= yield(:title) %></h1>
|
|
5
|
+
<p class="subtitle"><%= t('testimonials.page.nps_subtitle', default: 'One quick question — it takes ten seconds.') %></p>
|
|
6
|
+
|
|
7
|
+
<div data-testimonials-inline></div>
|
|
8
|
+
|
|
9
|
+
<%= Testimonials::Widget.snippet(
|
|
10
|
+
locale: I18n.locale,
|
|
11
|
+
authenticated: Testimonials.config.current_user.call(request).present?,
|
|
12
|
+
mode: 'nps_page',
|
|
13
|
+
nonce: (content_security_policy_nonce if respond_to?(:content_security_policy_nonce))
|
|
14
|
+
).html_safe %>
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
<% content_for :body_class, 'tm-nps-index' %>
|
|
2
2
|
|
|
3
|
-
<
|
|
3
|
+
<div class="page-head">
|
|
4
|
+
<h1><%= t('testimonials.dashboard.nps', default: 'NPS') %></h1>
|
|
5
|
+
<%# The shareable NPS page, same idea as the testimonial one. This dashboard
|
|
6
|
+
still reads history when config.nps is off, but that page 404s — so the
|
|
7
|
+
link needs both switches. %>
|
|
8
|
+
<% if Testimonials.config.public_collection && Testimonials.config.nps %>
|
|
9
|
+
<a class="button share-link" href="<%= nps_collection_url %>" target="_blank" rel="noopener"
|
|
10
|
+
title="<%= nps_collection_url %>">
|
|
11
|
+
🔗 <%= t('testimonials.dashboard.nps_page', default: 'Ask for NPS scores') %>
|
|
12
|
+
</a>
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
4
15
|
|
|
5
16
|
<div class="stat-row">
|
|
6
17
|
<div class="stat">
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
<section class="testimonial-panel">
|
|
2
|
-
<div class="panel-head">
|
|
3
|
-
<h1 class="title-row">
|
|
4
|
-
<span class="badge status-<%= testimonial.status %>">
|
|
5
|
-
<%= t("testimonials.statuses.#{testimonial.status}", default: testimonial.status.humanize) %>
|
|
6
|
-
</span>
|
|
7
|
-
<% if testimonial.featured? %>
|
|
8
|
-
<span class="badge status-approved">⭐ <%= t('testimonials.dashboard.featured', default: 'Featured') %></span>
|
|
9
|
-
<% end %>
|
|
10
|
-
<% if testimonial.rating %>
|
|
11
|
-
<span class="stars"><%= '★' * testimonial.rating %><span class="off"><%= '★' * (5 - testimonial.rating) %></span></span>
|
|
12
|
-
<% end %>
|
|
13
|
-
<span class="case-id">#<%= testimonial.id %></span>
|
|
14
|
-
</h1>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
2
|
<div class="detail-scroll">
|
|
18
3
|
<div class="card pad">
|
|
19
4
|
<dl>
|
|
5
|
+
<dt><%= t('testimonials.dashboard.testimonial', default: 'Testimonial') %></dt>
|
|
6
|
+
<dd><span class="case-id">#<%= testimonial.id %></span></dd>
|
|
7
|
+
<dt><%= t('testimonials.dashboard.status', default: 'Status') %></dt>
|
|
8
|
+
<dd>
|
|
9
|
+
<span class="badge status-<%= testimonial.status %>">
|
|
10
|
+
<%= t("testimonials.statuses.#{testimonial.status}", default: testimonial.status.humanize) %>
|
|
11
|
+
</span>
|
|
12
|
+
<% if testimonial.featured? %>
|
|
13
|
+
<span class="badge status-approved"><%= t('testimonials.dashboard.featured', default: 'Featured') %></span>
|
|
14
|
+
<% end %>
|
|
15
|
+
</dd>
|
|
16
|
+
<% if testimonial.rating %>
|
|
17
|
+
<dt><%= t('testimonials.dashboard.rating', default: 'Rating') %></dt>
|
|
18
|
+
<dd><span class="stars"><%= '★' * testimonial.rating %><span class="off"><%= '★' * (5 - testimonial.rating) %></span></span></dd>
|
|
19
|
+
<% end %>
|
|
20
20
|
<dt><%= t('testimonials.dashboard.from', default: 'From') %></dt>
|
|
21
21
|
<dd>
|
|
22
22
|
<% if testimonial.avatar_attached? %>
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
<% content_for :body_class, 'tm-index' %>
|
|
2
2
|
|
|
3
|
-
<
|
|
3
|
+
<div class="page-head">
|
|
4
|
+
<h1><%= t('testimonials.dashboard.title', default: 'Testimonials') %></h1>
|
|
5
|
+
<%# The shareable public form — drop this link into an email or DM. It lives
|
|
6
|
+
on the page, not in the nav, so it survives a host's admin_layout. %>
|
|
7
|
+
<% if Testimonials.config.public_collection %>
|
|
8
|
+
<a class="button share-link" href="<%= collection_url %>" target="_blank" rel="noopener"
|
|
9
|
+
title="<%= collection_url %>">
|
|
10
|
+
🔗 <%= t('testimonials.dashboard.collection_page', default: 'Ask for testimonials') %>
|
|
11
|
+
</a>
|
|
12
|
+
<% end %>
|
|
13
|
+
</div>
|
|
4
14
|
|
|
5
15
|
<div class="dashboard-shell <%= 'has-selected' if @selected_testimonial %>">
|
|
6
16
|
<aside class="dashboard-sidebar" aria-label="<%= t('testimonials.dashboard.testimonials', default: 'Testimonials') %>">
|
|
@@ -50,6 +50,8 @@ ar:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "شارك تجربتك مع %{app}"
|
|
52
52
|
subtitle: "كلماتك تساعد الآخرين على اتخاذ القرار — شكرًا لك!"
|
|
53
|
+
nps_title: "ساعدنا في تحسين %{app}"
|
|
54
|
+
nps_subtitle: "سؤال سريع واحد — يستغرق عشر ثوانٍ."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "نص"
|
|
55
57
|
video: "فيديو"
|
|
@@ -57,8 +59,6 @@ ar:
|
|
|
57
59
|
widget: "أداة داخل التطبيق"
|
|
58
60
|
page: "صفحة الجمع"
|
|
59
61
|
nps: "متابعة NPS"
|
|
60
|
-
collection_page: "اطلب شهادات"
|
|
61
|
-
download_video: "تنزيل الفيديو"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "قيد الانتظار"
|
|
64
64
|
approved: "معتمد"
|
|
@@ -66,6 +66,9 @@ ar:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "اطلب درجات NPS"
|
|
70
|
+
collection_page: "اطلب شهادات"
|
|
71
|
+
download_video: "تنزيل الفيديو"
|
|
69
72
|
all_kinds: "كل الأنواع"
|
|
70
73
|
search: "بحث"
|
|
71
74
|
search_placeholder: "ابحث في النص والاسم والبريد…"
|
|
@@ -50,6 +50,8 @@ bg:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Споделете опита си с %{app}"
|
|
52
52
|
subtitle: "Вашите думи помагат на другите да решат — благодарим!"
|
|
53
|
+
nps_title: "Помогнете ни да подобрим %{app}"
|
|
54
|
+
nps_subtitle: "Един бърз въпрос — отнема десет секунди."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Текст"
|
|
55
57
|
video: "Видео"
|
|
@@ -57,8 +59,6 @@ bg:
|
|
|
57
59
|
widget: "Уиджет в приложението"
|
|
58
60
|
page: "Страница за събиране"
|
|
59
61
|
nps: "Продължение след NPS"
|
|
60
|
-
collection_page: "Поискайте отзиви"
|
|
61
|
-
download_video: "Изтегляне на видеото"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Чакащи"
|
|
64
64
|
approved: "Одобрени"
|
|
@@ -66,6 +66,9 @@ bg:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Поискайте NPS оценки"
|
|
70
|
+
collection_page: "Поискайте отзиви"
|
|
71
|
+
download_video: "Изтегляне на видеото"
|
|
69
72
|
all_kinds: "Всички видове"
|
|
70
73
|
search: "Търсене"
|
|
71
74
|
search_placeholder: "Търсете текст, име, имейл…"
|
|
@@ -50,6 +50,8 @@ bn:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "%{app} নিয়ে আপনার অভিজ্ঞতা শেয়ার করুন"
|
|
52
52
|
subtitle: "আপনার কথা অন্যদের সিদ্ধান্ত নিতে সাহায্য করে — ধন্যবাদ!"
|
|
53
|
+
nps_title: "%{app} উন্নত করতে আমাদের সাহায্য করুন"
|
|
54
|
+
nps_subtitle: "একটি ছোট প্রশ্ন — দশ সেকেন্ড লাগবে।"
|
|
53
55
|
kinds:
|
|
54
56
|
text: "লেখা"
|
|
55
57
|
video: "ভিডিও"
|
|
@@ -57,8 +59,6 @@ bn:
|
|
|
57
59
|
widget: "অ্যাপের ভেতরের উইজেট"
|
|
58
60
|
page: "সংগ্রহ পাতা"
|
|
59
61
|
nps: "NPS ফলো-আপ"
|
|
60
|
-
collection_page: "প্রশংসাপত্র চান"
|
|
61
|
-
download_video: "ভিডিও ডাউনলোড করুন"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "অপেক্ষমাণ"
|
|
64
64
|
approved: "অনুমোদিত"
|
|
@@ -66,6 +66,9 @@ bn:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "NPS স্কোর চান"
|
|
70
|
+
collection_page: "প্রশংসাপত্র চান"
|
|
71
|
+
download_video: "ভিডিও ডাউনলোড করুন"
|
|
69
72
|
all_kinds: "সব ধরন"
|
|
70
73
|
search: "খুঁজুন"
|
|
71
74
|
search_placeholder: "লেখা, নাম, ইমেইল খুঁজুন…"
|
|
@@ -50,6 +50,8 @@ de:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Teilen Sie Ihre Erfahrung mit %{app}"
|
|
52
52
|
subtitle: "Ihre Worte helfen anderen bei der Entscheidung — danke!"
|
|
53
|
+
nps_title: "Helfen Sie uns, %{app} zu verbessern"
|
|
54
|
+
nps_subtitle: "Eine kurze Frage — dauert zehn Sekunden."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Text"
|
|
55
57
|
video: "Video"
|
|
@@ -57,8 +59,6 @@ de:
|
|
|
57
59
|
widget: "In-App-Widget"
|
|
58
60
|
page: "Sammelseite"
|
|
59
61
|
nps: "NPS-Nachfrage"
|
|
60
|
-
collection_page: "Um Erfahrungsberichte bitten"
|
|
61
|
-
download_video: "Video herunterladen"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Ausstehend"
|
|
64
64
|
approved: "Freigegeben"
|
|
@@ -66,6 +66,9 @@ de:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Nach NPS-Bewertungen fragen"
|
|
70
|
+
collection_page: "Um Erfahrungsberichte bitten"
|
|
71
|
+
download_video: "Video herunterladen"
|
|
69
72
|
all_kinds: "Alle Arten"
|
|
70
73
|
search: "Suchen"
|
|
71
74
|
search_placeholder: "Text, Name, E-Mail durchsuchen…"
|
|
@@ -50,6 +50,8 @@ el:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Μοιραστείτε την εμπειρία σας με το %{app}"
|
|
52
52
|
subtitle: "Τα λόγια σας βοηθούν άλλους να αποφασίσουν — ευχαριστούμε!"
|
|
53
|
+
nps_title: "Βοηθήστε μας να βελτιώσουμε το %{app}"
|
|
54
|
+
nps_subtitle: "Μία γρήγορη ερώτηση — παίρνει δέκα δευτερόλεπτα."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Κείμενο"
|
|
55
57
|
video: "Βίντεο"
|
|
@@ -57,8 +59,6 @@ el:
|
|
|
57
59
|
widget: "Widget εντός εφαρμογής"
|
|
58
60
|
page: "Σελίδα συλλογής"
|
|
59
61
|
nps: "Συνέχεια NPS"
|
|
60
|
-
collection_page: "Ζητήστε μαρτυρίες"
|
|
61
|
-
download_video: "Λήψη βίντεο"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Σε εκκρεμότητα"
|
|
64
64
|
approved: "Εγκεκριμένο"
|
|
@@ -66,6 +66,9 @@ el:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Ζητήστε βαθμολογίες NPS"
|
|
70
|
+
collection_page: "Ζητήστε μαρτυρίες"
|
|
71
|
+
download_video: "Λήψη βίντεο"
|
|
69
72
|
all_kinds: "Όλα τα είδη"
|
|
70
73
|
search: "Αναζήτηση"
|
|
71
74
|
search_placeholder: "Αναζήτηση κειμένου, ονόματος, email…"
|
|
@@ -50,6 +50,8 @@ en:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Share your experience with %{app}"
|
|
52
52
|
subtitle: "Your words help others decide — thank you!"
|
|
53
|
+
nps_title: "Help us improve %{app}"
|
|
54
|
+
nps_subtitle: "One quick question — it takes ten seconds."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Text"
|
|
55
57
|
video: "Video"
|
|
@@ -57,8 +59,6 @@ en:
|
|
|
57
59
|
widget: "In-app widget"
|
|
58
60
|
page: "Collection page"
|
|
59
61
|
nps: "NPS follow-up"
|
|
60
|
-
collection_page: "Ask for testimonials"
|
|
61
|
-
download_video: "Download video"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Pending"
|
|
64
64
|
approved: "Approved"
|
|
@@ -66,6 +66,9 @@ en:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Ask for NPS scores"
|
|
70
|
+
collection_page: "Ask for testimonials"
|
|
71
|
+
download_video: "Download video"
|
|
69
72
|
all_kinds: "All kinds"
|
|
70
73
|
search: "Search"
|
|
71
74
|
search_placeholder: "Search text, name, email…"
|
|
@@ -50,6 +50,8 @@ es:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Comparte tu experiencia con %{app}"
|
|
52
52
|
subtitle: "Tus palabras ayudan a otros a decidirse — ¡gracias!"
|
|
53
|
+
nps_title: "Ayúdanos a mejorar %{app}"
|
|
54
|
+
nps_subtitle: "Una pregunta rápida — tarda diez segundos."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Texto"
|
|
55
57
|
video: "Vídeo"
|
|
@@ -57,8 +59,6 @@ es:
|
|
|
57
59
|
widget: "Widget in-app"
|
|
58
60
|
page: "Página de recogida"
|
|
59
61
|
nps: "Seguimiento NPS"
|
|
60
|
-
collection_page: "Pedir testimonios"
|
|
61
|
-
download_video: "Descargar el vídeo"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Pendiente"
|
|
64
64
|
approved: "Aprobado"
|
|
@@ -66,6 +66,9 @@ es:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Pedir puntuaciones NPS"
|
|
70
|
+
collection_page: "Pedir testimonios"
|
|
71
|
+
download_video: "Descargar el vídeo"
|
|
69
72
|
all_kinds: "Todos los tipos"
|
|
70
73
|
search: "Buscar"
|
|
71
74
|
search_placeholder: "Buscar texto, nombre, correo…"
|
|
@@ -50,6 +50,8 @@ fr:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Partagez votre expérience avec %{app}"
|
|
52
52
|
subtitle: "Vos mots aident les autres à se décider — merci !"
|
|
53
|
+
nps_title: "Aidez-nous à améliorer %{app}"
|
|
54
|
+
nps_subtitle: "Une question rapide — dix secondes suffisent."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Texte"
|
|
55
57
|
video: "Vidéo"
|
|
@@ -57,8 +59,6 @@ fr:
|
|
|
57
59
|
widget: "Widget in-app"
|
|
58
60
|
page: "Page de collecte"
|
|
59
61
|
nps: "Suite NPS"
|
|
60
|
-
collection_page: "Demander des témoignages"
|
|
61
|
-
download_video: "Télécharger la vidéo"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "En attente"
|
|
64
64
|
approved: "Approuvé"
|
|
@@ -66,6 +66,9 @@ fr:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Demander des scores NPS"
|
|
70
|
+
collection_page: "Demander des témoignages"
|
|
71
|
+
download_video: "Télécharger la vidéo"
|
|
69
72
|
all_kinds: "Tous les types"
|
|
70
73
|
search: "Rechercher"
|
|
71
74
|
search_placeholder: "Rechercher texte, nom, e-mail…"
|
|
@@ -50,6 +50,8 @@ hi:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "%{app} के साथ अपना अनुभव साझा करें"
|
|
52
52
|
subtitle: "आपके शब्द दूसरों को निर्णय लेने में मदद करते हैं — धन्यवाद!"
|
|
53
|
+
nps_title: "%{app} को बेहतर बनाने में हमारी मदद करें"
|
|
54
|
+
nps_subtitle: "एक छोटा सवाल — दस सेकंड लगेंगे।"
|
|
53
55
|
kinds:
|
|
54
56
|
text: "टेक्स्ट"
|
|
55
57
|
video: "वीडियो"
|
|
@@ -57,8 +59,6 @@ hi:
|
|
|
57
59
|
widget: "इन-ऐप विजेट"
|
|
58
60
|
page: "संग्रह पृष्ठ"
|
|
59
61
|
nps: "NPS फ़ॉलो-अप"
|
|
60
|
-
collection_page: "प्रशंसापत्र माँगें"
|
|
61
|
-
download_video: "वीडियो डाउनलोड करें"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "लंबित"
|
|
64
64
|
approved: "स्वीकृत"
|
|
@@ -66,6 +66,9 @@ hi:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "NPS स्कोर मांगें"
|
|
70
|
+
collection_page: "प्रशंसापत्र माँगें"
|
|
71
|
+
download_video: "वीडियो डाउनलोड करें"
|
|
69
72
|
all_kinds: "सभी प्रकार"
|
|
70
73
|
search: "खोजें"
|
|
71
74
|
search_placeholder: "टेक्स्ट, नाम, ईमेल खोजें…"
|
|
@@ -50,6 +50,8 @@ hr:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Podijelite svoje iskustvo s %{app}"
|
|
52
52
|
subtitle: "Vaše riječi pomažu drugima da se odluče — hvala!"
|
|
53
|
+
nps_title: "Pomozite nam poboljšati %{app}"
|
|
54
|
+
nps_subtitle: "Jedno kratko pitanje — traje deset sekundi."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Tekst"
|
|
55
57
|
video: "Video"
|
|
@@ -57,8 +59,6 @@ hr:
|
|
|
57
59
|
widget: "Widget u aplikaciji"
|
|
58
60
|
page: "Stranica za prikupljanje"
|
|
59
61
|
nps: "NPS nastavak"
|
|
60
|
-
collection_page: "Zatražite osvrte"
|
|
61
|
-
download_video: "Preuzmi video"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Na čekanju"
|
|
64
64
|
approved: "Odobreno"
|
|
@@ -66,6 +66,9 @@ hr:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Zatraži NPS ocjene"
|
|
70
|
+
collection_page: "Zatražite osvrte"
|
|
71
|
+
download_video: "Preuzmi video"
|
|
69
72
|
all_kinds: "Sve vrste"
|
|
70
73
|
search: "Traži"
|
|
71
74
|
search_placeholder: "Pretraži tekst, ime, e-mail…"
|
|
@@ -50,6 +50,8 @@ id:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Bagikan pengalaman Anda dengan %{app}"
|
|
52
52
|
subtitle: "Kata-kata Anda membantu orang lain memutuskan — terima kasih!"
|
|
53
|
+
nps_title: "Bantu kami menyempurnakan %{app}"
|
|
54
|
+
nps_subtitle: "Satu pertanyaan singkat — hanya sepuluh detik."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Teks"
|
|
55
57
|
video: "Video"
|
|
@@ -57,8 +59,6 @@ id:
|
|
|
57
59
|
widget: "Widget dalam aplikasi"
|
|
58
60
|
page: "Halaman pengumpulan"
|
|
59
61
|
nps: "Tindak lanjut NPS"
|
|
60
|
-
collection_page: "Minta testimoni"
|
|
61
|
-
download_video: "Unduh video"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "Menunggu"
|
|
64
64
|
approved: "Disetujui"
|
|
@@ -66,6 +66,9 @@ id:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Minta skor NPS"
|
|
70
|
+
collection_page: "Minta testimoni"
|
|
71
|
+
download_video: "Unduh video"
|
|
69
72
|
all_kinds: "Semua jenis"
|
|
70
73
|
search: "Cari"
|
|
71
74
|
search_placeholder: "Cari teks, nama, email…"
|
|
@@ -50,6 +50,8 @@ it:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "Racconta la tua esperienza con %{app}"
|
|
52
52
|
subtitle: "Le tue parole aiutano gli altri a decidere — grazie!"
|
|
53
|
+
nps_title: "Aiutaci a migliorare %{app}"
|
|
54
|
+
nps_subtitle: "Una domanda veloce — dieci secondi."
|
|
53
55
|
kinds:
|
|
54
56
|
text: "Testo"
|
|
55
57
|
video: "Video"
|
|
@@ -57,8 +59,6 @@ it:
|
|
|
57
59
|
widget: "Widget in-app"
|
|
58
60
|
page: "Pagina di raccolta"
|
|
59
61
|
nps: "Follow-up NPS"
|
|
60
|
-
collection_page: "Chiedi testimonianze"
|
|
61
|
-
download_video: "Scarica il video"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "In attesa"
|
|
64
64
|
approved: "Approvato"
|
|
@@ -66,6 +66,9 @@ it:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "Chiedi punteggi NPS"
|
|
70
|
+
collection_page: "Chiedi testimonianze"
|
|
71
|
+
download_video: "Scarica il video"
|
|
69
72
|
all_kinds: "Tutti i tipi"
|
|
70
73
|
search: "Cerca"
|
|
71
74
|
search_placeholder: "Cerca testo, nome, email…"
|
|
@@ -50,6 +50,8 @@ ja:
|
|
|
50
50
|
page:
|
|
51
51
|
title: "%{app}の体験を共有してください"
|
|
52
52
|
subtitle: "あなたの言葉が他の方の判断を助けます — ありがとうございます!"
|
|
53
|
+
nps_title: "%{app} の改善にご協力ください"
|
|
54
|
+
nps_subtitle: "質問はひとつだけ — 10秒で終わります。"
|
|
53
55
|
kinds:
|
|
54
56
|
text: "テキスト"
|
|
55
57
|
video: "動画"
|
|
@@ -57,8 +59,6 @@ ja:
|
|
|
57
59
|
widget: "アプリ内ウィジェット"
|
|
58
60
|
page: "収集ページ"
|
|
59
61
|
nps: "NPSフォローアップ"
|
|
60
|
-
collection_page: "お客様の声を募集"
|
|
61
|
-
download_video: "動画をダウンロード"
|
|
62
62
|
statuses:
|
|
63
63
|
pending: "保留中"
|
|
64
64
|
approved: "承認済み"
|
|
@@ -66,6 +66,9 @@ ja:
|
|
|
66
66
|
dashboard:
|
|
67
67
|
title: "Testimonials"
|
|
68
68
|
nps: "NPS"
|
|
69
|
+
nps_page: "NPSスコアを依頼"
|
|
70
|
+
collection_page: "お客様の声を募集"
|
|
71
|
+
download_video: "動画をダウンロード"
|
|
69
72
|
all_kinds: "すべての種類"
|
|
70
73
|
search: "検索"
|
|
71
74
|
search_placeholder: "テキスト・名前・メールを検索…"
|