decidim-comments 0.26.4 → 0.27.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/cells/decidim/comments/comment_cell.rb +2 -2
- data/app/cells/decidim/comments/comments/comments_loading.erb +3 -0
- data/app/cells/decidim/comments/comments/show.erb +1 -0
- data/app/cells/decidim/comments/comments_cell.rb +7 -12
- data/app/cells/decidim/comments/edit_comment_modal_form_cell.rb +1 -1
- data/app/commands/decidim/comments/create_comment.rb +1 -1
- data/app/commands/decidim/comments/delete_comment.rb +1 -1
- data/app/commands/decidim/comments/update_comment.rb +8 -1
- data/app/commands/decidim/comments/vote_comment.rb +1 -1
- data/app/controllers/decidim/comments/comments_controller.rb +13 -9
- data/app/helpers/decidim/comments/comment_cells_helper.rb +1 -1
- data/app/models/decidim/comments/comment.rb +9 -10
- data/app/models/decidim/comments/comment_vote.rb +1 -1
- data/app/packs/src/decidim/comments/comments.component.js +32 -13
- data/app/packs/src/decidim/comments/comments.component.test.js +9 -5
- data/app/permissions/decidim/comments/permissions.rb +5 -7
- data/app/queries/decidim/comments/sorted_comments.rb +1 -3
- data/app/services/decidim/comments/new_comment_notification_creator.rb +1 -1
- data/app/views/decidim/comments/comments/index.js.erb +1 -0
- data/app/views/decidim/comments/comments/reload.js.erb +1 -0
- data/config/locales/am-ET.yml +1 -0
- data/config/locales/ar.yml +1 -0
- data/config/locales/bg.yml +1 -0
- data/config/locales/ca.yml +1 -0
- data/config/locales/cs.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/el.yml +1 -0
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +1 -0
- data/config/locales/es-PY.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/et.yml +1 -0
- data/config/locales/eu.yml +1 -0
- data/config/locales/fi-plain.yml +1 -0
- data/config/locales/fi.yml +1 -0
- data/config/locales/fr-CA.yml +1 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +1 -0
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +1 -0
- data/config/locales/id-ID.yml +1 -0
- data/config/locales/is-IS.yml +2 -1
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lb.yml +1 -0
- data/config/locales/lt.yml +1 -175
- data/config/locales/lv.yml +1 -0
- data/config/locales/mt.yml +1 -0
- data/config/locales/nl.yml +1 -18
- data/config/locales/no.yml +1 -0
- data/config/locales/om-ET.yml +1 -0
- data/config/locales/pl.yml +1 -0
- data/config/locales/pt-BR.yml +2 -1
- data/config/locales/pt.yml +1 -0
- data/config/locales/ro-RO.yml +1 -2
- data/config/locales/ru.yml +1 -0
- data/config/locales/si-LK.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/config/locales/sl.yml +1 -0
- data/config/locales/so-SO.yml +1 -0
- data/config/locales/sr-CS.yml +1 -0
- data/config/locales/sv.yml +1 -0
- data/config/locales/sw-KE.yml +1 -0
- data/config/locales/ti-ER.yml +1 -0
- data/config/locales/tr-TR.yml +1 -0
- data/config/locales/uk.yml +1 -0
- data/config/locales/val-ES.yml +1 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +1 -0
- data/config/locales/zh-TW.yml +1 -0
- data/db/migrate/20181016142511_make_authors_polymorphic_for_comments.rb +1 -0
- data/db/migrate/20181019092928_make_author_polymorphic_for_comment_votes.rb +1 -0
- data/lib/decidim/comments/comment_serializer.rb +1 -1
- data/lib/decidim/comments/comment_vote_serializer.rb +1 -1
- data/lib/decidim/comments/markdown.rb +0 -12
- data/lib/decidim/comments/test/shared_examples/translatable_comment.rb +1 -1
- data/lib/decidim/comments/version.rb +1 -1
- metadata +13 -15
- data/config/locales/gn-PY.yml +0 -1
- data/config/locales/lo-LA.yml +0 -1
- data/config/locales/oc-FR.yml +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15e0e5dd8fbb2fc7171061fa36077e83f956f3ada42b41dfa32cd8e8f60cdd0a
|
4
|
+
data.tar.gz: 6cb4e67d56972f657983cc174806b8766d0916fb55b7ca783ee2e8a684859283
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3a7482658e91430342214a3d668979c0450b1203c28725ab083c46773b6c39474f148a4489238c90187cda2407a81edbc1c7a1b9bd26944081ce36261f86e7e
|
7
|
+
data.tar.gz: ee42d7e4922a5cbc826a1a98f73b1d1056d4ce6879a398da32ad6962d9987323f7b37b2e1fc57111251baf2185301cbdc0e370621107778afd2fb47263dc285b
|
@@ -186,11 +186,11 @@ module Decidim
|
|
186
186
|
end
|
187
187
|
|
188
188
|
def has_replies?
|
189
|
-
model.comment_threads.
|
189
|
+
model.comment_threads.not_hidden.not_deleted.exists?
|
190
190
|
end
|
191
191
|
|
192
192
|
def has_replies_in_children?
|
193
|
-
|
193
|
+
model.descendants.where(decidim_commentable_type: "Decidim::Comments::Comment").not_hidden.not_deleted.exists?
|
194
194
|
end
|
195
195
|
|
196
196
|
# action_authorization_button expects current_component to be available
|
@@ -22,6 +22,12 @@ module Decidim
|
|
22
22
|
render :single_comment_warning
|
23
23
|
end
|
24
24
|
|
25
|
+
def comments_loading
|
26
|
+
return if single_comment?
|
27
|
+
|
28
|
+
render :comments_loading
|
29
|
+
end
|
30
|
+
|
25
31
|
def blocked_comments_warning
|
26
32
|
return unless comments_blocked?
|
27
33
|
return unless user_comments_blocked?
|
@@ -43,11 +49,7 @@ module Decidim
|
|
43
49
|
end
|
44
50
|
|
45
51
|
def comments
|
46
|
-
|
47
|
-
[single_comment]
|
48
|
-
else
|
49
|
-
SortedComments.for(model, order_by: order)
|
50
|
-
end
|
52
|
+
single_comment? ? [single_comment] : []
|
51
53
|
end
|
52
54
|
|
53
55
|
def comments_count
|
@@ -97,17 +99,10 @@ module Decidim
|
|
97
99
|
commentableGid: model.to_signed_global_id.to_s,
|
98
100
|
commentsUrl: decidim_comments.comments_path,
|
99
101
|
rootDepth: root_depth,
|
100
|
-
lastCommentId: last_comment_id,
|
101
102
|
order: order
|
102
103
|
}
|
103
104
|
end
|
104
105
|
|
105
|
-
def last_comment_id
|
106
|
-
Decidim::Comments::Comment.where(
|
107
|
-
root_commentable: model
|
108
|
-
).order(:id).pluck(:id).last
|
109
|
-
end
|
110
|
-
|
111
106
|
def single_comment?
|
112
107
|
single_comment.present?
|
113
108
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Decidim
|
4
4
|
module Comments
|
5
|
-
# A cell to display a form for
|
5
|
+
# A cell to display a form for edditing a comment.
|
6
6
|
class EditCommentModalFormCell < Decidim::ViewModel
|
7
7
|
delegate :current_user, :user_signed_in?, to: :controller
|
8
8
|
alias comment model
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Decidim
|
4
4
|
module Comments
|
5
5
|
# A command with all the business logic to update an existing comment
|
6
|
-
class UpdateComment <
|
6
|
+
class UpdateComment < Decidim::Command
|
7
7
|
# Public: Initializes the command.
|
8
8
|
#
|
9
9
|
# comment - Decidim::Comments::Comment
|
@@ -48,7 +48,14 @@ module Decidim
|
|
48
48
|
edit: true
|
49
49
|
)
|
50
50
|
|
51
|
+
mentioned_users = parsed.metadata[:user].users
|
52
|
+
mentioned_groups = parsed.metadata[:user_group].groups
|
51
53
|
CommentCreation.publish(@comment, parsed.metadata)
|
54
|
+
send_notifications(mentioned_users, mentioned_groups)
|
55
|
+
end
|
56
|
+
|
57
|
+
def send_notifications(mentioned_users, mentioned_groups)
|
58
|
+
NewCommentNotificationCreator.new(comment, mentioned_users, mentioned_groups).create
|
52
59
|
end
|
53
60
|
end
|
54
61
|
end
|
@@ -23,6 +23,12 @@ module Decidim
|
|
23
23
|
order_by: order,
|
24
24
|
after: params.fetch(:after, 0).to_i
|
25
25
|
)
|
26
|
+
@comments = @comments.reject do |comment|
|
27
|
+
next if comment.depth < 1
|
28
|
+
next if !comment.deleted? && !comment.hidden?
|
29
|
+
|
30
|
+
comment.commentable.descendants.where(decidim_commentable_type: "Decidim::Comments::Comment").not_hidden.not_deleted.blank?
|
31
|
+
end
|
26
32
|
@comments_count = commentable.comments_count
|
27
33
|
|
28
34
|
respond_to do |format|
|
@@ -136,14 +142,12 @@ module Decidim
|
|
136
142
|
|
137
143
|
def handle_success(comment)
|
138
144
|
@comment = comment
|
139
|
-
@comments_count =
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
end
|
146
|
-
end
|
145
|
+
@comments_count = case commentable
|
146
|
+
when Decidim::Comments::Comment
|
147
|
+
commentable.root_commentable.comments_count
|
148
|
+
else
|
149
|
+
commentable.comments_count
|
150
|
+
end
|
147
151
|
end
|
148
152
|
|
149
153
|
def commentable_gid
|
@@ -172,7 +176,7 @@ module Decidim
|
|
172
176
|
end
|
173
177
|
|
174
178
|
def commentable_path
|
175
|
-
return commentable.polymorphic_resource_path({}) if commentable
|
179
|
+
return commentable.polymorphic_resource_path({}) if commentable.respond_to?(:polymorphic_resource_path)
|
176
180
|
|
177
181
|
resource_locator(commentable).path
|
178
182
|
end
|
@@ -14,7 +14,7 @@ module Decidim
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def resource_link_path
|
17
|
-
return root_commentable.polymorphic_resource_path(url_params) if root_commentable
|
17
|
+
return root_commentable.polymorphic_resource_path(url_params) if root_commentable.respond_to?(:polymorphic_resource_path)
|
18
18
|
|
19
19
|
resource_locator(root_commentable).path(url_params)
|
20
20
|
end
|
@@ -10,12 +10,13 @@ module Decidim
|
|
10
10
|
include Decidim::Authorable
|
11
11
|
include Decidim::Comments::Commentable
|
12
12
|
include Decidim::FriendlyDates
|
13
|
-
include Decidim::
|
13
|
+
include Decidim::DownloadYourData
|
14
14
|
include Decidim::Traceable
|
15
15
|
include Decidim::Loggable
|
16
16
|
include Decidim::Searchable
|
17
17
|
include Decidim::TranslatableResource
|
18
18
|
include Decidim::TranslatableAttributes
|
19
|
+
include Decidim::ActsAsTree
|
19
20
|
|
20
21
|
# Limit the max depth of a comment tree. If C is a comment and R is a reply:
|
21
22
|
# C (depth 0)
|
@@ -27,6 +28,8 @@ module Decidim
|
|
27
28
|
|
28
29
|
translatable_fields :body
|
29
30
|
|
31
|
+
parent_item_foreign_key :decidim_commentable_id
|
32
|
+
|
30
33
|
belongs_to :commentable, foreign_key: "decidim_commentable_id", foreign_type: "decidim_commentable_type", polymorphic: true
|
31
34
|
belongs_to :root_commentable, foreign_key: "decidim_root_commentable_id", foreign_type: "decidim_root_commentable_type", polymorphic: true, touch: true
|
32
35
|
belongs_to :participatory_space, foreign_key: "decidim_participatory_space_id", foreign_type: "decidim_participatory_space_type", polymorphic: true, optional: true
|
@@ -53,6 +56,8 @@ module Decidim
|
|
53
56
|
validate :body_length
|
54
57
|
validate :commentable_can_have_comments
|
55
58
|
|
59
|
+
delegate :organization, to: :commentable
|
60
|
+
|
56
61
|
scope :not_deleted, -> { where(deleted_at: nil) }
|
57
62
|
|
58
63
|
translatable_fields :body
|
@@ -76,10 +81,6 @@ module Decidim
|
|
76
81
|
where(alignment: -1)
|
77
82
|
end
|
78
83
|
|
79
|
-
def organization
|
80
|
-
commentable&.organization || participatory_space&.organization
|
81
|
-
end
|
82
|
-
|
83
84
|
def visible?
|
84
85
|
participatory_space.try(:visible?) && component.try(:published?)
|
85
86
|
end
|
@@ -130,11 +131,9 @@ module Decidim
|
|
130
131
|
|
131
132
|
# Public: Overrides the `reported_content_url` Reportable concern method.
|
132
133
|
def reported_content_url
|
133
|
-
return unless root_commentable
|
134
|
-
|
135
134
|
url_params = { anchor: "comment_#{id}" }
|
136
135
|
|
137
|
-
if root_commentable
|
136
|
+
if root_commentable.respond_to?(:polymorphic_resource_url)
|
138
137
|
root_commentable.polymorphic_resource_url(url_params)
|
139
138
|
else
|
140
139
|
ResourceLocatorPresenter.new(root_commentable).url(url_params)
|
@@ -159,7 +158,7 @@ module Decidim
|
|
159
158
|
# Expects all +resources+ to be of the same "commentable_type".
|
160
159
|
# If the result is not `Decidim::Comments::Commentable` returns `nil`.
|
161
160
|
def self.user_commentators_ids_in(resources)
|
162
|
-
if resources.first
|
161
|
+
if resources.first.is_a?(Decidim::Comments::Commentable)
|
163
162
|
commentable_type = resources.first.class.name
|
164
163
|
Decidim::Comments::Comment.select("DISTINCT decidim_author_id").not_hidden.not_deleted
|
165
164
|
.where(decidim_commentable_id: resources.pluck(:id))
|
@@ -171,7 +170,7 @@ module Decidim
|
|
171
170
|
end
|
172
171
|
|
173
172
|
def can_participate?(user)
|
174
|
-
return true unless root_commentable
|
173
|
+
return true unless root_commentable.respond_to?(:can_participate?)
|
175
174
|
|
176
175
|
root_commentable.can_participate?(user)
|
177
176
|
end
|
@@ -5,7 +5,7 @@ module Decidim
|
|
5
5
|
# A comment can include user votes. A user should be able to upVote, votes with
|
6
6
|
# weight 1 and downVote, votes with weight -1.
|
7
7
|
class CommentVote < ApplicationRecord
|
8
|
-
include Decidim::
|
8
|
+
include Decidim::DownloadYourData
|
9
9
|
|
10
10
|
belongs_to :comment, foreign_key: "decidim_comment_id", class_name: "Comment"
|
11
11
|
belongs_to :author, foreign_key: "decidim_author_id", foreign_type: "decidim_author_type", polymorphic: true
|
@@ -1,4 +1,6 @@
|
|
1
1
|
/* eslint id-length: ["error", { "exceptions": ["$"] }] */
|
2
|
+
/* eslint max-lines: ["error", {"max": 350, "skipBlankLines": true}] */
|
3
|
+
|
2
4
|
|
3
5
|
/**
|
4
6
|
* A plain Javascript component that handles the comments.
|
@@ -10,6 +12,8 @@
|
|
10
12
|
// This is necessary for testing purposes
|
11
13
|
const $ = window.$;
|
12
14
|
|
15
|
+
import Rails from "@rails/ujs";
|
16
|
+
|
13
17
|
import { createCharacterCounter } from "src/decidim/input_character_counter"
|
14
18
|
import ExternalLink from "src/decidim/external_link"
|
15
19
|
import updateExternalDomainLinks from "src/decidim/external_domain_warning"
|
@@ -23,6 +27,8 @@ export default class CommentsComponent {
|
|
23
27
|
this.order = config.order;
|
24
28
|
this.lastCommentId = config.lastCommentId;
|
25
29
|
this.pollingInterval = config.pollingInterval || 15000;
|
30
|
+
this.singleComment = config.singleComment;
|
31
|
+
this.toggleTranslations = config.toggleTranslations;
|
26
32
|
this.id = this.$element.attr("id") || this._getUID();
|
27
33
|
this.mounted = false;
|
28
34
|
}
|
@@ -36,6 +42,9 @@ export default class CommentsComponent {
|
|
36
42
|
if (this.$element.length > 0 && !this.mounted) {
|
37
43
|
this.mounted = true;
|
38
44
|
this._initializeComments(this.$element);
|
45
|
+
if (!this.singleComment) {
|
46
|
+
this._fetchComments();
|
47
|
+
}
|
39
48
|
|
40
49
|
$(".order-by__dropdown .is-submenu-item a", this.$element).on("click.decidim-comments", () => this._onInitOrder());
|
41
50
|
}
|
@@ -133,8 +142,6 @@ export default class CommentsComponent {
|
|
133
142
|
$text.get(0).addEventListener("emoji.added", this._onTextInput);
|
134
143
|
}
|
135
144
|
});
|
136
|
-
|
137
|
-
this._pollComments();
|
138
145
|
}
|
139
146
|
|
140
147
|
/**
|
@@ -200,20 +207,32 @@ export default class CommentsComponent {
|
|
200
207
|
this._stopPolling();
|
201
208
|
|
202
209
|
this.pollTimeout = setTimeout(() => {
|
203
|
-
|
204
|
-
url: this.commentsUrl,
|
205
|
-
type: "GET",
|
206
|
-
data: new URLSearchParams({
|
207
|
-
"commentable_gid": this.commentableGid,
|
208
|
-
"root_depth": this.rootDepth,
|
209
|
-
"order": this.order,
|
210
|
-
"after": this.lastCommentId
|
211
|
-
}),
|
212
|
-
success: this._pollComments()
|
213
|
-
})
|
210
|
+
this._fetchComments();
|
214
211
|
}, this.pollingInterval);
|
215
212
|
}
|
216
213
|
|
214
|
+
/**
|
215
|
+
* Sends an ajax request based on current
|
216
|
+
* params to get comments for the component
|
217
|
+
* @private
|
218
|
+
* @returns {Void} - Returns nothing
|
219
|
+
*/
|
220
|
+
_fetchComments() {
|
221
|
+
Rails.ajax({
|
222
|
+
url: this.commentsUrl,
|
223
|
+
type: "GET",
|
224
|
+
data: new URLSearchParams({
|
225
|
+
"commentable_gid": this.commentableGid,
|
226
|
+
"root_depth": this.rootDepth,
|
227
|
+
"order": this.order,
|
228
|
+
"after": this.lastCommentId,
|
229
|
+
...(this.toggleTranslations && { "toggle_translations": this.toggleTranslations }),
|
230
|
+
...(this.lastCommentId && { "after": this.lastCommentId })
|
231
|
+
}),
|
232
|
+
success: this._pollComments()
|
233
|
+
})
|
234
|
+
}
|
235
|
+
|
217
236
|
/**
|
218
237
|
* Stops polling for new comments.
|
219
238
|
* @private
|
@@ -13,6 +13,10 @@ window.$.ajax = jest.fn().mockImplementation((...args) => $.ajax(...args));
|
|
13
13
|
import Quill from "quill"
|
14
14
|
window.Quill = Quill
|
15
15
|
|
16
|
+
// Rails.ajax is used by the fetching/polling of the comments
|
17
|
+
import Rails from "@rails/ujs";
|
18
|
+
jest.mock("@rails/ujs");
|
19
|
+
|
16
20
|
// Fake timers for testing polling
|
17
21
|
jest.useFakeTimers();
|
18
22
|
|
@@ -383,16 +387,16 @@ describe("CommentsComponent", () => {
|
|
383
387
|
|
384
388
|
jest.advanceTimersByTime(1000);
|
385
389
|
|
386
|
-
expect(
|
390
|
+
expect(Rails.ajax).toHaveBeenCalledWith({
|
387
391
|
url: "/comments",
|
388
|
-
|
389
|
-
|
390
|
-
data: {
|
392
|
+
type: "GET",
|
393
|
+
data: new URLSearchParams({
|
391
394
|
"commentable_gid": "commentable-gid",
|
392
395
|
"root_depth": 0,
|
393
396
|
order: "older",
|
394
397
|
after: 456
|
395
|
-
}
|
398
|
+
}),
|
399
|
+
success: window.undefined
|
396
400
|
});
|
397
401
|
});
|
398
402
|
|
@@ -51,13 +51,11 @@ module Decidim
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def commentable
|
54
|
-
@commentable ||=
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
60
|
-
end
|
54
|
+
@commentable ||= if comment
|
55
|
+
comment.root_commentable
|
56
|
+
else
|
57
|
+
context.fetch(:commentable, nil)
|
58
|
+
end
|
61
59
|
end
|
62
60
|
|
63
61
|
def comment
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Decidim
|
4
4
|
module Comments
|
5
5
|
# A class used to find comments for a commentable resource
|
6
|
-
class SortedComments <
|
6
|
+
class SortedComments < Decidim::Query
|
7
7
|
attr_reader :commentable
|
8
8
|
|
9
9
|
# Syntactic sugar to initialize the class and return the queried objects.
|
@@ -34,8 +34,6 @@ module Decidim
|
|
34
34
|
.includes(:author, :user_group, :up_votes, :down_votes)
|
35
35
|
|
36
36
|
case @options[:order_by]
|
37
|
-
when "older"
|
38
|
-
order_by_older(scope)
|
39
37
|
when "recent"
|
40
38
|
order_by_recent(scope)
|
41
39
|
when "best_rated"
|
@@ -4,6 +4,7 @@
|
|
4
4
|
var $comments = $("#" + rootCommentableId);
|
5
5
|
var component = $comments.data("comments");
|
6
6
|
|
7
|
+
$(".loading-comments").addClass("hide");
|
7
8
|
<% @comments.each do |comment| %>
|
8
9
|
var commentId = <%= comment.id.to_json %>;
|
9
10
|
var commentHtml = '<%== j(render comment).strip %>';
|
data/config/locales/am-ET.yml
CHANGED
data/config/locales/ar.yml
CHANGED
data/config/locales/bg.yml
CHANGED
data/config/locales/ca.yml
CHANGED
data/config/locales/cs.yml
CHANGED
data/config/locales/da.yml
CHANGED
data/config/locales/de.yml
CHANGED
data/config/locales/el.yml
CHANGED
data/config/locales/eo.yml
CHANGED
data/config/locales/es-MX.yml
CHANGED
data/config/locales/es-PY.yml
CHANGED
data/config/locales/es.yml
CHANGED
data/config/locales/et.yml
CHANGED
data/config/locales/eu.yml
CHANGED
data/config/locales/fi-plain.yml
CHANGED
data/config/locales/fi.yml
CHANGED
data/config/locales/fr-CA.yml
CHANGED
data/config/locales/fr.yml
CHANGED
data/config/locales/ga-IE.yml
CHANGED
data/config/locales/gl.yml
CHANGED
data/config/locales/hr.yml
CHANGED
data/config/locales/hu.yml
CHANGED
data/config/locales/id-ID.yml
CHANGED
data/config/locales/is-IS.yml
CHANGED
data/config/locales/it.yml
CHANGED
data/config/locales/ja.yml
CHANGED
data/config/locales/ko.yml
CHANGED
data/config/locales/lb.yml
CHANGED