DEV: Always use %{count} in pluralized strings

This commit is contained in:
Gerhard Schlager 2019-05-20 23:26:22 +02:00
parent ca2ba22a48
commit 0afcad148a
5 changed files with 157 additions and 134 deletions

View File

@ -69,34 +69,34 @@ en:
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
one: "< 1s"
one: "< %{count}s"
other: "< %{count}s"
x_seconds:
one: "1s"
one: "%{count}s"
other: "%{count}s"
less_than_x_minutes:
one: "< 1m"
one: "< %{count}m"
other: "< %{count}m"
x_minutes:
one: "1m"
one: "%{count}m"
other: "%{count}m"
about_x_hours:
one: "1h"
one: "%{count}h"
other: "%{count}h"
x_days:
one: "1d"
one: "%{count}d"
other: "%{count}d"
x_months:
one: "1mon"
one: "%{count}mon"
other: "%{count}mon"
about_x_years:
one: "1y"
one: "%{count}y"
other: "%{count}y"
over_x_years:
one: "> 1y"
one: "> %{count}y"
other: "> %{count}y"
almost_x_years:
one: "1y"
one: "%{count}y"
other: "%{count}y"
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
date_month: "D MMM"
@ -104,35 +104,35 @@ en:
date_year: "MMM 'YY"
medium:
x_minutes:
one: "1 min"
one: "%{count} min"
other: "%{count} mins"
x_hours:
one: "1 hour"
one: "%{count} hour"
other: "%{count} hours"
x_days:
one: "1 day"
one: "%{count} day"
other: "%{count} days"
# Use Moment.js format string: https://momentjs.com/docs/#/displaying/format/
date_year: "D MMM 'YY"
medium_with_ago:
x_minutes:
one: "1 min ago"
one: "%{count} min ago"
other: "%{count} mins ago"
x_hours:
one: "1 hour ago"
one: "%{count} hour ago"
other: "%{count} hours ago"
x_days:
one: "1 day ago"
one: "%{count} day ago"
other: "%{count} days ago"
later:
x_days:
one: "1 day later"
one: "%{count} day later"
other: "%{count} days later"
x_months:
one: "1 month later"
one: "%{count} month later"
other: "%{count} months later"
x_years:
one: "1 year later"
one: "%{count} year later"
other: "%{count} years later"
previous_month: "Previous Month"
next_month: "Next Month"
@ -387,7 +387,7 @@ en:
none: "There are no items to review."
view_pending: "view pending"
topic_has_pending:
one: "This topic has <b>1</b> post pending approval"
one: "This topic has <b>%{count}</b> post pending approval"
other: "This topic has <b>{{count}}</b> posts pending approval"
title: "Review"
topic: "Topic:"
@ -423,10 +423,10 @@ en:
original: "(original topic)"
details: "details"
unique_users:
one: "1 user"
one: "%{count} user"
other: "{{count}} users"
replies:
one: "1 reply"
one: "%{count} reply"
other: "{{count}} replies"
edit: "Edit"
save: "Save"
@ -486,7 +486,7 @@ en:
title: "Post Needs Approval"
description: "We've received your new post but it needs to be approved by a moderator before it will appear. Please be patient."
pending_posts:
one: "You have <strong>1</strong> post pending."
one: "You have <strong>%{count}</strong> post pending."
other: "You have <strong>{{count}}</strong> posts pending."
ok: "OK"
@ -525,7 +525,7 @@ en:
posts_read: "Read"
posts_read_long: "Posts Read"
total_rows:
one: "1 user"
one: "%{count} user"
other: "%{count} users"
group_histories:
@ -711,7 +711,7 @@ en:
toggle_ordering: "toggle ordering control"
subcategories: "Subcategories"
topic_sentence:
one: "1 topic"
one: "%{count} topic"
other: "%{count} topics"
topic_stat_sentence_week:
one: "%{count} new topic in the past week."
@ -1274,7 +1274,7 @@ en:
reached: "<b>%{relativeAge}</b> <a href='%{url}' target='_blank'>%{rate}</a> reached site setting limit of %{siteSettingRate}."
exceeded: "<b>%{relativeAge}</b> <a href='%{url}' target='_blank'>%{rate}</a> exceeds site setting limit of %{siteSettingRate}."
rate:
one: "1 error/%{duration}"
one: "%{count} error/%{duration}"
other: "%{count} errors/%{duration}"
learn_more: "learn more..."
@ -1534,7 +1534,7 @@ en:
group_mentioned_limit: "<b>Warning!</b> You mentioned <a href='{{group_link}}'>{{group}}</a>, however this group has more members than the administrator configured mention limit of {{max}} users. Nobody will be notified. "
group_mentioned:
one: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>1 person</a> are you sure?"
one: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>%{count} person</a> are you sure?"
other: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>{{count}} people</a> are you sure?"
cannot_see_mention:
category: "You mentioned {{username}} but they won't be notified because they do not have access to this category. You will need to add them to a group that has access to this category."
@ -1651,10 +1651,10 @@ en:
notifications:
tooltip:
regular:
one: "1 unseen notification"
one: "%{count} unseen notification"
other: "{{count}} unseen notifications"
message:
one: "1 unread message"
one: "%{count} unread message"
other: "{{count}} unread messages"
title: "notifications of @name mentions, replies to your posts and topics, messages, etc"
none: "Unable to load notifications at this time."
@ -1671,7 +1671,7 @@ en:
liked: "<span>{{username}}</span> {{description}}"
liked_2: "<span>{{username}}, {{username2}}</span> {{description}}"
liked_many:
one: "<span>{{username}}, {{username2}} and 1 other</span> {{description}}"
one: "<span>{{username}}, {{username2}} and %{count} other</span> {{description}}"
other: "<span>{{username}}, {{username2}} and {{count}} others</span> {{description}}"
liked_consolidated_description:
one: "liked {{count}} of your posts"
@ -1731,7 +1731,7 @@ en:
clear_all: "Clear All"
too_short: "Your search term is too short."
result_count:
one: "<span>1 result for</span><span class='term'>{{term}}</span>"
one: "<span>%{count} result for</span><span class='term'>{{term}}</span>"
other: "<span>{{count}}{{plus}} results for</span><span class='term'>{{term}}</span>"
title: "search topics, posts, users, or categories"
full_page_title: "search topics or posts"
@ -1827,7 +1827,7 @@ en:
notification_level: "Notifications"
choose_new_category: "Choose the new category for the topics:"
selected:
one: "You have selected <b>1</b> topic."
one: "You have selected <b>%{count}</b> topic."
other: "You have selected <b>{{count}}</b> topics."
change_tags: "Replace Tags"
append_tags: "Append Tags"
@ -1863,7 +1863,7 @@ en:
topic:
filter_to:
one: "1 post in topic"
one: "%{count} post in topic"
other: "{{count}} posts in topic"
create: "New Topic"
create_long: "Create a new Topic"
@ -1882,10 +1882,10 @@ en:
new: "new topic"
unread: "unread"
new_topics:
one: "1 new topic"
one: "%{count} new topic"
other: "{{count}} new topics"
unread_topics:
one: "1 unread topic"
one: "%{count} unread topic"
other: "{{count}} unread topics"
title: "Topic"
invalid_access:
@ -1899,16 +1899,16 @@ en:
title: "Topic not found"
description: "Sorry, we couldn't find that topic. Perhaps it was removed by a moderator?"
total_unread_posts:
one: "you have 1 unread post in this topic"
one: "you have %{count} unread post in this topic"
other: "you have {{count}} unread posts in this topic"
unread_posts:
one: "you have 1 unread old post in this topic"
one: "you have %{count} unread old post in this topic"
other: "you have {{count}} unread old posts in this topic"
new_posts:
one: "there is 1 new post in this topic since you last read it"
one: "there is %{count} new post in this topic since you last read it"
other: "there are {{count}} new posts in this topic since you last read it"
likes:
one: "there is 1 like in this topic"
one: "there is %{count} like in this topic"
other: "there are {{count}} likes in this topic"
back_to_list: "Back to Topic List"
options: "Topic Options"
@ -1998,7 +1998,7 @@ en:
auto_reminder: "You will be reminded about this topic %{timeLeft}."
auto_close_title: "Auto-Close Settings"
auto_close_immediate:
one: "The last post in the topic is already 1 hour old, so the topic will be closed immediately."
one: "The last post in the topic is already %{count} hour old, so the topic will be closed immediately."
other: "The last post in the topic is already %{count} hours old, so the topic will be closed immediately."
timeline:
@ -2122,7 +2122,7 @@ en:
pin_validation: "A date is required to pin this topic."
not_pinned: "There are no topics pinned in {{categoryLink}}."
already_pinned:
one: "Topics currently pinned in {{categoryLink}}: <strong class='badge badge-notification unread'>1</strong>"
one: "Topics currently pinned in {{categoryLink}}: <strong class='badge badge-notification unread'>%{count}</strong>"
other: "Topics currently pinned in {{categoryLink}}: <strong class='badge badge-notification unread'>{{count}}</strong>"
pin_globally: "Make this topic appear at the top of all topic lists until"
confirm_pin_globally: "You already have {{count}} globally pinned topics. Too many pinned topics may be a burden for new and anonymous users. Are you sure you want to pin another topic globally?"
@ -2131,7 +2131,7 @@ en:
global_pin_note: "Users can unpin the topic individually for themselves."
not_pinned_globally: "There are no topics pinned globally."
already_pinned_globally:
one: "Topics currently pinned globally: <strong class='badge badge-notification unread'>1</strong>"
one: "Topics currently pinned globally: <strong class='badge badge-notification unread'>%{count}</strong>"
other: "Topics currently pinned globally: <strong class='badge badge-notification unread'>{{count}}</strong>"
make_banner: "Make this topic into a banner that appears at the top of all pages."
remove_banner: "Remove the banner that appears at the top of all pages."
@ -2176,7 +2176,7 @@ en:
filters:
n_posts:
one: "1 post"
one: "%{count} post"
other: "{{count}} posts"
cancel: "Remove filter"
@ -2264,7 +2264,7 @@ en:
select_all: select all
deselect_all: deselect all
description:
one: You have selected <b>1</b> post.
one: You have selected <b>%{count}</b> post.
other: "You have selected <b>{{count}}</b> posts."
deleted_by_author:
@ -2291,7 +2291,7 @@ en:
expand_collapse: "expand/collapse"
locked: "a staff member has locked this post from being edited"
gap:
one: "view 1 hidden reply"
one: "view %{count} hidden reply"
other: "view {{count}} hidden replies"
notice:
@ -2304,12 +2304,12 @@ en:
other: "{{count}} Replies"
has_likes_title:
one: "1 person liked this post"
one: "%{count} person liked this post"
other: "{{count}} people liked this post"
has_likes_title_only_you: "you liked this post"
has_likes_title_you:
one: "you and 1 other person liked this post"
one: "you and %{count} other person liked this post"
other: "you and {{count}} other people liked this post"
errors:
@ -2357,10 +2357,10 @@ en:
delete_replies:
confirm: "Do you also want to delete the replies to this post?"
direct_replies:
one: "Yes, and 1 direct reply"
one: "Yes, and %{count} direct reply"
other: "Yes, and {{count}} direct replies"
all_replies:
one: "Yes, and 1 reply"
one: "Yes, and %{count} reply"
other: "Yes, and all {{count}} replies"
just_the_post: "No, just this post"
admin: "post admin actions"
@ -2609,13 +2609,13 @@ en:
custom_placeholder_notify_moderators: "Let us know specifically what you are concerned about, and provide relevant links and examples where possible."
custom_message:
at_least:
one: "enter at least 1 character"
one: "enter at least %{count} character"
other: "enter at least {{count}} characters"
more:
one: "1 to go..."
one: "%{count} to go..."
other: "{{count}} to go..."
left:
one: "1 remaining"
one: "%{count} remaining"
other: "{{count}} remaining"
flagging_topic:
@ -2629,12 +2629,12 @@ en:
links_title: "Popular Links"
links_shown: "show more links..."
clicks:
one: "1 click"
one: "%{count} click"
other: "%{count} clicks"
post_links:
about: "expand more links for this post"
title:
one: "1 more"
one: "%{count} more"
other: "%{count} more"
topic_statuses:
@ -2677,7 +2677,7 @@ en:
other: "views"
replies: "Replies"
views_long:
one: "this topic has been viewed 1 time"
one: "this topic has been viewed %{count} time"
other: "this topic has been viewed {{number}} times"
activity: "Activity"
likes: "Likes"
@ -2705,7 +2705,7 @@ en:
latest:
title: "Latest"
title_with_count:
one: "Latest (1)"
one: "Latest (%{count})"
other: "Latest ({{count}})"
help: "topics with recent posts"
hot:
@ -2724,20 +2724,20 @@ en:
unread:
title: "Unread"
title_with_count:
one: "Unread (1)"
one: "Unread (%{count})"
other: "Unread ({{count}})"
help: "topics you are currently watching or tracking with unread posts"
lower_title_with_count:
one: "1 unread"
one: "%{count} unread"
other: "{{count}} unread"
new:
lower_title_with_count:
one: "1 new"
one: "%{count} new"
other: "{{count}} new"
lower_title: "new"
title: "New"
title_with_count:
one: "New (1)"
one: "New (%{count})"
other: "New ({{count}})"
help: "topics created in the last few days"
posted:
@ -2749,7 +2749,7 @@ en:
category:
title: "{{categoryName}}"
title_with_count:
one: "{{categoryName}} (1)"
one: "{{categoryName}} (%{count})"
other: "{{categoryName}} ({{count}})"
help: "latest topics in the {{categoryName}} category"
top:
@ -2851,7 +2851,7 @@ en:
badges:
earned_n_times:
one: "Earned this badge 1 time"
one: "Earned this badge %{count} time"
other: "Earned this badge %{count} times"
granted_on: "Granted %{date}"
others_count: "Others with this badge (%{count})"
@ -2859,13 +2859,13 @@ en:
allow_title: "You can use this badge as a title"
multiple_grant: "You can earn this multiple times"
badge_count:
one: "1 Badge"
one: "%{count} Badge"
other: "%{count} Badges"
more_badges:
one: "+1 More"
one: "+%{count} More"
other: "+%{count} More"
granted:
one: "1 granted"
one: "%{count} granted"
other: "%{count} granted"
select_badge_for_title: Select a badge to use as your title
none: "(none)"
@ -2902,7 +2902,7 @@ en:
choose_for_topic: "optional tags"
delete_tag: "Delete Tag"
delete_confirm:
one: "Are you sure you want to delete this tag and remove it from 1 topic it is assigned to?"
one: "Are you sure you want to delete this tag and remove it from %{count} topic it is assigned to?"
other: "Are you sure you want to delete this tag and remove it from {{count}} topics it is assigned to?"
delete_confirm_no_topics: "Are you sure you want to delete this tag?"
rename_tag: "Rename Tag"
@ -3247,7 +3247,7 @@ en:
one: "There is a new event."
other: "There are {{count}} new events."
completed_in:
one: "Completed in 1 second."
one: "Completed in %{count} second."
other: "Completed in {{count}} seconds."
request: "Request"
response: "Response"
@ -3480,7 +3480,7 @@ en:
theme_translations: "Theme Translations"
empty: "No items"
commits_behind:
one: "Theme is 1 commit behind!"
one: "Theme is %{count} commit behind!"
other: "Theme is {{count}} commits behind!"
compare_commits: "(See new commits)"
repo_unreachable: "Couldn't contact the Git repository of this theme. Error message:"
@ -3789,7 +3789,7 @@ en:
clear_filter: "Clear"
show_words: "show words"
word_count:
one: "1 word"
one: "%{count} word"
other: "%{count} words"
actions:
block: "Block"
@ -3948,7 +3948,7 @@ en:
one: "Can't delete all posts. Some posts are older than %{count} day old. (The delete_user_max_post_age setting.)"
other: "Can't delete all posts. Some posts are older than %{count} days old. (The delete_user_max_post_age setting.)"
cant_delete_all_too_many_posts:
one: "Can't delete all posts because the user has more than 1 post. (delete_all_posts_max)"
one: "Can't delete all posts because the user has more than %{count} post. (delete_all_posts_max)"
other: "Can't delete all posts because the user has more than %{count} posts. (delete_all_posts_max)"
delete_confirm: "It is generally preferable to anonymize users rather than deleting them, to avoid removing content from existing discussions.<br><br>Are you SURE you want to delete this user? This is permanent!"
delete_and_block: "Delete and <b>block</b> this email and IP address"
@ -4187,7 +4187,7 @@ en:
text: "There are missing grant samples. This happens when the badge query returns user IDs or post IDs that do not exist. This may cause unexpected results later on - please double-check your query."
no_grant_count: "No badges to be assigned."
grant_count:
one: "<b>1</b> badge to be assigned."
one: "<b>%{count}</b> badge to be assigned."
other: "<b>%{count}</b> badges to be assigned."
sample: "Sample:"
grant:
@ -4280,7 +4280,7 @@ en:
quit: "Maybe Later"
staff_count:
one: "Your community has 1 staff (you). "
one: "Your community has %{count} staff (you). "
other: "Your community has %{count} staff, including you."
invites:

