shopify_app 9.0.0 → 13.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -2
- data/CHANGELOG.md +159 -0
- data/README.md +221 -130
- data/app/assets/javascripts/shopify_app/itp_helper.js +6 -6
- data/app/assets/javascripts/shopify_app/storage_access.js +36 -7
- data/app/controllers/concerns/shopify_app/authenticated.rb +2 -2
- data/app/controllers/shopify_app/callback_controller.rb +20 -7
- data/app/controllers/shopify_app/extension_verification_controller.rb +20 -0
- data/app/controllers/shopify_app/sessions_controller.rb +71 -22
- data/app/views/shopify_app/sessions/enable_cookies.html.erb +3 -1
- data/app/views/shopify_app/sessions/request_storage_access.html.erb +2 -1
- data/app/views/shopify_app/sessions/top_level_interaction.html.erb +1 -0
- data/app/views/shopify_app/shared/redirect.html.erb +1 -0
- data/config/locales/cs.yml +23 -0
- data/config/locales/da.yml +20 -0
- data/config/locales/de.yml +5 -5
- data/config/locales/en.yml +1 -1
- data/config/locales/es.yml +3 -3
- data/config/locales/fi.yml +20 -0
- data/config/locales/fr.yml +3 -3
- data/config/locales/hi.yml +23 -0
- data/config/locales/it.yml +2 -3
- data/config/locales/ja.yml +1 -1
- data/config/locales/ko.yml +19 -0
- data/config/locales/ms.yml +22 -0
- data/config/locales/nb.yml +21 -0
- data/config/locales/nl.yml +3 -3
- data/config/locales/pl.yml +21 -0
- data/config/locales/pt-BR.yml +9 -10
- data/config/locales/pt-PT.yml +22 -0
- data/config/locales/sv.yml +21 -0
- data/config/locales/th.yml +20 -0
- data/config/locales/tr.yml +22 -0
- data/config/locales/zh-CN.yml +3 -3
- data/config/locales/zh-TW.yml +1 -2
- data/docs/Quickstart.md +44 -16
- data/docs/Releasing.md +0 -1
- data/docs/install-on-dev-shop.png +0 -0
- data/docs/test-your-app.png +0 -0
- data/karma.conf.js +1 -0
- data/lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb +2 -2
- data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +39 -0
- data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +62 -0
- data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +0 -6
- data/lib/generators/shopify_app/home_controller/templates/index.html.erb +1 -1
- data/lib/generators/shopify_app/install/install_generator.rb +27 -11
- data/lib/generators/shopify_app/install/templates/_flash_messages.html.erb +1 -17
- data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +11 -10
- data/lib/generators/shopify_app/install/templates/flash_messages.js +26 -0
- data/lib/generators/shopify_app/install/templates/shopify_app.js +15 -0
- data/lib/generators/shopify_app/install/templates/shopify_app.rb +6 -3
- data/lib/generators/shopify_app/install/templates/shopify_app_index.js +2 -0
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb +1 -0
- data/lib/generators/shopify_app/install/templates/user_agent.rb +5 -0
- data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +1 -1
- data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -1
- data/lib/generators/shopify_app/user_model/templates/db/migrate/create_users.erb +16 -0
- data/lib/generators/shopify_app/user_model/templates/user.rb +7 -0
- data/lib/generators/shopify_app/user_model/templates/users.yml +4 -0
- data/lib/generators/shopify_app/user_model/user_model_generator.rb +38 -0
- data/lib/shopify_app/configuration.rb +22 -10
- data/lib/shopify_app/controller_concerns/login_protection.rb +66 -15
- data/lib/shopify_app/engine.rb +4 -0
- data/lib/shopify_app/managers/webhooks_manager.rb +1 -1
- data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +33 -0
- data/lib/shopify_app/session/in_memory_session_store.rb +1 -1
- data/lib/shopify_app/session/in_memory_shop_session_store.rb +4 -0
- data/lib/shopify_app/session/in_memory_user_session_store.rb +4 -0
- data/lib/shopify_app/session/session_repository.rb +38 -13
- data/lib/shopify_app/session/session_storage.rb +0 -22
- data/lib/shopify_app/session/shop_session_storage.rb +30 -0
- data/lib/shopify_app/session/user_session_storage.rb +31 -0
- data/lib/shopify_app/utils.rb +7 -0
- data/lib/shopify_app/version.rb +1 -1
- data/lib/shopify_app.rb +48 -29
- data/package-lock.json +7227 -5
- data/package.json +9 -9
- data/service.yml +1 -1
- data/shopify_app.gemspec +10 -5
- data/translation.yml +1 -1
- data/yarn.lock +2555 -1886
- metadata +117 -19
- data/lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb +0 -7
@@ -8,6 +8,11 @@ module ShopifyApp
|
|
8
8
|
def callback
|
9
9
|
if auth_hash
|
10
10
|
login_shop
|
11
|
+
|
12
|
+
if ShopifyApp::SessionRepository.user_storage.present? && user_session.blank?
|
13
|
+
return redirect_to(login_url_with_optional_shop)
|
14
|
+
end
|
15
|
+
|
11
16
|
install_webhooks
|
12
17
|
install_scripttags
|
13
18
|
perform_after_authenticate_job
|
@@ -15,7 +20,7 @@ module ShopifyApp
|
|
15
20
|
redirect_to return_address
|
16
21
|
else
|
17
22
|
flash[:error] = I18n.t('could_not_log_in')
|
18
|
-
redirect_to
|
23
|
+
redirect_to(login_url_with_optional_shop)
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
@@ -56,9 +61,14 @@ module ShopifyApp
|
|
56
61
|
api_version: ShopifyApp.configuration.api_version
|
57
62
|
)
|
58
63
|
|
59
|
-
session[:shopify] = ShopifyApp::SessionRepository.store(session_store)
|
60
|
-
session[:shopify_domain] = shop_name
|
61
64
|
session[:shopify_user] = associated_user
|
65
|
+
if session[:shopify_user].present?
|
66
|
+
session[:user_id] = ShopifyApp::SessionRepository.store_user_session(session_store, associated_user)
|
67
|
+
else
|
68
|
+
session[:shop_id] = ShopifyApp::SessionRepository.store_shop_session(session_store)
|
69
|
+
end
|
70
|
+
session[:shopify_domain] = shop_name
|
71
|
+
session[:user_session] = auth_hash&.extra&.session
|
62
72
|
end
|
63
73
|
|
64
74
|
def install_webhooks
|
@@ -66,7 +76,7 @@ module ShopifyApp
|
|
66
76
|
|
67
77
|
WebhooksManager.queue(
|
68
78
|
shop_name,
|
69
|
-
token,
|
79
|
+
shop_session&.token || user_session.token,
|
70
80
|
ShopifyApp.configuration.webhooks
|
71
81
|
)
|
72
82
|
end
|
@@ -76,7 +86,7 @@ module ShopifyApp
|
|
76
86
|
|
77
87
|
ScripttagsManager.queue(
|
78
88
|
shop_name,
|
79
|
-
token,
|
89
|
+
shop_session&.token || user_session.token,
|
80
90
|
ShopifyApp.configuration.scripttags
|
81
91
|
)
|
82
92
|
end
|
@@ -86,10 +96,13 @@ module ShopifyApp
|
|
86
96
|
|
87
97
|
return unless config && config[:job].present?
|
88
98
|
|
99
|
+
job = config[:job]
|
100
|
+
job = job.constantize if job.is_a?(String)
|
101
|
+
|
89
102
|
if config[:inline] == true
|
90
|
-
|
103
|
+
job.perform_now(shop_domain: session[:shopify_domain])
|
91
104
|
else
|
92
|
-
|
105
|
+
job.perform_later(shop_domain: session[:shopify_domain])
|
93
106
|
end
|
94
107
|
end
|
95
108
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ShopifyApp
|
4
|
+
class ExtensionVerificationController < ActionController::Base
|
5
|
+
protect_from_forgery with: :null_session
|
6
|
+
before_action :verify_request
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def verify_request
|
11
|
+
hmac_header = request.headers['HTTP_X_SHOPIFY_HMAC_SHA256']
|
12
|
+
request_body = request.body.read
|
13
|
+
secret = ShopifyApp.configuration.secret
|
14
|
+
digest = OpenSSL::Digest.new('sha256')
|
15
|
+
|
16
|
+
expected_hmac = Base64.strict_encode64(OpenSSL::HMAC.digest(digest, secret, request_body))
|
17
|
+
head(:unauthorized) unless ActiveSupport::SecurityUtils.secure_compare(expected_hmac, hmac_header)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -3,6 +3,7 @@ module ShopifyApp
|
|
3
3
|
include ShopifyApp::LoginProtection
|
4
4
|
|
5
5
|
layout false, only: :new
|
6
|
+
|
6
7
|
after_action only: [:new, :create] do |controller|
|
7
8
|
controller.response.headers.except!('X-Frame-Options')
|
8
9
|
end
|
@@ -16,36 +17,41 @@ module ShopifyApp
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def enable_cookies
|
19
|
-
return unless
|
20
|
+
return unless validate_shop_presence
|
20
21
|
|
21
22
|
render(:enable_cookies, layout: false, locals: {
|
22
23
|
does_not_have_storage_access_url: top_level_interaction_path(
|
23
|
-
shop: sanitized_shop_name
|
24
|
+
shop: sanitized_shop_name,
|
25
|
+
return_to: params[:return_to]
|
26
|
+
),
|
27
|
+
has_storage_access_url: login_url_with_optional_shop(top_level: true),
|
28
|
+
app_target_url: granted_storage_access_path(
|
29
|
+
shop: sanitized_shop_name,
|
30
|
+
return_to: params[:return_to]
|
24
31
|
),
|
25
|
-
|
26
|
-
app_home_url: granted_storage_access_path(shop: sanitized_shop_name),
|
27
|
-
current_shopify_domain: current_shopify_domain,
|
32
|
+
current_shopify_domain: current_shopify_domain
|
28
33
|
})
|
29
34
|
end
|
30
35
|
|
31
36
|
def top_level_interaction
|
32
|
-
@url =
|
33
|
-
|
37
|
+
@url = login_url_with_optional_shop(top_level: true)
|
38
|
+
validate_shop_presence
|
34
39
|
end
|
35
40
|
|
36
41
|
def granted_storage_access
|
37
|
-
return unless
|
42
|
+
return unless validate_shop_presence
|
38
43
|
|
39
44
|
session['shopify.granted_storage_access'] = true
|
40
45
|
|
41
|
-
|
42
|
-
|
46
|
+
copy_return_to_param_to_session
|
47
|
+
|
48
|
+
redirect_to(return_address_with_params({ shop: @shop }))
|
43
49
|
end
|
44
50
|
|
45
51
|
def destroy
|
46
52
|
reset_session
|
47
53
|
flash[:notice] = I18n.t('.logged_out')
|
48
|
-
redirect_to
|
54
|
+
redirect_to(login_url_with_optional_shop)
|
49
55
|
end
|
50
56
|
|
51
57
|
private
|
@@ -54,6 +60,10 @@ module ShopifyApp
|
|
54
60
|
return render_invalid_shop_error unless sanitized_shop_name.present?
|
55
61
|
session['shopify.omniauth_params'] = { shop: sanitized_shop_name }
|
56
62
|
|
63
|
+
copy_return_to_param_to_session
|
64
|
+
|
65
|
+
set_user_tokens_option
|
66
|
+
|
57
67
|
if user_agent_can_partition_cookies
|
58
68
|
authenticate_with_partitioning
|
59
69
|
else
|
@@ -77,11 +87,31 @@ module ShopifyApp
|
|
77
87
|
authenticate_in_context
|
78
88
|
else
|
79
89
|
set_top_level_oauth_cookie
|
80
|
-
|
90
|
+
enable_cookie_access
|
81
91
|
end
|
82
92
|
end
|
83
93
|
|
84
|
-
def
|
94
|
+
def set_user_tokens_option
|
95
|
+
if shop_session.blank?
|
96
|
+
session[:user_tokens] = false
|
97
|
+
return
|
98
|
+
end
|
99
|
+
|
100
|
+
session[:user_tokens] = ShopifyApp::SessionRepository.user_storage.present?
|
101
|
+
|
102
|
+
ShopifyAPI::Session.temp(
|
103
|
+
domain: shop_session.domain,
|
104
|
+
token: shop_session.token,
|
105
|
+
api_version: shop_session.api_version
|
106
|
+
) do
|
107
|
+
ShopifyAPI::Metafield.find(:token_validity_bogus_check)
|
108
|
+
end
|
109
|
+
rescue ActiveResource::UnauthorizedAccess
|
110
|
+
session[:user_tokens] = false
|
111
|
+
rescue StandardError
|
112
|
+
end
|
113
|
+
|
114
|
+
def validate_shop_presence
|
85
115
|
@shop = sanitized_shop_name
|
86
116
|
unless @shop
|
87
117
|
render_invalid_shop_error
|
@@ -91,17 +121,28 @@ module ShopifyApp
|
|
91
121
|
true
|
92
122
|
end
|
93
123
|
|
124
|
+
def copy_return_to_param_to_session
|
125
|
+
session[:return_to] = params[:return_to] if params[:return_to]
|
126
|
+
end
|
127
|
+
|
94
128
|
def render_invalid_shop_error
|
95
129
|
flash[:error] = I18n.t('invalid_shop_url')
|
96
130
|
redirect_to return_address
|
97
131
|
end
|
98
132
|
|
133
|
+
def enable_cookie_access
|
134
|
+
fullpage_redirect_to(enable_cookies_path(
|
135
|
+
shop: sanitized_shop_name,
|
136
|
+
return_to: session[:return_to]
|
137
|
+
))
|
138
|
+
end
|
139
|
+
|
99
140
|
def authenticate_in_context
|
100
141
|
redirect_to "#{main_app.root_path}auth/shopify"
|
101
142
|
end
|
102
143
|
|
103
144
|
def authenticate_at_top_level
|
104
|
-
fullpage_redirect_to
|
145
|
+
fullpage_redirect_to(login_url_with_optional_shop(top_level: true))
|
105
146
|
end
|
106
147
|
|
107
148
|
def authenticate_in_context?
|
@@ -119,14 +160,22 @@ module ShopifyApp
|
|
119
160
|
end
|
120
161
|
|
121
162
|
def redirect_to_request_storage_access
|
122
|
-
render
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
163
|
+
render(
|
164
|
+
:request_storage_access,
|
165
|
+
layout: false,
|
166
|
+
locals: {
|
167
|
+
does_not_have_storage_access_url: top_level_interaction_path(
|
168
|
+
shop: sanitized_shop_name,
|
169
|
+
return_to: session[:return_to]
|
170
|
+
),
|
171
|
+
has_storage_access_url: login_url_with_optional_shop(top_level: true),
|
172
|
+
app_target_url: granted_storage_access_path(
|
173
|
+
shop: sanitized_shop_name,
|
174
|
+
return_to: session[:return_to]
|
175
|
+
),
|
176
|
+
current_shopify_domain: current_shopify_domain
|
177
|
+
}
|
178
|
+
)
|
130
179
|
end
|
131
180
|
end
|
132
181
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html lang="<%= I18n.locale %>">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
5
6
|
<base target="_top">
|
6
7
|
<title>Redirecting…</title>
|
7
8
|
<%= render 'shopify_app/partials/layout_styles' %>
|
@@ -16,6 +17,7 @@
|
|
16
17
|
<script>
|
17
18
|
window.apiKey = "<%= ShopifyApp.configuration.api_key %>";
|
18
19
|
window.shopOrigin = "https://<%= @shop %>";
|
20
|
+
window.returnTo = "<%= params[:return_to] %>"
|
19
21
|
</script>
|
20
22
|
|
21
23
|
<%= javascript_include_tag('shopify_app/enable_cookies', crossorigin: 'anonymous', integrity: true) %>
|
@@ -30,7 +32,7 @@
|
|
30
32
|
myshopifyUrl: "https://#{current_shopify_domain}",
|
31
33
|
hasStorageAccessUrl: "#{has_storage_access_url}",
|
32
34
|
doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
|
33
|
-
|
35
|
+
appTargetUrl: "#{app_target_url}"
|
34
36
|
},
|
35
37
|
},
|
36
38
|
)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html lang="<%= I18n.locale %>">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
5
6
|
<base target="_top">
|
6
7
|
<title>Redirecting…</title>
|
7
8
|
<%= render 'shopify_app/partials/layout_styles' %>
|
@@ -23,7 +24,7 @@
|
|
23
24
|
myshopifyUrl: "https://#{current_shopify_domain}",
|
24
25
|
hasStorageAccessUrl: "#{has_storage_access_url}",
|
25
26
|
doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
|
26
|
-
|
27
|
+
appTargetUrl: "#{app_target_url}"
|
27
28
|
},
|
28
29
|
},
|
29
30
|
)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html lang="en">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
5
6
|
<base target="_top">
|
6
7
|
<title>Redirecting…</title>
|
7
8
|
<%= javascript_include_tag('shopify_app/redirect', crossorigin: 'anonymous', integrity: true) %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
cs:
|
3
|
+
logged_out: Odhlášení proběhlo úspěšně
|
4
|
+
could_not_log_in: Nelze se přihlásit do obchodu Shopify
|
5
|
+
invalid_shop_url: Neplatná doména obchodu
|
6
|
+
enable_cookies_heading: Zapnout soubory cookie z aplikace %{app}
|
7
|
+
enable_cookies_body: Pokud chcete v Shopify používat aplikaci %{app}, musíte soubory
|
8
|
+
cookie v tomto prohlížeči povolit ručně.
|
9
|
+
enable_cookies_footer: Soubory cookie umožňují, aby vás aplikace ověřila pomocí
|
10
|
+
dočasného uchování preferencí a osobních údajů. Jejich platnost vyprší po 30 dnech.
|
11
|
+
enable_cookies_action: Povolit soubory cookie
|
12
|
+
top_level_interaction_heading: Váš prohlížeč potřebuje ověřit aplikaci %{app}
|
13
|
+
top_level_interaction_body: Váš prohlížeč vyžaduje, aby si od vás aplikace, jako
|
14
|
+
je %{app}, nejdřív vyžádaly přístup k souborům cookie, než je pro vás Shopify
|
15
|
+
otevře.
|
16
|
+
top_level_interaction_action: Pokračovat
|
17
|
+
request_storage_access_heading: Aplikace %{app} potřebuje získat přístup k souborům
|
18
|
+
cookie
|
19
|
+
request_storage_access_body: Tato aplikace vám umožní ověření prostřednictvím dočasného
|
20
|
+
uchování vašich osobních údajů. Pokud chcete používat tuto aplikaci, klikněte
|
21
|
+
na tlačítko Pokračovat a povolte soubory cookie.
|
22
|
+
request_storage_access_footer: Platnost souborů cookie vyprší po 30 dnech.
|
23
|
+
request_storage_access_action: Pokračovat
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
da:
|
3
|
+
logged_out: Logget ud
|
4
|
+
could_not_log_in: Kunne ikke logge ind på Shopify-butik
|
5
|
+
invalid_shop_url: Ugyldig butiksdomæne
|
6
|
+
enable_cookies_heading: Aktivér cookies fra %{app}
|
7
|
+
enable_cookies_body: Du skal manuelt aktivere cookies i denne browser for at kunne
|
8
|
+
bruge %{app} i Shopify.
|
9
|
+
enable_cookies_footer: Cookies lader appen godkende dig ved at gemme dine præferencer
|
10
|
+
og personlige oplysninger midlertidigt. De udløber efter 30 dage.
|
11
|
+
enable_cookies_action: Aktivér cookies
|
12
|
+
top_level_interaction_heading: Din browser skal godkende %{app}
|
13
|
+
top_level_interaction_body: Din browser kræver, at apps som f.eks. %{app} spørger
|
14
|
+
dig om adgang til cookies, inden Shopify kan åbne den for dig.
|
15
|
+
top_level_interaction_action: Fortsæt
|
16
|
+
request_storage_access_heading: "%{app} skal have adgang til cookies"
|
17
|
+
request_storage_access_body: Det lader appen godkende dig ved at gemme dine personlige
|
18
|
+
oplysninger midlertidigt. Klik på forsæt, og tillad cookies for at bruge appen.
|
19
|
+
request_storage_access_footer: Cookies udløber efter 30 dage.
|
20
|
+
request_storage_access_action: Fortsæt
|
data/config/locales/de.yml
CHANGED
@@ -7,16 +7,16 @@ de:
|
|
7
7
|
enable_cookies_body: Sie müssen Cookies in diesem Browser manuell aktivieren, um
|
8
8
|
%{app} in Shopify verwenden zu können.
|
9
9
|
enable_cookies_footer: Mithilfe von Cookies kann die App Sie authentifizieren, indem
|
10
|
-
Ihre Einstellungen und
|
10
|
+
Ihre Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden.
|
11
11
|
Sie laufen nach 30 Tagen ab.
|
12
12
|
enable_cookies_action: Cookies aktivieren
|
13
13
|
top_level_interaction_heading: Ihr Browser muss %{app} authentifizieren
|
14
|
-
top_level_interaction_body: Ihr Browser verlangt, dass Apps
|
15
|
-
|
14
|
+
top_level_interaction_body: Ihr Browser verlangt, dass Apps wie %{app} Sie um Zugriff
|
15
|
+
auf Cookies bitten, bevor Shopify sie für Sie öffnen kann.
|
16
16
|
top_level_interaction_action: Weiter
|
17
17
|
request_storage_access_heading: "%{app} braucht Zugriff auf Cookies"
|
18
18
|
request_storage_access_body: Damit kann die App Sie authentifizieren, indem Ihre
|
19
|
-
Einstellungen und
|
20
|
-
|
19
|
+
Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden. Klicken
|
20
|
+
Sie auf "Weiter" und erlauben Sie den Cookies, die App zu verwenden.
|
21
21
|
request_storage_access_footer: Cookies laufen nach 30 Tagen ab.
|
22
22
|
request_storage_access_action: Weiter
|
data/config/locales/en.yml
CHANGED
@@ -7,7 +7,7 @@ en:
|
|
7
7
|
enable_cookies_footer: 'Cookies let the app authenticate you by temporarily storing your preferences and personal information. They expire after 30 days.'
|
8
8
|
enable_cookies_action: 'Enable cookies'
|
9
9
|
top_level_interaction_heading: "Your browser needs to authenticate %{app}"
|
10
|
-
top_level_interaction_body: "Your browser requires
|
10
|
+
top_level_interaction_body: "Your browser requires apps like %{app} to ask you for access to cookies before Shopify can open it for you."
|
11
11
|
top_level_interaction_action: 'Continue'
|
12
12
|
request_storage_access_heading: "%{app} needs access to cookies"
|
13
13
|
request_storage_access_body: "This lets the app authenticate you by temporarily storing your personal information. Click continue and allow cookies to use the app."
|
data/config/locales/es.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
es:
|
3
3
|
logged_out: Cerrar sesión
|
4
|
-
could_not_log_in: No se pudo iniciar sesión en tu tienda
|
4
|
+
could_not_log_in: No se pudo iniciar sesión en tu tienda Shopify
|
5
5
|
invalid_shop_url: Dominio de tienda inválido
|
6
6
|
enable_cookies_heading: Habilitar cookies de %{app}
|
7
7
|
enable_cookies_body: Debes habilitar manualmente las cookies en este navegador para
|
@@ -11,8 +11,8 @@ es:
|
|
11
11
|
de 30 días.
|
12
12
|
enable_cookies_action: Habilitar cookies
|
13
13
|
top_level_interaction_heading: Tu navegador necesita autenticar %{app}
|
14
|
-
top_level_interaction_body: Tu navegador requiere aplicaciones
|
15
|
-
|
14
|
+
top_level_interaction_body: Tu navegador requiere aplicaciones como %{app} para
|
15
|
+
solicitarte acceso a cookies antes de que Shopify pueda abrirlo por ti.
|
16
16
|
top_level_interaction_action: Continuar
|
17
17
|
request_storage_access_heading: "%{app} necesita acceso a las cookies"
|
18
18
|
request_storage_access_body: Esto permite que la aplicación te autentique almacenando
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
fi:
|
3
|
+
logged_out: Olet kirjautunut ulos
|
4
|
+
could_not_log_in: Kirjautuminen Shopify-kauppaan ei onnistunut
|
5
|
+
invalid_shop_url: Virheellinen kaupan verkkotunnus
|
6
|
+
enable_cookies_heading: Ota käyttöön sovelluksen %{app} evästeet
|
7
|
+
enable_cookies_body: Sinun on otettava evästeet käyttöön manuaalisesti tässä selaimessa,
|
8
|
+
jotta voit käyttää sovellusta %{app} Shopifyssa.
|
9
|
+
enable_cookies_footer: Evästeiden avulla sovellus voi todentaa sinut tallentamalla
|
10
|
+
asetuksesi ja henkilötietosi tilapäisesti. Ne vanhenevat 30 päivän kuluttua.
|
11
|
+
enable_cookies_action: Ota evästeet käyttöön
|
12
|
+
top_level_interaction_heading: Selaimesi täytyy todentaa %{app}
|
13
|
+
top_level_interaction_body: Selaimesi vaatii sovelluksia, kuten %{app}, pyytämään
|
14
|
+
sinulta luvan evästeiden käyttöön, ennen kuin Shopify voi avata sovelluksen.
|
15
|
+
top_level_interaction_action: Jatka
|
16
|
+
request_storage_access_heading: "%{app} edellyttää evästeiden käyttöä"
|
17
|
+
request_storage_access_body: Näin sovellus voi todentaa sinut tallentamalla henkilötietosi
|
18
|
+
tilapäisesti. Napsauta Jatka ja salli evästeet sovelluksen käyttämiseksi.
|
19
|
+
request_storage_access_footer: Evästeet vanhenevat 30 päivän kuluttua.
|
20
|
+
request_storage_access_action: Jatka
|
data/config/locales/fr.yml
CHANGED
@@ -11,9 +11,9 @@ fr:
|
|
11
11
|
expirent après 30 jours.
|
12
12
|
enable_cookies_action: Activer les cookies
|
13
13
|
top_level_interaction_heading: Votre navigateur doit s'authentifier %{app}
|
14
|
-
top_level_interaction_body: Votre navigateur nécessite des applications
|
15
|
-
|
16
|
-
|
14
|
+
top_level_interaction_body: Votre navigateur nécessite des applications telles que
|
15
|
+
%{app} pour vous demander l'accès aux cookies avant que Shopify ne puisse l'ouvrir
|
16
|
+
pour vous.
|
17
17
|
top_level_interaction_action: Continuer
|
18
18
|
request_storage_access_heading: "%{app} a besoin d'accéder aux cookies"
|
19
19
|
request_storage_access_body: Cela permet à l'application de vous authentifier en
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
hi:
|
3
|
+
logged_out: सफलतापूर्वक लॉग आउट कर दिया
|
4
|
+
could_not_log_in: Shopify स्टोर में लॉग इन नहीं किया जा सका
|
5
|
+
invalid_shop_url: अमान्य शॉप डोमेन
|
6
|
+
enable_cookies_heading: "%{app} के कुकीज़ सक्षम करें"
|
7
|
+
enable_cookies_body: आपको %{app} का उपयोग Shopify में करने के लिए इस ब्राउज़र में
|
8
|
+
कुकीज़ मैन्युअल रूप से सक्षम करने चाहिए.
|
9
|
+
enable_cookies_footer: कुकीज़ अस्थायी रूप से आपकी वरीयताएं और व्यक्तिगत जानकारी स्टोर
|
10
|
+
कर ऐप को आपको प्रमाणित करने देते हैं. इनकी समय-सीमा 30 दिनों बाद समाप्त हो जाती
|
11
|
+
है.
|
12
|
+
enable_cookies_action: कुकीज़ को सक्षम करें
|
13
|
+
top_level_interaction_heading: आपके ब्राउज़र को %{app} प्रमाणित करने की आवश्यकता
|
14
|
+
है
|
15
|
+
top_level_interaction_body: आपके ब्राउज़र को %{app} जैसे ऐप की ज़रूरत होती है, जो
|
16
|
+
Shopify द्वारा आपके लिए उसे खोलने से पहले कुकीज़ पर पहुंचने करने की अनुमति मांगे.
|
17
|
+
top_level_interaction_action: जारी रखें
|
18
|
+
request_storage_access_heading: "%{app} को कुकीज़ पर पहुंच करने की आवश्यकता है"
|
19
|
+
request_storage_access_body: यह आपकी व्यक्तिगत जानकारी अस्थायी रूप से स्टोर कर ऐप
|
20
|
+
को आपको प्रमाणित करने देता है. जारी रखें पर क्लिक करें और कुकीज़ को ऐप उपयोग करने
|
21
|
+
की अनुमति दें.
|
22
|
+
request_storage_access_footer: कुकीज़ की समय-सीमा 30 दिनों बाद समाप्त हो जाती है.
|
23
|
+
request_storage_access_action: जारी रखें
|
data/config/locales/it.yml
CHANGED
@@ -10,9 +10,8 @@ it:
|
|
10
10
|
temporaneamente le tue preferenze e informazioni personali. Scadono dopo 30 giorni.
|
11
11
|
enable_cookies_action: Abilita i cookie
|
12
12
|
top_level_interaction_heading: Il tuo browser deve autenticare %{app}
|
13
|
-
top_level_interaction_body: Il tuo browser richiede che app
|
14
|
-
|
15
|
-
di Shopify.
|
13
|
+
top_level_interaction_body: Il tuo browser richiede che app come %{app} ti chiedano
|
14
|
+
l'accesso ai cookie prima dell'apertura automatica da parte di Shopify.
|
16
15
|
top_level_interaction_action: Continua
|
17
16
|
request_storage_access_heading: "%{app} deve accedere ai cookie"
|
18
17
|
request_storage_access_body: L'app potrà così autenticarti memorizzando temporaneamente
|
data/config/locales/ja.yml
CHANGED
@@ -8,7 +8,7 @@ ja:
|
|
8
8
|
enable_cookies_footer: Cookieを使用すると、各種設定や個人情報を一時的に保存することで、アプリ認証を受けることができます。30日後に有効期限が切れます。
|
9
9
|
enable_cookies_action: Cookieを有効にする
|
10
10
|
top_level_interaction_heading: お使いのブラウザを更新する必要があります%{app}
|
11
|
-
top_level_interaction_body: Shopifyがアプリを開けるように、ブラウザーはCookie
|
11
|
+
top_level_interaction_body: Shopifyがアプリを開けるように、ブラウザーはCookieにアクセスするための%{app}のようなアプリが必要です。
|
12
12
|
top_level_interaction_action: 続ける
|
13
13
|
request_storage_access_heading: "%{app}クッキーにアクセスする必要がある"
|
14
14
|
request_storage_access_body: Cookieを使用すると、個人情報を一時的に保存することで、アプリ認証を受けることができます。[続行]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
ko:
|
3
|
+
logged_out: 성공적으로 로그아웃 되었습니다.
|
4
|
+
could_not_log_in: Shopify 스토어에 로그인할 수 없습니다.
|
5
|
+
invalid_shop_url: 유효하지 않은 상점 도메인
|
6
|
+
enable_cookies_heading: "%{app}에서 쿠키를 사용 가능"
|
7
|
+
enable_cookies_body: Shopify 내에서 %{app} 을 사용하기 위해 이 브라우저에서 쿠키를 수동으로 사용할 수 있습니다.
|
8
|
+
enable_cookies_footer: 쿠키를 사용하면 개인의 선호나 정보를 임시로 저장하여 앱에서 사용자를 인증할 수 있습니다. 쿠키는 30일
|
9
|
+
후에 만료됩니다.
|
10
|
+
enable_cookies_action: 쿠리 사용 가능
|
11
|
+
top_level_interaction_heading: 브라우저에서 %{app} 을 인증해야 합니다.
|
12
|
+
top_level_interaction_body: Shopify를 열기 전 쿠키에 엑세스하려면 %{app} 과 같은 앱 들이 브라우저에 설치되어야
|
13
|
+
합니다.
|
14
|
+
top_level_interaction_action: 계속
|
15
|
+
request_storage_access_heading: "%{app}에서 쿠키에 접근해야 합니다."
|
16
|
+
request_storage_access_body: 이를 통해 개인 정보를 임시로 저장하여 앱에서 사용자를 인증할 수 있습니다. 계속 클릭하여
|
17
|
+
쿠키로 앱을 사용하세요.
|
18
|
+
request_storage_access_footer: 쿠키는 30일 후에 만료됩니다.
|
19
|
+
request_storage_access_action: 계속
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
ms:
|
3
|
+
logged_out: Berjaya log keluar
|
4
|
+
could_not_log_in: Tidak dapat log masuk ke kedai Shopify
|
5
|
+
invalid_shop_url: Domain kedai tidak sah
|
6
|
+
enable_cookies_heading: Dayakan kuki dari %{app}
|
7
|
+
enable_cookies_body: Anda mesti mengaktifkan kuki secara manual dalam pelayar ini
|
8
|
+
untuk %{app} digunakan dalam Shopify.
|
9
|
+
enable_cookies_footer: Kuki membenarkan aplikasi mengesahkan anda dengan menyimpan
|
10
|
+
keutamaan dan maklumat peribadi anda buat sementara waktu. Ia tamat tempoh selepas
|
11
|
+
30 hari.
|
12
|
+
enable_cookies_action: Dayakan kuki
|
13
|
+
top_level_interaction_heading: Pelayar anda perlu mengesahkan %{app}
|
14
|
+
top_level_interaction_body: Pelayar anda memerlukan aplikasi seperti %{app} untuk
|
15
|
+
meminta anda akses kepada kuki sebelum Shopify boleh membukanya untuk anda.
|
16
|
+
top_level_interaction_action: Teruskan
|
17
|
+
request_storage_access_heading: "%{app} memerlukan akses kepada kuki"
|
18
|
+
request_storage_access_body: Ini membolehkan aplikasi mengesahkan anda dengan menyimpan
|
19
|
+
maklumat peribadi anda buat sementara waktu. Klik teruskan dan benarkan kuki untuk
|
20
|
+
menggunakan aplikasi.
|
21
|
+
request_storage_access_footer: Kuki akan tamat tempoh selepas 30 hari.
|
22
|
+
request_storage_access_action: Teruskan
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
nb:
|
3
|
+
logged_out: Logget ut
|
4
|
+
could_not_log_in: Kunne ikke logge på Shopify-butikken
|
5
|
+
invalid_shop_url: Ugyldig butikkdomene
|
6
|
+
enable_cookies_heading: Aktiver informasjonskapsler fra %{app}
|
7
|
+
enable_cookies_body: Du kan manuelt aktivere informasjonskapsler i denne nettleseren
|
8
|
+
for å kunne bruke %{app} i Shopify.
|
9
|
+
enable_cookies_footer: Informasjonskapsler lar appen autentisere deg ved å midlertidig
|
10
|
+
lagre innstillingene og personopplysningene dine. De går ut etter 30 dager.
|
11
|
+
enable_cookies_action: Aktiver informasjonskapsler
|
12
|
+
top_level_interaction_heading: Nettleseren din må autentisere %{app}
|
13
|
+
top_level_interaction_body: Nettleseren din krever apper som %{app} for å spørre
|
14
|
+
deg om tilgang til informasjonskapsler før Shopify kan åpne den for deg.
|
15
|
+
top_level_interaction_action: Fortsett
|
16
|
+
request_storage_access_heading: "%{app} må ha tilgang til informasjonskapsler"
|
17
|
+
request_storage_access_body: Informasjonskapsler lar appen autentisere deg ved å
|
18
|
+
midlertidig lagre personopplysningene dine. Klikk på Fortsett og gi informasjonskapsler
|
19
|
+
tillatelse til å bruke appen.
|
20
|
+
request_storage_access_footer: Informasjonskapslene går ut etter 30 dager.
|
21
|
+
request_storage_access_action: Fortsett
|
data/config/locales/nl.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
---
|
2
2
|
nl:
|
3
|
-
logged_out:
|
3
|
+
logged_out: u bent afgemeld
|
4
4
|
could_not_log_in: Kon niet aanmelden bij Shopify-winkel
|
5
5
|
invalid_shop_url: Ongeldig winkeldomein
|
6
6
|
enable_cookies_heading: Schakel cookies in van %{app}
|
@@ -10,8 +10,8 @@ nl:
|
|
10
10
|
persoonlijke informatie tijdelijk op te slaan. Ze vervallen na 30 dagen.
|
11
11
|
enable_cookies_action: Schakel cookies in
|
12
12
|
top_level_interaction_heading: Uw browser moet %{app} verifiëren
|
13
|
-
top_level_interaction_body: Uw browser heeft apps
|
14
|
-
|
13
|
+
top_level_interaction_body: Uw browser heeft apps nodig zoals %{app} om u toegang
|
14
|
+
te vragen tot cookies voordat Shopify het voor u kan openen.
|
15
15
|
top_level_interaction_action: Doorgaan
|
16
16
|
request_storage_access_heading: "%{app} heeft toegang tot cookies nodig"
|
17
17
|
request_storage_access_body: Hiermee kan de app u verifiëren door uw persoonlijke
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
pl:
|
3
|
+
logged_out: Pomyślne wylogowanie
|
4
|
+
could_not_log_in: Nie można zalogować się do sklepu Shopify
|
5
|
+
invalid_shop_url: Nieprawidłowa domena sklepu
|
6
|
+
enable_cookies_heading: Włącz korzystanie z plików cookie z %{app}
|
7
|
+
enable_cookies_body: Aby móc korzystać z %{app} w Shopify, musisz ręcznie włączyć
|
8
|
+
korzystanie z plików cookie w tej przeglądarce.
|
9
|
+
enable_cookies_footer: Pliki cookie umożliwiają uwierzytelnianie aplikacji przez
|
10
|
+
tymczasowe przechowywanie preferencji i danych osobowych. Wygasają one po 30 dniach.
|
11
|
+
enable_cookies_action: Włącz korzystanie z plików cookie
|
12
|
+
top_level_interaction_heading: Twoja przeglądarka wymaga uwierzytelnienia %{app}
|
13
|
+
top_level_interaction_body: Twoja przeglądarka wymaga takich aplikacji jak %{app},
|
14
|
+
aby poprosić o dostęp do plików cookie, zanim Shopify będzie mógł ją otworzyć.
|
15
|
+
top_level_interaction_action: Kontynuuj
|
16
|
+
request_storage_access_heading: "%{app} potrzebuje dostępu do plików cookie"
|
17
|
+
request_storage_access_body: Dzięki temu aplikacja może Cię uwierzytelniać, tymczasowo,
|
18
|
+
przechowując Twoje dane osobowe. Kliknij przycisk Kontynuuj i zezwalaj na pliki
|
19
|
+
cookie, aby korzystać z aplikacji.
|
20
|
+
request_storage_access_footer: Pliki cookie wygasają po 30 dniach.
|
21
|
+
request_storage_access_action: Kontynuuj
|
data/config/locales/pt-BR.yml
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
---
|
2
2
|
pt-BR:
|
3
|
-
logged_out: Você saiu
|
3
|
+
logged_out: Você saiu.
|
4
4
|
could_not_log_in: Não foi possível fazer login na Shopify store
|
5
5
|
invalid_shop_url: Domínio de loja inválido
|
6
|
-
enable_cookies_heading:
|
7
|
-
enable_cookies_body: Você
|
8
|
-
usar %{app} dentro da Shopify.
|
9
|
-
enable_cookies_footer: Os cookies permitem que o
|
10
|
-
|
11
|
-
|
12
|
-
enable_cookies_action: Ativar cookies
|
6
|
+
enable_cookies_heading: Habilitar cookies de %{app}
|
7
|
+
enable_cookies_body: Você precisa habilitar manualmente os cookies neste navegador
|
8
|
+
para usar %{app} dentro da Shopify.
|
9
|
+
enable_cookies_footer: Os cookies permitem que o app o autentique armazenando temporariamente
|
10
|
+
suas preferências e dados pessoais. Eles expiram depois de 30 dias.
|
11
|
+
enable_cookies_action: Habilitar cookies
|
13
12
|
top_level_interaction_heading: Seu navegador precisa autenticar %{app}
|
14
|
-
top_level_interaction_body: Seu navegador exige que apps
|
15
|
-
|
13
|
+
top_level_interaction_body: Seu navegador exige que apps como o %{app} consultem
|
14
|
+
você sobre o acesso a cookies antes que a Shopify os abra.
|
16
15
|
top_level_interaction_action: Continuar
|
17
16
|
request_storage_access_heading: "%{app} precisa acessar cookies"
|
18
17
|
request_storage_access_body: Isso permite que o app autentique você armazenando
|