shopify_app 9.0.0 → 13.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|