View File

@ -171,19 +171,19 @@ en:
one: "Cannot delete record because a dependent %{record} exists"
many: "Cannot delete record because dependent %{record} exist"
too_long:
one: is too long (maximum is 1 character)
one: is too long (maximum is %{count} character)
other: is too long (maximum is %{count} characters)
too_short:
one: is too short (minimum is 1 character)
one: is too short (minimum is %{count} character)
other: is too short (minimum is %{count} characters)
wrong_length:
one: is the wrong length (should be 1 character)
one: is the wrong length (should be %{count} character)
other: is the wrong length (should be %{count} characters)
other_than: "must be other than %{count}"
template:
body: ! "There were problems with the following fields:"
header:
one: 1 error prohibited this %{model} from being saved
one: "%{count} error prohibited this %{model} from being saved"
other: ! "%{count} errors prohibited this %{model} from being saved"
embed:
load_from_remote: "There was an error loading that post."
@ -249,7 +249,7 @@ en:
likes: "Likes"
too_many_replies:
one: "We're sorry, but new users are temporarily limited to 1 reply in the same topic."
one: "We're sorry, but new users are temporarily limited to %{count} reply in the same topic."
other: "We're sorry, but new users are temporarily limited to %{count} replies in the same topic."
max_consecutive_replies:
@ -265,7 +265,7 @@ en:
no_hosts: "No hosts were set up for embedding."
configure: "Configure Embedding"
more_replies:
one: "1 more reply"
one: "%{count} more reply"
other: "%{count} more replies"
loading: "Loading Discussion..."
@ -382,7 +382,7 @@ en:
education:
until_posts:
one: "1 post"
one: "%{count} post"
other: "%{count} posts"
"new-topic": |
@ -604,7 +604,7 @@ en:
uncategorized: "This category is special. It is intended as a holding area for topics that have no category; it cannot be deleted."
has_subcategories: "Can't delete this category because it has sub-categories."
topic_exists:
one: "Can't delete this category because it has 1 topic. Oldest topic is %{topic_link}."
one: "Can't delete this category because it has %{count} topic. Oldest topic is %{topic_link}."
other: "Can't delete this category because it has %{count} topics. Oldest topic is %{topic_link}."
topic_exists_no_oldest: "Can't delete this category because topic count is %{count}."
uncategorized_description: "Topics that don't need a category, or don't fit into any other existing category."
@ -648,13 +648,13 @@ en:
topic_invitations_per_day: "Youve reached the maximum number of topic invitations. Please wait %{time_left} before trying again."
hours:
one: "1 hour"
one: "%{count} hour"
other: "%{count} hours"
minutes:
one: "1 minute"
one: "%{count} minute"
other: "%{count} minutes"
seconds:
one: "1 second"
one: "%{count} second"
other: "%{count} seconds"
short_time: "a few seconds"
@ -662,37 +662,37 @@ en:
distance_in_words:
half_a_minute: "< 1m"
less_than_x_seconds:
one: "< 1s"
one: "< %{count}s"
other: "< %{count}s"
x_seconds:
one: "1s"
one: "%{count}s"
other: "%{count}s"
less_than_x_minutes:
one: "< 1m"
one: "< %{count}m"
other: "< %{count}m"
x_minutes:
one: "1m"
one: "%{count}m"
other: "%{count}m"
about_x_hours:
one: "1h"
one: "%{count}h"
other: "%{count}h"
x_days:
one: "1d"
one: "%{count}d"
other: "%{count}d"
about_x_months:
one: "1mon"
one: "%{count}mon"
other: "%{count}mon"
x_months:
one: "1mon"
one: "%{count}mon"
other: "%{count}mon"
about_x_years:
one: "1y"
one: "%{count}y"
other: "%{count}y"
over_x_years:
one: "> 1y"
one: "> %{count}y"
other: "> %{count}y"
almost_x_years:
one: "1y"
one: "%{count}y"
other: "%{count}y"
distance_in_words_verbose:
@ -701,34 +701,34 @@ en:
one: "just now"
other: "just now"
x_seconds:
one: "1 second ago"
one: "%{count} second ago"
other: "%{count} seconds ago"
less_than_x_minutes:
one: "less than 1 minute ago"
one: "less than %{count} minute ago"
other: "less than %{count} minutes ago"
x_minutes:
one: "1 minute ago"
one: "%{count} minute ago"
other: "%{count} minutes ago"
about_x_hours:
one: "1 hour ago"
one: "%{count} hour ago"
other: "%{count} hours ago"
x_days:
one: "1 day ago"
one: "%{count} day ago"
other: "%{count} days ago"
about_x_months:
one: "about 1 month ago"
one: "about %{count} month ago"
other: "about %{count} months ago"
x_months:
one: "1 month ago"
one: "%{count} month ago"
other: "%{count} months ago"
about_x_years:
one: "about 1 year ago"
one: "about %{count} year ago"
other: "about %{count} years ago"
over_x_years:
one: "over 1 year ago"
one: "over %{count} year ago"
other: "over %{count} years ago"
almost_x_years:
one: "almost 1 year ago"
one: "almost %{count} year ago"
other: "almost %{count} years ago"
password_reset:
@ -2138,47 +2138,47 @@ en:
topic_statuses:
autoclosed_message_max_posts:
one: "This message was automatically closed after reaching the maximum limit of 1 reply."
one: "This message was automatically closed after reaching the maximum limit of %{count} reply."
other: "This message was automatically closed after reaching the maximum limit of %{count} replies."
autoclosed_topic_max_posts:
one: "This topic was automatically closed after reaching the maximum limit of 1 reply."
one: "This topic was automatically closed after reaching the maximum limit of %{count} reply."
other: "This topic was automatically closed after reaching the maximum limit of %{count} replies."
autoclosed_enabled_days:
one: "This topic was automatically closed after 1 day. New replies are no longer allowed."
one: "This topic was automatically closed after %{count} day. New replies are no longer allowed."
other: "This topic was automatically closed after %{count} days. New replies are no longer allowed."
autoclosed_enabled_hours:
one: "This topic was automatically closed after 1 hour. New replies are no longer allowed."
one: "This topic was automatically closed after %{count} hour. New replies are no longer allowed."
other: "This topic was automatically closed after %{count} hours. New replies are no longer allowed."
autoclosed_enabled_minutes:
one: "This topic was automatically closed after 1 minute. New replies are no longer allowed."
one: "This topic was automatically closed after %{count} minute. New replies are no longer allowed."
other: "This topic was automatically closed after %{count} minutes. New replies are no longer allowed."
autoclosed_enabled_lastpost_days:
one: "This topic was automatically closed 1 day after the last reply. New replies are no longer allowed."
one: "This topic was automatically closed %{count} day after the last reply. New replies are no longer allowed."
other: "This topic was automatically closed %{count} days after the last reply. New replies are no longer allowed."
autoclosed_enabled_lastpost_hours:
one: "This topic was automatically closed 1 hour after the last reply. New replies are no longer allowed."
one: "This topic was automatically closed %{count} hour after the last reply. New replies are no longer allowed."
other: "This topic was automatically closed %{count} hours after the last reply. New replies are no longer allowed."
autoclosed_enabled_lastpost_minutes:
one: "This topic was automatically closed 1 minute after the last reply. New replies are no longer allowed."
one: "This topic was automatically closed %{count} minute after the last reply. New replies are no longer allowed."
other: "This topic was automatically closed %{count} minutes after the last reply. New replies are no longer allowed."
autoclosed_disabled_days:
one: "This topic was automatically opened after 1 day."
one: "This topic was automatically opened after %{count} day."
other: "This topic was automatically opened after %{count} days."
autoclosed_disabled_hours:
one: "This topic was automatically opened after 1 hour."
one: "This topic was automatically opened after %{count} hour."
other: "This topic was automatically opened after %{count} hours."
autoclosed_disabled_minutes:
one: "This topic was automatically opened after 1 minute."
one: "This topic was automatically opened after %{count} minute."
other: "This topic was automatically opened after %{count} minutes."
autoclosed_disabled_lastpost_days:
one: "This topic was automatically opened 1 day after the last reply."
one: "This topic was automatically opened %{count} day after the last reply."
other: "This topic was automatically opened %{count} days after the last reply."
autoclosed_disabled_lastpost_hours:
one: "This topic was automatically opened 1 hour after the last reply."
one: "This topic was automatically opened %{count} hour after the last reply."
other: "This topic was automatically opened %{count} hours after the last reply."
autoclosed_disabled_lastpost_minutes:
one: "This topic was automatically opened 1 minute after the last reply."
one: "This topic was automatically opened %{count} minute after the last reply."
other: "This topic was automatically opened %{count} minutes after the last reply."
autoclosed_disabled: "This topic is now opened. New replies are allowed."
@ -2259,10 +2259,10 @@ en:
reviewables_reminder:
submitted:
one: "Items were submitted over 1 hour ago. [Please review them](%{base_path}/review)."
one: "Items were submitted over %{count} hour ago. [Please review them](%{base_path}/review)."
other: "Items were submitted over %{count} hours ago. [Please review them](%{base_path}/review)."
subject_template:
one: "1 item needs to be reviewed"
one: "%{count} item needs to be reviewed"
other: "%{count} items need to be reviewed"
unsubscribe_mailer:
@ -2473,7 +2473,7 @@ en:
ignored_and_deleted: "Thanks for letting us know. We've removed the post."
temporarily_closed_due_to_flags:
one: "This topic is temporarily closed for at least 1 hour due to a large number of community flags."
one: "This topic is temporarily closed for at least %{count} hour due to a large number of community flags."
other: "This topic is temporarily closed for at least %{count} hours due to a large number of community flags."
system_messages:
@ -2974,7 +2974,7 @@ en:
pending_users_reminder:
title: "Pending Users Reminder"
subject_template:
one: "1 user waiting for approval"
one: "%{count} user waiting for approval"
other: "%{count} users waiting for approval"
text_body_template: |
There are new user signups waiting to be approved (or rejected) before they can access this forum.
@ -3007,7 +3007,7 @@ en:
queued_posts_reminder:
title: "Queued Posts Reminder"
subject_template:
one: "1 post waiting to be reviewed"
one: "%{count} post waiting to be reviewed"
other: "%{count} posts waiting to be reviewed"
text_body_template: |
Hello,
@ -3032,7 +3032,7 @@ en:
user_notifications:
previous_discussion: "Previous Replies"
reached_limit:
one: "Heads up: We send a maximum of 1 daily email. Check the site to see the ones that might be held back."
one: "Heads up: We send a maximum of %{count} daily email. Check the site to see the ones that might be held back."
other: "Heads up: We send a maximum of %{count} daily emails. Check the site to see the ones that might be held back. PS thanks for being popular!"
in_reply_to: "In Reply To"
unsubscribe:

View File

@ -39,13 +39,13 @@ en:
multiple:
help:
at_least_min_options:
one: "Choose at least <strong>1</strong> option"
one: "Choose at least <strong>%{count}</strong> option"
other: "Choose at least <strong>%{count}</strong> options"
up_to_max_options:
one: "Choose up to <strong>1</strong> option"
one: "Choose up to <strong>%{count}</strong> option"
other: "Choose up to <strong>%{count}</strong> options"
x_options:
one: "Choose <strong>1</strong> option"
one: "Choose <strong>%{count}</strong> option"
other: "Choose <strong>%{count}</strong> options"
between_min_and_max_options: "Choose between <strong>%{min}</strong> and <strong>%{max}</strong> options"

View File

@ -31,10 +31,10 @@ en:
named_poll_must_have_at_least_2_options: "Poll named <strong>%{name}</strong> must have at least 2 options."
default_poll_must_have_less_options:
one: "Poll must have less than 1 option."
one: "Poll must have less than %{count} option."
other: "Poll must have less than %{count} options."
named_poll_must_have_less_options:
one: "Poll named <strong>%{name}</strong> must have less than 1 option."
one: "Poll named <strong>%{name}</strong> must have less than %{count} option."
other: "Poll named <strong>%{name}</strong> must have less than %{count} options."
default_poll_must_have_different_options: "Poll must have different options."

View File

@ -8,6 +8,7 @@ def extract_locale(path)
end
PLURALIZATION_KEYS ||= ['zero', 'one', 'two', 'few', 'many', 'other']
ENGLISH_KEYS ||= ['one', 'other']
def find_pluralizations(hash, parent_key = '', pluralizations = Hash.new)
hash.each do |key, value|
@ -107,11 +108,33 @@ describe "i18n integrity checks" do
expect(english_duplicates).to be_empty
end
context "pluralizations" do
wrong_keys = []
invald_one_keys = []
find_pluralizations(english_yaml).each do |key, hash|
next if key["messages.restrict_dependent_destroy"]
it "has valid pluralizations for '#{key}'" do
expect(hash.keys).to contain_exactly("one", "other")
wrong_keys << key if hash.keys.sort != ENGLISH_KEYS
if one_value = hash['one']
invald_one_keys << key if one_value.include?('1') && !one_value.match?(/%{count}|{{count}}/)
end
end
it "has valid pluralizations keys" do
keys = wrong_keys.join("\n")
expect(wrong_keys).to be_empty, <<~MSG
Pluralized strings must have only the sub-keys 'one' and 'other'.
The following keys have missing or additional keys:\n\n#{keys}
MSG
end
it "should use %{count} instead of 1 in 'one' keys" do
keys = invald_one_keys.join(".one\n")
expect(invald_one_keys).to be_empty, <<~MSG
The following keys contain the number 1 instead of the interpolation key %{count}:\n\n#{keys}
MSG
end
end